天天看點

QT随機放1個1和七個2_Qt編寫資料導出到Excel及Pdf和列印資料一、前言二、功能特點三、效果圖四、使用方法

一、前言

用Qt開發已經九年了,期間用Qt做過不少的項目,在各種項目中有個功能很常用,尤其是涉及到資料記錄存儲的項目,那就是需要對查詢的資料進行導出到Excel,或者導出到Pdf檔案,或者直接列印查詢的資料,其中導出資料到Excel最常見,基本上有三種方法。

方法一使用QAxObject,小資料量還可以,資料量一大直接懵逼,性能指數級下降,而且不支援跨平台,隻能在WIN上玩一玩,對于大量的linux開發者來說,直接廢了。

方法二使用第三方開源的QtXlsx,這個做的還是可以,使用人群也比較多,據說不依賴office元件跨平台的,缺點就是不支援xls格式,隻支援高版本的xlsx,使用稍微比較繁瑣,使用者更多的需要的是直接一個函數傳入對應的資料即可,越簡單越好。

方法三使用csv格式作為導出資料,純文字的資料存儲格式,預設逗号作為分隔符,也可以指定其他符号作為分隔符,csv格式也是各種表格軟體都支援的格式,相當輕便,作為各大系統或者平台和程式設計語言之間互動資料還是非常友善的,很多工業控制領域的軟體都會采用這種格式,缺點就是太簡單了,不能分組或者指定過濾條件特殊顔色顯示等。

在對比了三種方式以後,決定自己造個輪子,主要是為了自身項目的需要寫的,後面慢慢的客戶需求多了,增加了通用常用場景的資料導出需求,目标要求至少包含三點:速度夠快、使用夠簡潔、不依賴任何元件。

二、功能特點

1. 原創導出資料機制,不依賴任何office元件或者作業系統等第三方庫,尤其是支援嵌入式linux。

2. 10萬行資料9個字段隻需要2秒鐘完成。

3. 隻需要四個步驟即可開始急速導出大量資料到Excel。

4. 同時提供直接寫入資料接口和多線程寫入資料接口,不卡主界面。

5. 可設定标題、副标題、表名。

6. 可設定字段名稱、列寬度。

7. 可設定是否啟用校驗過濾資料、校驗的列、校驗規則、校驗值,符合規則的特殊顔色顯示。

8. 可設定随機背景顔色及需要随機背景色的列集合。

9. 支援分組輸出資料,比如按照裝置分組輸出資料,友善檢視。

10. 可自定義行内容分隔符。

11. 可追加資料形式寫入資料,建議每次追加的資料小于10000條。

12. 靈活性超高,可自由更改源碼設定對齊方式、文字顔色、背景顔色等。

13. 支援任意excel表格軟體,包括但不限于excel2003/2007/2010/2013/2017/wps/openoffice等。

14. 除了提供導出到Excel類以外,還提供導出到Pdf檔案以及列印資料的類。

15. 注釋完善,詳細完整的使用demo,支援QTableWidget、QTableView、資料庫三種資料源。

16. 純Qt編寫,支援任意Qt版本+任意編譯器+任意系統。

三、效果圖

QT随機放1個1和七個2_Qt編寫資料導出到Excel及Pdf和列印資料一、前言二、功能特點三、效果圖四、使用方法

四、使用方法

//第一步:設定檔案路徑,标題等資訊;QList columnNames;QList 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();
           

繼續閱讀