一、前言
用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()->stop();