一、前言
爲了方便用戶學習使用本組件,特意針對每個功能模塊,每種可能的應用場景,都編寫了對應的示例demo,從初級示例到中級示例再到高級示例以及多線程示例等,層層加碼,針對結構體數據都做了相當詳細細緻的說明。
- 簡單示例用於演示最簡單的參數設置導出數據到csv、xls、pdf和打印數據,直接傳入的QTableView、QTableWidget控件。
- 導入導出用於演示導出導入csv格式的數據,數據源爲數據庫表,相當於將數據庫表信息導出到csv文件,導入的csv文件會更新對應數據庫數據。
- 初級示例用於演示最基礎的直接從數據庫數據導出到xls、pdf和打印數據,支持數據校驗、隨機背景、自動拉伸末尾列。
- 中級示例在初級示例上增加了子標題,同時校驗規則改成了對數值類型進行過濾突出顏色顯示。
- 高級示例用於演示分組導出數據,比如表中的某個設備的所有數據放一塊,每個分組帶有自定義信息內容用於展示統計的多條信息。
- 線程示例用於演示多線程導出數據到xls、pdf文件,可以指定行數列數,比如指定10個字段100W條數據,導出只用21s。
- 後期增加查詢示例用於演示根據用戶選擇的查詢條件對查詢出來的記錄進行導出到xls、pdf和打印數據。
- 圖文混排用於演示如何自定義圖文報表,導出到pdf及打印。
二、功能特點
- 組件同時集成了導出數據到csv、xls、pdf和打印數據。
- 所有操作全部提供靜態方法無需new,數據和屬性等各種參數設置採用結構體數據,極爲方便。
- 同時支持QTableView、QTableWidget、QStandardItemModel、QSqlTableModel等數據源。
- 提供靜態方法直接傳入QTableView、QTableWidget控件,自動識別列名、列寬和數據內容。
- 每組功能都提供單獨的完整的示例,註釋詳細,非常適合各階段Qter程序員。
- 原創導出數據機制,不依賴任何office組件或者操作系統等第三方庫,支持嵌入式linux。
- 速度超快,9個字段10萬行數據只需要2秒鐘完成。
- 只需要四個步驟即可開始急速導出海量數據比如100W條記錄到Excel。
- 同時提供直接寫入數據接口和多線程寫入數據接口,不卡主界面。
- 可設置標題、副標題、表名。
- 可設置導出數據的字段名、列名、列寬。
- 可設置末尾列自動拉伸填充,默認拉伸更美觀。
- 可設置是否啓用校驗過濾數據,啓用後符合規則的數據特殊顏色顯示。
- 可指定校驗的列、校驗規則、校驗值、校驗值數據類型。
- 校驗規則支持 精確等於==、大於>、大於等於>=、小於<、小於等於<=、不等於!=、包含contains。
- 校驗值數據類型支持 整型int、浮點型float、雙精度型double,默認文本字符串類型。
- 可設置隨機背景顏色及需要隨機背景色的列集合。
- 支持分組輸出數據,比如按照設備分組輸出數據,方便查看。
- 可設置csv分隔符、行內容分隔符、子內容分隔符。
- 可設置邊框寬度、自動填數據類型,默認自動數據類型開啓。
- 可設置是否開啓數據單元格樣式,默認不開啓,不開啓可以節約大概30%的文件體積。
- 可設置橫向排版、紙張邊距等,比如導出到pdf以及打印數據。
- 支持圖文混排導出數據到pdf以及打印數據,自動分頁。
- 靈活性超高,可自由更改源碼設置對齊方式、文字顏色、背景顏色等。
- 支持任意excel表格軟件,包括但不限於excel2003-2021、wps、openoffice等。
- 純Qt編寫,支持任意Qt版本+任意編譯器+任意系統。
三、體驗地址
- 體驗地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取碼:o05q 文件名:bin_dataout.zip
- 國內站點:https://gitee.com/feiyangqingyun
- 國際站點:https://github.com/feiyangqingyun
- 個人主頁:https://blog.csdn.net/feiyangqingyun
- 知乎主頁:https://www.zhihu.com/people/feiyangqingyun/
四、效果圖
五、相關代碼
DataContent frmDataOut2::getDataContent(int maxCount)
{
DataContent dataContent;
dataContent.title = "所有短信記錄";
dataContent.subTitle = QString("%1 導出短信記錄").arg(DATETIME);
dataContent.columnNames = columnNames;
dataContent.columnWidths = columnWidths;
QStringList content;
getContent(maxCount, content);
dataContent.content = content;
//邊框粗細
dataContent.borderWidth = 1;
//導出到xls有樣式比如邊框需要開啓 cellStyle = true
//dataContent.cellStyle = true;
dataContent.randomColor = ui->ckRandomColor->isChecked();
//下面表示第6列 (對應表中的 類型 字段) 值 第3列重量 > 100 則突出顯示
dataContent.checkColumn = ui->ckCheckColumn->isChecked() ? 3 : -1;
dataContent.checkType = ">|double";
dataContent.checkValue = "100";
dataContent.stretchLast = ui->ckStretchLast->isChecked();
dataContent.landscape = true;
return dataContent;
}
void frmDataOut2::on_btnXls_clicked()
{
time.restart();
DataContent dataContent = getDataContent(AppConfig::CountXls);
dataContent.fileName = QUIHelper::appPath() + "/db/dataout2.xls";
dataContent.sheetName = "短信信息";
DataXls::saveXls(dataContent);
setInfo(1, qMin(rowCount, AppConfig::CountXls));
QUIHelper::openFile(dataContent.fileName, "導出短信信息");
}
void frmDataOut2::on_btnPdf_clicked()
{
time.restart();
DataContent dataContent = getDataContent(AppConfig::CountPdf);
dataContent.fileName = QUIHelper::appPath() + "/db/dataout2.pdf";
DataPrint::savePdf(dataContent);
setInfo(1, qMin(rowCount, AppConfig::CountPdf));
QUIHelper::openFile(dataContent.fileName, "導出短信信息");
}
void frmDataOut2::on_btnPrint_clicked()
{
DataContent dataContent = getDataContent(AppConfig::CountPrint);
DataPrint::print(dataContent);
}