Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)csv文件轉(zhuǎn)xls
一、前言
最近又多了個需求就是將csv格式的文件轉(zhuǎn)xls,需求一個接著一個,還好都是真實的需求,而且都是有用的需求,并不是不靠譜的需求,不靠譜的需求就比如程序自動識別手機殼顏色自動換背景顏色或者邊框顏色色系。csv轉(zhuǎn)xls,因為很多軟件或者網(wǎng)頁為了跨平臺做了極致簡單的導出數(shù)據(jù)形式,那就是csv格式的文本數(shù)據(jù),有些用戶覺得這種格式用電子表格軟件打開后,格式顯得很擁擠不好看,所以需要自己的程序能夠提供靜態(tài)函數(shù)直接進行轉(zhuǎn)換,里面有多少個字段,轉(zhuǎn)成xls數(shù)據(jù)后也多少個字段,有多少行內(nèi)容也就多少行內(nèi)容,這樣打開后就是標準的xls文件,帶有一定格式。
之前封裝的通用導出函數(shù)就支持直接傳入數(shù)據(jù)集合和字段集合導出,所以這個需求的難點及主要工作量就是讀取csv文件,取出字段集合和內(nèi)容集合,最后賦值給數(shù)據(jù)導出結(jié)構(gòu)體即可。如果是標準的csv文件,那還是很容易讀取的,搞個QFile搭配QTextStream以文本流的形式一行行readLine讀取,理想很好顯示很打臉,自己按照標準csv要求導出的文件可以正常轉(zhuǎn)換,而用戶第三方軟件導出的csv格式的文件死活無法ok,用記事本打開一看,居然是bom格式,而且里面穿插了非常多的無效空格以及不可見字符\x200B,bom字節(jié)也好,不可見字符也好,用普通的QString是打印不出來的,必須轉(zhuǎn)成QByteArray然后再轉(zhuǎn)成16進制字符串就能看到,bom是文本最開始前面三個固定字節(jié)0xEF、0xBB、0xBF,只要讀取到文件前面存在這三個字節(jié)就說明是帶bom的文件。
格式搞明白了,代碼自然就出來了,通過readLine拿到數(shù)據(jù)后,傳入正則表達式調(diào)用remove方法移除不可見字符,這樣剩下的就是可見字符,然后判斷當前是否讀取的是第一行,是第一行則數(shù)據(jù)分割后傳入列名字段名稱集合中,其余都是一行行數(shù)據(jù),按照要求的分隔符傳入隊列即可,最后一次性調(diào)用靜態(tài)數(shù)據(jù)導出函數(shù)打完收工,完美!總結(jié):遇到困難要迎難而上,只要功夫深,一定能找到問題所在,尤其是代碼寫的多了以后,遇到問題會有多種甚至幾十種解決辦法。
二、功能特點
- 組件同時集成了導出數(shù)據(jù)到csv、xls、pdf和打印數(shù)據(jù)。
- 所有操作全部提供靜態(tài)方法無需new,數(shù)據(jù)和屬性等各種參數(shù)設(shè)置采用結(jié)構(gòu)體數(shù)據(jù),極為方便。
- 同時支持QTableView、QTableWidget、QStandardItemModel、QSqlTableModel等數(shù)據(jù)源。
- 提供靜態(tài)方法直接傳入QTableView、QTableWidget控件,自動識別列名、列寬和數(shù)據(jù)內(nèi)容。
- 每組功能都提供單獨的完整的示例,注釋詳細,非常適合各階段Qter程序員。
- 原創(chuàng)導出數(shù)據(jù)機制,不依賴任何office組件或者操作系統(tǒng)等第三方庫,支持嵌入式linux。
- 速度超快,9個字段10萬行數(shù)據(jù)只需要2秒鐘完成。
- 只需要四個步驟即可開始急速導出海量數(shù)據(jù)比如100W條記錄到Excel。
- 同時提供直接寫入數(shù)據(jù)接口和多線程寫入數(shù)據(jù)接口,不卡主界面。
- 可設(shè)置標題、副標題、表名。
- 可設(shè)置導出數(shù)據(jù)的字段名、列名、列寬。
- 可設(shè)置末尾列自動拉伸填充,默認拉伸更美觀。
- 可設(shè)置是否啟用校驗過濾數(shù)據(jù),啟用后符合規(guī)則的數(shù)據(jù)特殊顏色顯示。
- 可指定校驗的列、校驗規(guī)則、校驗值、校驗值數(shù)據(jù)類型。
- 校驗規(guī)則支持 精確等于==、大于>、大于等于>=、小于<、小于等于<=、不等于!=、包含contains。
- 校驗值數(shù)據(jù)類型支持 整型int、浮點型float、雙精度型double,默認文本字符串類型。
- 可設(shè)置隨機背景顏色及需要隨機背景色的列集合。
- 支持分組輸出數(shù)據(jù),比如按照設(shè)備分組輸出數(shù)據(jù),方便查看。
- 可設(shè)置csv分隔符、行內(nèi)容分隔符、子內(nèi)容分隔符。
- 可設(shè)置邊框?qū)挾?、自動填?shù)據(jù)類型,默認自動數(shù)據(jù)類型開啟。
- 可設(shè)置是否開啟數(shù)據(jù)單元格樣式,默認不開啟,不開啟可以節(jié)約大概30%的文件體積。
- 可設(shè)置橫向排版、紙張邊距等,比如導出到pdf以及打印數(shù)據(jù)。
- 提供圖文混排導出數(shù)據(jù)到pdf以及打印示例,自動分頁,支持多圖。
- 提供一個打印樣板中同時包括橫向縱向排版示例。
- 提供靜態(tài)函數(shù)將控件截圖導出到pdf文件。
- 提供靜態(tài)函數(shù)將圖片轉(zhuǎn)成pdf文件。
- 提供靜態(tài)函數(shù)將csv文件轉(zhuǎn)成xls文件,支持列寬表名等參數(shù)設(shè)置。
- 針對每列可分別設(shè)置字段對齊樣式、內(nèi)容對齊樣式,包括左對齊、居中對齊、右對齊。
- 靈活性超高,可自由更改源碼設(shè)置對齊方式、文字顏色、背景顏色等。
- 支持任意excel表格軟件,包括但不限于excel2003-2021、wps、openoffice等。
- 純Qt編寫,支持任意Qt版本+任意編譯器+任意系統(tǒng)。
三、體驗地址
體驗地址:https://pan.baidu.com/s/1eeL5MTz0rifwtVLegRpkoQ 提取碼:erxm 文件名:bin_dataout.zip
國內(nèi)站點:https://gitee.com/feiyangqingyun
國際站點:https://github.com/feiyangqingyun
四、效果圖

