最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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ù),有些用戶覺得這種格式用電子表格軟件打開后,格式顯得很擁擠不好看,所以需要自己的程序能夠提供靜態(tài)函數(shù)直接進(jìn)行轉(zhuǎn)換,里面有多少個(gè)字段,轉(zhuǎn)成xls數(shù)據(jù)后也多少個(gè)字段,有多少行內(nèi)容也就多少行內(nè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,用記事本打開一看,居然是bom格式,而且里面穿插了非常多的無(wú)效空格以及不可見字符\x200B,bom字節(jié)也好,不可見字符也好,用普通的QString是打印不出來的,必須轉(zhuǎn)成QByteArray然后再轉(zhuǎn)成16進(jìn)制字符串就能看到,bom是文本最開始前面三個(gè)固定字節(jié)0xEF、0xBB、0xBF,只要讀取到文件前面存在這三個(gè)字節(jié)就說明是帶bom的文件。

格式搞明白了,代碼自然就出來了,通過readLine拿到數(shù)據(jù)后,傳入正則表達(dá)式調(diào)用remove方法移除不可見字符,這樣剩下的就是可見字符,然后判斷當(dāng)前是否讀取的是第一行,是第一行則數(shù)據(jù)分割后傳入列名字段名稱集合中,其余都是一行行數(shù)據(jù),按照要求的分隔符傳入隊(duì)列即可,最后一次性調(diào)用靜態(tài)數(shù)據(jù)導(dǎo)出函數(shù)打完收工,完美!總結(jié):遇到困難要迎難而上,只要功夫深,一定能找到問題所在,尤其是代碼寫的多了以后,遇到問題會(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è)步驟即可開始急速導(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)過濾數(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ù)類型開啟。
  • 可設(shè)置是否開啟數(shù)據(jù)單元格樣式,默認(rèn)不開啟,不開啟可以節(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è)置過則取設(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++?OpenCV?實(shí)現(xiàn)從投影圖像恢復(fù)仿射特性

    利用C++?OpenCV?實(shí)現(xiàn)從投影圖像恢復(fù)仿射特性

    我們通過相機(jī)拍攝的圖片存在各種畸變,其中投影畸變使得原本平行的直線不再平行,就會(huì)產(chǎn)生照片中近大遠(yuǎn)小的效果。本文將具體介紹如何利用OPenCV實(shí)現(xiàn)從投影圖像恢復(fù)仿射特性,接下來跟著小編一起學(xué)習(xí)吧
    2021-11-11
  • C語(yǔ)言實(shí)現(xiàn)單鏈表實(shí)現(xiàn)方法

    C語(yǔ)言實(shí)現(xiàn)單鏈表實(shí)現(xiàn)方法

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)單鏈表實(shí)現(xiàn)方法的相關(guān)資料,鏈表分為單向鏈表、雙向鏈表、循環(huán)鏈表,需要的朋友可以參考下
    2017-08-08
  • 利用C++11原子量如何實(shí)現(xiàn)自旋鎖詳解

    利用C++11原子量如何實(shí)現(xiàn)自旋鎖詳解

    當(dāng)自旋鎖嘗試獲取鎖時(shí)以忙等待(busy waiting)的形式不斷地循環(huán)檢查鎖是否可用,下面這篇文章主要給大家介紹了關(guān)于利用C++11原子量如何實(shí)現(xiàn)自旋鎖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-06-06
  • 深入淺析C++多態(tài)性與虛函數(shù)

    深入淺析C++多態(tài)性與虛函數(shù)

    多態(tài)是指同樣的消息被不同的對(duì)象接收時(shí)導(dǎo)致不同的行為。本文通過實(shí)例代碼給大家介紹了C++多態(tài)性與虛函數(shù)的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2020-02-02
  • C語(yǔ)言 自增自減運(yùn)算的區(qū)別詳解及實(shí)例

    C語(yǔ)言 自增自減運(yùn)算的區(qū)別詳解及實(shí)例

    這篇文章主要介紹了C語(yǔ)言中的++a和a++的區(qū)別詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++中的復(fù)制構(gòu)造函數(shù)詳解

    C++中的復(fù)制構(gòu)造函數(shù)詳解

    今天小編就為大家分享一篇關(guān)于關(guān)于C++復(fù)制構(gòu)造函數(shù)的實(shí)現(xiàn)講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2021-09-09
  • linux使用gcc編譯c語(yǔ)言共享庫(kù)步驟

    linux使用gcc編譯c語(yǔ)言共享庫(kù)步驟

    這篇文章主要介紹了在linux中使用gcc編譯c語(yǔ)言共享庫(kù)的步驟,大家參考使用吧
    2014-01-01
  • C++順序表的基本操作實(shí)現(xiàn)

    C++順序表的基本操作實(shí)現(xiàn)

    大家好,本篇文章主要講的是C++順序表的基本操作實(shí)現(xiàn),感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • C++ 基數(shù)排序的實(shí)現(xiàn)實(shí)例代碼

    C++ 基數(shù)排序的實(shí)現(xiàn)實(shí)例代碼

    這篇文章主要介紹了C++ 基數(shù)排序的實(shí)現(xiàn)實(shí)例代碼的相關(guān)資料,這里附有實(shí)例代碼,幫助大家學(xué)習(xí)理解,需要的朋友可以參考下
    2016-11-11
  • C語(yǔ)言多媒體框架GStreamer入門和概述

    C語(yǔ)言多媒體框架GStreamer入門和概述

    這篇文章主要介紹了C語(yǔ)言多媒體開源框架GStreamer,本文總結(jié)了多媒體框架GStreamer一些基本概念及流程,希望能給使用GStreamer開源庫(kù)的朋友提供一個(gè)借鑒或參考,需要的朋友可以參考下
    2022-07-07

最新評(píng)論

辽源市| 林口县| 嘉禾县| 沿河| 石城县| 蒙山县| 合阳县| 瓮安县| 施秉县| 苍南县| 游戏| 武川县| 沁源县| 拉孜县| 耿马| 布拖县| 射阳县| 台湾省| 什邡市| 博兴县| 山丹县| 双江| 太谷县| 徐闻县| 沛县| 信阳市| 镇平县| 陆川县| 千阳县| 玛多县| 台中县| 城市| 通河县| 井冈山市| 吴旗县| 若羌县| 伊吾县| 隆回县| 常宁市| 佛山市| 慈溪市|