Qt資料庫應用2-資料匯出到xls

2022-01-12 14:00:02

一、前言

匯入匯出資料到csv由於語法簡單,適用場景有限,於是乎還是必須再造一個輪子匯出資料到xls,在經歷過數十年的專案實戰經驗中不斷調整和優化。尤其記得當初第一個版本v0.01大概在2011年左右完成的,當時是公司專案執行在嵌入式板子上,需要匯出警情記錄,拷貝到電腦上列印,由於嵌入式根本沒有也不可能去安裝excel等軟體,硬著頭皮去研究了xml格式的xls檔案,按照那個規則組合成簡單的匯出資料,這個思路想法理論上比QtXlsx要早,我也是後面大概在2015年後才發現有QtXlsx這個開源的輪子,而且思路不謀而合,都是採用xml格式的資料。QtXlsx主打各種格式資料單元格做成一個完成的通用的元件等,而我這個輪子更傾向於具體應用場景,直接面對傻瓜使用者,傳入表名、欄位集合幾個簡單的資訊(現在直接放到了結構體資料),就能直接刷刷的匯出資料,甚至簡單到現在支援直接傳入QTableWidget、QTableView控制元件就行,不要太簡單爽歪歪。

結構體支援的引數:

  • 檔名稱
  • 表名
  • 主標題
  • 副標題
  • 子標題1
  • 子標題2
  • 欄位名稱集合
  • 欄位寬度集合
  • 內容集合
  • 行內容分隔符
  • 子內容分隔符
  • 邊框寬度
  • 自動填資料型別 預設開啟
  • 資料單元格樣式 預設不開啟 不開啟可以節約大概30%的檔案體積
  • 隨機顏色
  • 隨機顏色列索引集合
  • 校驗列
  • 校驗型別
  • 校驗值
  • 檢驗顏色

二、功能特點

  1. 元件同時整合了匯出資料到csv、xls、pdf和列印資料。
  2. 所有操作全部提供靜態方法無需new,資料和屬性等各種引數設定採用結構體資料,極為方便。
  3. 同時支援QTableView、QTableWidget、QStandardItemModel、QSqlTableModel等資料來源。
  4. 提供靜態方法直接傳入QTableView、QTableWidget控制元件,自動識別列名、列寬和資料內容。
  5. 每組功能都提供單獨的完整的範例,註釋詳細,非常適合各階段Qter程式設計師。
  6. 原創匯出資料機制,不依賴任何office元件或者作業系統等第三方庫,支援嵌入式linux。
  7. 速度超快,9個欄位10萬行資料只需要2秒鐘完成。
  8. 只需要四個步驟即可開始急速匯出海量資料比如100W條記錄到Excel。
  9. 同時提供直接寫入資料介面和多執行緒寫入資料介面,不卡主介面。
  10. 可設定標題、副標題、表名。
  11. 可設定匯出資料的欄位名、列名、列寬。
  12. 可設定末尾列自動拉伸填充,預設拉伸更美觀。
  13. 可設定是否啟用校驗過濾資料,啟用後符合規則的資料特殊顏色顯示。
  14. 可指定校驗的列、校驗規則、校驗值、校驗值資料型別。
  15. 校驗規則支援 精確等於==、大於>、大於等於>=、小於<、小於等於<=、不等於!=、包含contains。
  16. 校驗值資料型別支援 整型int、浮點型float、雙精度型double,預設文字字串型別。
  17. 可設定隨機背景顏色及需要隨機背景色的列集合。
  18. 支援分組輸出資料,比如按照裝置分組輸出資料,方便檢視。
  19. 可設定csv分隔符、行內容分隔符、子內容分隔符。
  20. 可設定邊框寬度、自動填資料型別,預設自動資料型別開啟。
  21. 可設定是否開啟資料單元格樣式,預設不開啟,不開啟可以節約大概30%的檔案體積。
  22. 可設定橫向排版、紙張邊距等,比如匯出到pdf以及列印資料。
  23. 支援圖文混排匯出資料到pdf以及列印資料,自動分頁。
  24. 靈活性超高,可自由更改原始碼設定對齊方式、文字顏色、背景顏色等。
  25. 支援任意excel表格軟體,包括但不限於excel2003-2021、wps、openoffice等。
  26. 純Qt編寫,支援任意Qt版本+任意編譯器+任意系統。

三、體驗地址

  1. 體驗地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取碼:o05q 檔名:bin_dataout.zip
  2. 國內站點:https://gitee.com/feiyangqingyun
  3. 國際站點:https://github.com/feiyangqingyun
  4. 個人主頁:https://blog.csdn.net/feiyangqingyun
  5. 知乎主頁:https://www.zhihu.com/people/feiyangqingyun/

四、效果圖

在這裡插入圖片描述

五、相關程式碼

QStringList frmDataOut2::getContent()
{
    QStringList content;
    QString sql = QString("select * from MsgInfo limit %1").arg(100);
    QSqlQuery query;
    if (!query.exec(sql)) {
        return content;
    }

    //迴圈遍歷資料
    while (query.next()) {
        QStringList list;
        for (int i = 0; i < column; i++) {
            list << query.value(i).toString();
        }
        content << list.join(";");
    }
    return content;
}

void frmSimple::on_btnXls_clicked()
{
    //設定結構體資料
    DataContent dataContent;
    //填充內容
    dataContent.content = getContent();
    //設定列名列寬
    dataContent.columnNames = columnNames;
    dataContent.columnWidths = columnWidths;
    //設定檔名
    dataContent.fileName = "d:/0.xls";
    //設定表名
    dataContent.sheetName = "測試資訊";

    //呼叫靜態函數儲存
    DataXls::saveXls(dataContent);
    //開啟剛才匯出的檔案
    QUIHelper::openFile(dataContent.fileName, "匯出測試資訊");
}