概述
Qt版本升級過程中會新增某些功能模塊並打包到安裝包中,同時官方會以子模塊的形式發布其源碼,
如果要在舊版本開發的項目中使用,有以下3種方式(重點講第2種方式)。
注:
1、兩種使用子模塊的方式都需要安裝perl語言執行環境(Linux平台自帶),可使用 perl -v 查看是否已安裝
2、在安裝Qt時就可以勾選安裝 Strawberry Perl 模塊,如果沒有安裝的按照下面提示單獨安裝一下
3、Perl 在 Window 平台上有 ActiveStatePerl 和 Strawberry Perl 兩種編譯器
4、選 Strawberry Perl 更方便,根據Qt編譯器32/64bit版本下載對應版本,地址:http://strawberryperl.com
先介紹一下:Qt安裝目錄(以Qt5.9版本為例)
如上圖所示,添加的子模塊都會放在QTDIR(Qt類庫文件夾)中,其中子模塊關注的目錄:
- bin:用於存放Qt的運行庫,我們將子模塊編譯生成的.dll文件拷貝到該目錄下;
- include:用於存放頭文件,我們將子模塊的頭文件拷貝到該目錄下;
- lib:用於存放靜態庫文件,我們將子模塊編譯生成的.a(mingw編譯器)或.lib(msvc編譯器)文件拷貝到該目錄下;
- mkspecs:該目錄下有個modules文件夾,我們將子模塊編譯生成.pri文件拷貝到該目錄下。
方式1:直接在項目中使用子模塊源碼
1、將源碼放在項目目錄下
|-- project.pro |-- .... |-- 3rdparty\ | |-- qtxlsx\ | |
2、在項目pro文件中添加
include(3rdparty/qtxlsx/src/xlsx/qtxlsx.pri)
3、在mian.cpp中添加頭文件即可
#include "xlsxdocument.h" int main(){ QXlsx::Document xlsx; xlsx.write("A1", "Hello Qt!"); xlsx.saveAs("Test.xlsx"); return 0; }
方式2:編譯子模塊源碼並將其添加為Qt的子模塊(以QtXlsx為例)
我們只需要下載這個子模塊的源碼進行編譯並安裝到開發環境中即可。
1、下載子模塊源碼
博主使用的是舊版本的QtXlsx,已經很久沒有維護了,推薦大家使用目前正在維護的新版本
源碼地址(舊):https://github.com/dbzhang800/QtXlsxWriter
源碼地址(新):https://github.com/QtExcel/QXlsx(這個版本不需要perl環境,待驗證)
API使用文檔地址: http://qtxlsx.debao.me
2、編譯子模塊源碼
用Qt Create打開源碼目錄下pro文件,在項目配置界面做一下配置:
選擇編譯套件kits,如果像博主一樣使用VS+Qt開發環境就選擇MSVC(用Qt開發環境就選擇MinGw)
構建步驟中默認選擇使用qmake(也可選使用make,需要加宏,不推薦)
開始構建編譯
完成后在編譯目錄生成三個文件夾,include、lib、mkspecs(模塊pri)
include:子模塊頭文件
lib:子模塊庫文件,包含靜態鏈接庫和動態鏈接庫
mkspecs:子模塊pri文件
3、添加為Qt子模塊(安裝子模塊)
將生成的include文件夾下的QtXlsx文件夾拷貝到msvc\include下(注意看頭文件內容是否為頭文件的相對路徑,是則需要替換為包含內容的頭文件)
將生成的lib文件夾下Qt5Xlsxd.lib、Qt5Xlsx.lib、Qt5Xlsx.prl、Qt5Xlsxd.prl拷貝到msvc\lib下
將生成的lib下Qt5Xlsx.dll、Qt5Xlsxd.dll拷貝到msvc\bin下
將生成的mkspecs\modules-inst下qt_lib_xlsx.pri、qt_lib_xlsx_private.pri拷貝到msvc\mkspecs\modules下(此步不做則pro文件中添加QT += xlsx模塊不會被識別)
4、測試子模塊
新建Qt項目,在pro文件中添加QT += xlsx
如果是VS+Qt環境,則右鍵項目->屬性->Qt Project Settings手動添加xlsx
#include <QtXlsx/xlsxdocument.h> int main(){ QXlsx::Document xlsx; xlsx.write("A1", "Hello Qt!"); xlsx.saveAs("test.xlsx"); return 0; }
構建項目后會生成test.xlsx文件,打開文件內容如下即成功
方式3:使用方式2編譯的頭文件和庫文件,當作動態庫使用,不添加到Qt子模塊中
QtXlsx使用
QtXlsx官方示例使用:https://tangxing.blog.csdn.net/article/details/111769792
附上QtXlsx常用API使用方式:
1 //xlsx操作單元格 2 xlsx.mergeCells("A1:Q1"); 3 xlsx.setColumnWidth(1,15) 4 xlsx.setRowHeight(1,4,30) 5 //xlsx跳轉指定的sheet 6 xlsx.selectSheet("sheetName"); 7 //xlsx獲取當前表的行數、列數 8 xlsx.dimension().rowCount(); 9 xlsx.dimension().columnCount(); 10 //xlsx查看文件中所有表名 11 xlsx.sheetNames() 12 //xlsx增加一個表 13 xlsx.addSheet() 14 //xlsx的cell格式化 15 Format cellFormat; 16 cellFormat.setFontSize(11); 17 cellFormat.setFontColor(QColor(Qt::black)); 18 cellFormat.setBorderStyle(Format::BorderThin); 19 cellFormat.setHorizontalAlignment(Format::AlignHCenter); 20 cellFormat.setVerticalAlignment(Format::AlignVCenter); 21 //xlsx寫入表格顯示中文亂碼 22 QString::fromLocal8Bit("亮度均勻性(Luminance Uniformity)") 23 //QStringList中查找到某一個字符串的索引位置(找不到返回-1) 24 QStringList的indexOf() 25 //tableWidget里面的item是空的時候程序會中斷 26 因為當item是空的時候, 27 ui->tableWidget->item(now_row,now_column); 28 得到的是一個空指針所以不能用text()去獲取文本!
1 //寫入 2 QXlsx::Document xlsx; 3 if(!xlsx.selectSheet("ziv"))//選擇表格,若不存在,則新建一張 4 { 5 xlsx.addSheet("ziv"); 6 } 7 xlsx.write("A1", "View the properties through:"); 8 xlsx.write("A2", "Office Button -> Prepare -> Properties option in Excel"); 9 if(!xlsx.selectSheet("agv")) 10 { 11 xlsx.addSheet("agv"); 12 } 13 xlsx.write("A1","ip"); 14 xlsx.write("A2","192.168"); 15 xlsx.saveAs("book1.xlsx"); //添加后,必須保存至表格中 16 QXlsx::CellRange range;//獲取表格的行數、列數 17 range=xlsx.dimension(); 18 int rowCount = range.rowCount() ; //行數 19 int colCount = range.columnCount() ; //列數 20 //更新某一行 21 for(int i=1; i<rowCount+1; i++) 22 { 23 if ( xlsx.cellAt( i ,1)->value().toString()=="192.168" ) 24 { 25 xlsx.write(i,1,"192.168.31"); 26 } 27 } 28 xlsx.saveAs("book1.xlsx");//更新后一定要保存 29 xlsx1.selectSheet("agv"); 30 //讀取agv表中的所有信息 31 for (int i = 1; i <=rowCount; i++) 32 { 33 for (int j=1; j<=colCount; j++) 34 { 35 qDebug() << i <<j <<xlsx1.cellAt(i, j)->value().toString() ; 36 } 37 } 38 qDebug() << rowCountt <<colCountt <<xlsx1.currentSheet()->sheetName();//打印出表單的名字 39 40 bool flag= xlsx.deleteSheet("agv");//刪除某一表,刪除后必須保存 41 if(flag) 42 { 43 qDebug() <<"true" ; 44 } 45 else 46 { 47 qDebug() <<"false" ; 48 } 49 xlsx.saveAs("book1.xlsx"); 50 xlsx.copySheet("ziv","chen");//無格式拷貝 51 xlsx.selectSheet("chen"); 52 xlsx.write(4,2,"On the Copy Sheet"); 53 xlsx.saveAs("book1.xlsx"); 54 55 56 57 //讀取 58 QXlsx::Document xlsx1("book1.xlsx"); 59 xlsx1.selectSheet("ziv"); 60 QStringList sheetname_tmp = xlsx1.sheetNames();//表單名 61 qDebug() << "表單名" <<sheetname_tmp; 62 QString tmp = sheetname_tmp.join(","); 63 qDebug() <<"tmp" << tmp; 64 xlsx1.selectSheet("ziv"); 65 qDebug()<<xlsx1.read("A1").toString()<<xlsx1.read("A2").toInt()<<xlsx1.read("A3").toBool(); 66 67 //若想判斷單元格是不是空白 68 QString filepath= "D:/LgvResource/dxfInfo.xlsx" ; 69 QXlsx::Document xlsx(filepath);//讀取excel 70 //選擇表SiteInfo //ID、posX、posY、nature、startx、starty width height 71 if(!xlsx.selectSheet("SiteInfo")) 72 { 73 qDebug()<<"表格不存在"+filepath + "SiteInfo"; 74 return; 75 } 76 QXlsx::Cell *cell = xlsx.cellAt(2,1); 77 if(cell == NULL) 78 { 79 qDebug()<<"null"; 80 } 81 else { 82 qDebug()<<cell->value().toString(); 83 }