五、相關(guān)代碼
QString DataOther::csvToXls(DataContent &dataContent, const QString &csvFile, const QString &xlsFile, bool quatation, const QString &spliter)
{
//為空則同名文件
QString fileName = xlsFile;
if (fileName.isEmpty()) {
fileName = csvFile;
fileName.replace("." + QFileInfo(csvFile).suffix(), ".xls");
}
//內(nèi)容集合
QStringList content;
//字段名稱
QList<QString> columnNames;
//字段寬度
QList<int> columnWidths;
//讀取csv文件的內(nèi)容
QFile file(csvFile);
if (file.open(QIODevice::ReadOnly | QFile::Text)) {
//采用文件流的形式讀取速度最快
QTextStream stream(&file);
DataCsv::initTextStream(csvFile, &stream);
stream.seek(0);
//循環(huán)讀取文件
int row = 0;
while (!stream.atEnd()) {
QString line = stream.readLine();
if (line.isEmpty()) {
continue;
}
//刪除特殊字符,這個字符會導致讀取不到內(nèi)容TNND
QString pattern = "[\\x200B]";
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
line.remove(QRegularExpression(pattern));
#else
line.remove(QRegExp(pattern));
#endif
row++;
QStringList list = line.split(spliter);
//第一行是字段
if (row == 1) {
int count = list.count();
for (int i = 0; i < count; ++i) {
//去掉空字段名
QString columnName = list.at(i);
if (columnName.isEmpty()) {
continue;
}
columnNames << columnName;
//設(shè)置過則取設(shè)置好的
if (dataContent.columnWidths.count() > i) {
columnWidths << dataContent.columnWidths.at(i);
} else {
columnWidths << 70;
}
}
continue;
}
QString separator = dataContent.separator;
//每行數(shù)據(jù)作為一個整體字符串帶分割符 ; 存入
content << list.join(separator);
}
}
if (content.count() > 0) {
//填充內(nèi)容
dataContent.content = content;
//設(shè)置列名列寬
dataContent.columnNames = columnNames;
dataContent.columnWidths = columnWidths;
//設(shè)置文件名
dataContent.fileName = fileName;
//調(diào)用靜態(tài)函數(shù)導出
DataXls::saveXls(dataContent);
}
return fileName;
}
到此這篇關(guān)于Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)csv文件轉(zhuǎn)xls的文章就介紹到這了,更多相關(guān)Qt csv轉(zhuǎn)xls內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何通過函數(shù)指針調(diào)用函數(shù)(實現(xiàn)代碼)
指針可以不但可以指向一個整形,浮點型,字符型,字符串型的變量,也可以指向相應(yīng)的數(shù)組,而且還可以指向一個函數(shù)2013-09-09
如何使用visual studio2019創(chuàng)建簡單的MFC窗口(使用C++)
這篇文章主要介紹了如何使用visual studio2019創(chuàng)建簡單的MFC窗口(使用C++),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03
C語言實現(xiàn)模擬USB對8bit數(shù)據(jù)的NRZI編碼輸出
今天小編就為大家分享一篇關(guān)于C語言實現(xiàn)模擬USB對8bit數(shù)據(jù)的NRZI編碼輸出,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12

