Qt編寫資料匯出到Excel及Pdf和列印資料
阿新 • • 發佈:2019-09-18
一、前言
用Qt開發已經九年了,期間用Qt做過不少的專案,在各種專案中有個功能很常用,尤其是涉及到資料記錄儲存的專案,那就是需要對查詢的資料進行匯出到Excel,或者匯出到Pdf檔案,或者直接列印查詢的資料,其中匯出資料到Excel最常見,基本上有三種方法。
方法一使用QAxObject,小資料量還可以,資料量一大直接懵逼,效能指數級下降,而且不支援跨平臺,只能在WIN上玩一玩,對於大量的linux開發者來說,直接廢了。
方法二使用第三方開源的QtXlsx,這個做的還是可以,使用人群也比較多,據說不依賴office元件跨平臺的,缺點就是不支援xls格式,只支援高版本的xlsx,使用稍微比較繁瑣,使用者更多的需要的是直接一個函式傳入對應的資料即可,越簡單越好。
方法三使用csv格式作為匯出資料,純文字的資料儲存格式,預設逗號作為分隔符,也可以指定其他符號作為分隔符,csv格式也是各種表格軟體都支援的格式,相當輕便,作為各大系統或者平臺和程式語言之間互動資料還是非常方便的,很多工業控制領域的軟體都會採用這種格式,缺點就是太簡單了,不能分組或者指定過濾條件特殊顏色顯示等。
在對比了三種方式以後,決定自己造個輪子,主要是為了自身專案的需要寫的,後面慢慢的客戶需求多了,增加了通用常用場景的資料匯出需求,目標要求至少包含三點:速度夠快、使用夠簡潔、不依賴任何元件。
Demo示例地址: https://pan.baidu.com/s/1uQsDQO5E5crUBN2J-nPeLQ 提取碼:1jkp 名稱:bin_dataout.zip
二、功能特點
- 原創匯出資料機制,不依賴任何office元件或者作業系統等第三方庫,尤其是支援嵌入式linux。
- 10萬行資料9個欄位只需要2秒鐘完成。
- 只需要四個步驟即可開始急速匯出大量資料到Excel。
- 同時提供直接寫入資料介面和多執行緒寫入資料介面,不卡主介面。
- 可設定標題、副標題、表名。
- 可設定欄位名稱、列寬度。
- 可設定是否啟用校驗過濾資料、校驗的列、校驗規則、校驗值,符合規則的特殊顏色顯示。
- 可設定隨機背景顏色及需要隨機背景色的列集合。
- 支援分組輸出資料,比如按照裝置分組輸出資料,方便檢視。
- 可自定義行內容分隔符。
- 可追加資料形式寫入資料,建議每次追加的資料小於10000條。
- 靈活性超高,可自由更改原始碼設定對齊方式、文字顏色、背景顏色等。
- 支援任意excel表格軟體,包括但不限於excel2003/2007/2010/2013/2017/wps/openoffice等。
- 除了提供匯出到Excel類以外,還提供匯出到Pdf檔案以及列印資料的類。
- 註釋完善,詳細完整的使用demo,支援QTableWidget、QTableView、資料庫三種資料來源。
- 純Qt編寫,支援任意Qt版本+任意編譯器+任意系統。
三、效果圖
四、使用方法
//第一步:設定檔案路徑,標題等資訊;
QList<QString> columnNames;
QList<int> columnWidths;
columnNames << "防區號" << "防區名稱" << "告警型別" << "告警內容" << "告警時間";
columnWidths << 65 << 100 << 120 << 150 << 180;
QString file = qApp->applicationDirPath() + "/1.xls";
ExcelThread::Instance()->init();
ExcelThread::Instance()->setFileName(file);
ExcelThread::Instance()->setSheetName("告警資訊");
ExcelThread::Instance()->setTitle("所有告警資訊");
ExcelThread::Instance()->setSubTitle(QString("%1 匯出告警資訊").arg(DATETIME));
ExcelThread::Instance()->setColumnNames(columnNames);
ExcelThread::Instance()->setColumnWidths(columnWidths);
//第二步:開啟檔案,啟動執行緒;
ExcelThread::Instance()->open();
ExcelThread::Instance()->start();
//第三步:逐行輸入資料;
QStringList list;
list << "防區上線" << "防區離線" << "防區旁路" << "防區報警" << "防區故障";
for (int i = 0; i < logCount; i++) {
int index = qrand() % 4;
QStringList temp;
temp.append(QString::number(i + 1));
temp.append("防區" + QString::number(i + 1));
temp.append("主機上報");
temp.append(list.at(index));
temp.append(DATETIME);
ExcelThread::Instance()->appendContent(temp.join(";"));
}
//第四步:關閉檔案,關閉執行緒;
ExcelThread::Instance()->close();
ExcelThread::Instance()-