Qt編寫數據導出到Excel及Pdf和打印數據

1、前言

用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.ziplinux

2、功能特色

  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版本+任意編譯器+任意系統。

3、效果圖

4、使用方法

//第一步:設置文件路徑,標題等信息;
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();
相關文章
相關標籤/搜索