欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)csv文件轉(zhuǎn)xls

 更新時(shí)間:2022年06月06日 09:18:24   作者:feiyangqingyun  
這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)csv文件轉(zhuǎn)xls功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定參考價(jià)值,需要的可以了解一下

一、前言

最近又多了個(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言全局變量和局部變量的示例代碼

    C語(yǔ)言全局變量和局部變量的示例代碼

    本文主要介紹了C語(yǔ)言全局變量和局部變量的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 如何通過(guò)函數(shù)指針調(diào)用函數(shù)(實(shí)現(xiàn)代碼)

    如何通過(guò)函數(shù)指針調(diào)用函數(shù)(實(shí)現(xiàn)代碼)

    指針可以不但可以指向一個(gè)整形,浮點(diǎn)型,字符型,字符串型的變量,也可以指向相應(yīng)的數(shù)組,而且還可以指向一個(gè)函數(shù)
    2013-09-09
  • C++實(shí)踐Time類中的運(yùn)算符重載參考方法

    C++實(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++)

    這篇文章主要介紹了如何使用visual studio2019創(chuàng)建簡(jiǎn)單的MFC窗口(使用C++),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C語(yǔ)言實(shí)現(xiàn)模擬USB對(duì)8bit數(shù)據(jù)的NRZI編碼輸出

    C語(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
  • 基于Qt實(shí)現(xiàn)離線瓦片地圖下載器

    基于Qt實(shí)現(xiàn)離線瓦片地圖下載器

    這篇文章主要介紹了如何通過(guò)Qt實(shí)現(xiàn)離線瓦片地圖下載器,文中的示例代碼對(duì)我們學(xué)習(xí)或工作有一定的幫助,感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-01-01
  • C語(yǔ)言實(shí)現(xiàn)反彈球小游戲

    C語(yǔ)言實(shí)現(xiàn)反彈球小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)反彈球小游戲,利用函數(shù)寫的C語(yǔ)言小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C語(yǔ)言分治法實(shí)現(xiàn)歸并排序

    C語(yǔ)言分治法實(shí)現(xiàn)歸并排序

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)歸并排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • C++中點(diǎn)操作符和箭頭操作符的使用詳解

    C++中點(diǎn)操作符和箭頭操作符的使用詳解

    本篇文章介紹了,C++中點(diǎn)操作符和箭頭操作符的使用詳解。需要的朋友參考下
    2013-05-05
  • OpenCV中Grabcut算法的具體使用

    OpenCV中Grabcut算法的具體使用

    本文主要介紹了OpenCV中Grabcut算法的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評(píng)論