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