Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)csv文件轉(zhuǎn)xls
一、前言
最近又多了個(gè)需求就是將csv格式的文件轉(zhuǎn)xls,需求一個(gè)接著一個(gè),還好都是真實(shí)的需求,而且都是有用的需求,并不是不靠譜的需求,不靠譜的需求就比如程序自動(dòng)識(shí)別手機(jī)殼顏色自動(dòng)換背景顏色或者邊框顏色色系。csv轉(zhuǎn)xls,因?yàn)楹芏嘬浖蛘呔W(wǎng)頁(yè)為了跨平臺(tái)做了極致簡(jiǎn)單的導(dǎo)出數(shù)據(jù)形式,那就是csv格式的文本數(shù)據(jù),有些用戶覺(jué)得這種格式用電子表格軟件打開(kāi)后,格式顯得很擁擠不好看,所以需要自己的程序能夠提供靜態(tài)函數(shù)直接進(jìn)行轉(zhuǎn)換,里面有多少個(gè)字段,轉(zhuǎn)成xls數(shù)據(jù)后也多少個(gè)字段,有多少行內(nèi)容也就多少行內(nèi)容,這樣打開(kāi)后就是標(biāo)準(zhǔn)的xls文件,帶有一定格式。
之前封裝的通用導(dǎo)出函數(shù)就支持直接傳入數(shù)據(jù)集合和字段集合導(dǎo)出,所以這個(gè)需求的難點(diǎn)及主要工作量就是讀取csv文件,取出字段集合和內(nèi)容集合,最后賦值給數(shù)據(jù)導(dǎo)出結(jié)構(gòu)體即可。如果是標(biāo)準(zhǔn)的csv文件,那還是很容易讀取的,搞個(gè)QFile搭配QTextStream以文本流的形式一行行readLine讀取,理想很好顯示很打臉,自己按照標(biāo)準(zhǔn)csv要求導(dǎo)出的文件可以正常轉(zhuǎn)換,而用戶第三方軟件導(dǎo)出的csv格式的文件死活無(wú)法ok,用記事本打開(kāi)一看,居然是bom格式,而且里面穿插了非常多的無(wú)效空格以及不可見(jiàn)字符\x200B,bom字節(jié)也好,不可見(jiàn)字符也好,用普通的QString是打印不出來(lái)的,必須轉(zhuǎn)成QByteArray然后再轉(zhuǎn)成16進(jìn)制字符串就能看到,bom是文本最開(kāi)始前面三個(gè)固定字節(jié)0xEF、0xBB、0xBF,只要讀取到文件前面存在這三個(gè)字節(jié)就說(shuō)明是帶bom的文件。
格式搞明白了,代碼自然就出來(lái)了,通過(guò)readLine拿到數(shù)據(jù)后,傳入正則表達(dá)式調(diào)用remove方法移除不可見(jiàn)字符,這樣剩下的就是可見(jiàn)字符,然后判斷當(dāng)前是否讀取的是第一行,是第一行則數(shù)據(jù)分割后傳入列名字段名稱集合中,其余都是一行行數(shù)據(jù),按照要求的分隔符傳入隊(duì)列即可,最后一次性調(diào)用靜態(tài)數(shù)據(jù)導(dǎo)出函數(shù)打完收工,完美!總結(jié):遇到困難要迎難而上,只要功夫深,一定能找到問(wèn)題所在,尤其是代碼寫的多了以后,遇到問(wèn)題會(huì)有多種甚至幾十種解決辦法。
二、功能特點(diǎn)
- 組件同時(shí)集成了導(dǎo)出數(shù)據(jù)到csv、xls、pdf和打印數(shù)據(jù)。
- 所有操作全部提供靜態(tài)方法無(wú)需new,數(shù)據(jù)和屬性等各種參數(shù)設(shè)置采用結(jié)構(gòu)體數(shù)據(jù),極為方便。
- 同時(shí)支持QTableView、QTableWidget、QStandardItemModel、QSqlTableModel等數(shù)據(jù)源。
- 提供靜態(tài)方法直接傳入QTableView、QTableWidget控件,自動(dòng)識(shí)別列名、列寬和數(shù)據(jù)內(nèi)容。
- 每組功能都提供單獨(dú)的完整的示例,注釋詳細(xì),非常適合各階段Qter程序員。
- 原創(chuàng)導(dǎo)出數(shù)據(jù)機(jī)制,不依賴任何office組件或者操作系統(tǒng)等第三方庫(kù),支持嵌入式linux。
- 速度超快,9個(gè)字段10萬(wàn)行數(shù)據(jù)只需要2秒鐘完成。
- 只需要四個(gè)步驟即可開(kāi)始急速導(dǎo)出海量數(shù)據(jù)比如100W條記錄到Excel。
- 同時(shí)提供直接寫入數(shù)據(jù)接口和多線程寫入數(shù)據(jù)接口,不卡主界面。
- 可設(shè)置標(biāo)題、副標(biāo)題、表名。
- 可設(shè)置導(dǎo)出數(shù)據(jù)的字段名、列名、列寬。
- 可設(shè)置末尾列自動(dòng)拉伸填充,默認(rèn)拉伸更美觀。
- 可設(shè)置是否啟用校驗(yàn)過(guò)濾數(shù)據(jù),啟用后符合規(guī)則的數(shù)據(jù)特殊顏色顯示。
- 可指定校驗(yàn)的列、校驗(yàn)規(guī)則、校驗(yàn)值、校驗(yàn)值數(shù)據(jù)類型。
- 校驗(yàn)規(guī)則支持 精確等于==、大于>、大于等于>=、小于<、小于等于<=、不等于!=、包含contains。
- 校驗(yàn)值數(shù)據(jù)類型支持 整型int、浮點(diǎn)型float、雙精度型double,默認(rèn)文本字符串類型。
- 可設(shè)置隨機(jī)背景顏色及需要隨機(jī)背景色的列集合。
- 支持分組輸出數(shù)據(jù),比如按照設(shè)備分組輸出數(shù)據(jù),方便查看。
- 可設(shè)置csv分隔符、行內(nèi)容分隔符、子內(nèi)容分隔符。
- 可設(shè)置邊框?qū)挾取⒆詣?dòng)填數(shù)據(jù)類型,默認(rèn)自動(dòng)數(shù)據(jù)類型開(kāi)啟。
- 可設(shè)置是否開(kāi)啟數(shù)據(jù)單元格樣式,默認(rèn)不開(kāi)啟,不開(kāi)啟可以節(jié)約大概30%的文件體積。
- 可設(shè)置橫向排版、紙張邊距等,比如導(dǎo)出到pdf以及打印數(shù)據(jù)。
- 提供圖文混排導(dǎo)出數(shù)據(jù)到pdf以及打印示例,自動(dòng)分頁(yè),支持多圖。
- 提供一個(gè)打印樣板中同時(shí)包括橫向縱向排版示例。
- 提供靜態(tài)函數(shù)將控件截圖導(dǎo)出到pdf文件。
- 提供靜態(tài)函數(shù)將圖片轉(zhuǎn)成pdf文件。
- 提供靜態(tài)函數(shù)將csv文件轉(zhuǎn)成xls文件,支持列寬表名等參數(shù)設(shè)置。
- 針對(duì)每列可分別設(shè)置字段對(duì)齊樣式、內(nèi)容對(duì)齊樣式,包括左對(duì)齊、居中對(duì)齊、右對(duì)齊。
- 靈活性超高,可自由更改源碼設(shè)置對(duì)齊方式、文字顏色、背景顏色等。
- 支持任意excel表格軟件,包括但不限于excel2003-2021、wps、openoffice等。
- 純Qt編寫,支持任意Qt版本+任意編譯器+任意系統(tǒng)。
三、體驗(yàn)地址
體驗(yàn)地址:https://pan.baidu.com/s/1eeL5MTz0rifwtVLegRpkoQ 提取碼:erxm 文件名:bin_dataout.zip
國(guó)內(nèi)站點(diǎn):https://gitee.com/feiyangqingyun
國(guó)際站點(diǎn):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; } //刪除特殊字符,這個(gè)字符會(huì)導(dǎo)致讀取不到內(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è)置過(guò)則取設(shè)置好的 if (dataContent.columnWidths.count() > i) { columnWidths << dataContent.columnWidths.at(i); } else { columnWidths << 70; } } continue; } QString separator = dataContent.separator; //每行數(shù)據(jù)作為一個(gè)整體字符串帶分割符 ; 存入 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ù)導(dǎo)出 DataXls::saveXls(dataContent); } return fileName; }
到此這篇關(guān)于Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)csv文件轉(zhuǎn)xls的文章就介紹到這了,更多相關(guān)Qt csv轉(zhuǎn)xls內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)圖片轉(zhuǎn)pdf
- Qt數(shù)據(jù)庫(kù)應(yīng)用之通用數(shù)據(jù)庫(kù)同步
- Qt數(shù)據(jù)庫(kù)應(yīng)用之超級(jí)自定義委托
- Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)通用數(shù)據(jù)庫(kù)分頁(yè)
- Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)數(shù)據(jù)圖文混排
- Qt數(shù)據(jù)庫(kù)應(yīng)用之?dāng)?shù)據(jù)打印到pdf
相關(guān)文章
如何通過(guò)函數(shù)指針調(diào)用函數(shù)(實(shí)現(xiàn)代碼)
指針可以不但可以指向一個(gè)整形,浮點(diǎn)型,字符型,字符串型的變量,也可以指向相應(yīng)的數(shù)組,而且還可以指向一個(gè)函數(shù)2013-09-09C++實(shí)踐Time類中的運(yùn)算符重載參考方法
今天小編就為大家分享一篇關(guān)于C++實(shí)踐Time類中的運(yùn)算符重載參考方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02如何使用visual studio2019創(chuàng)建簡(jiǎn)單的MFC窗口(使用C++)
這篇文章主要介紹了如何使用visual studio2019創(chuàng)建簡(jiǎn)單的MFC窗口(使用C++),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03C語(yǔ)言實(shí)現(xiàn)模擬USB對(duì)8bit數(shù)據(jù)的NRZI編碼輸出
今天小編就為大家分享一篇關(guān)于C語(yǔ)言實(shí)現(xiàn)模擬USB對(duì)8bit數(shù)據(jù)的NRZI編碼輸出,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12