一直以來,都想學(xué)習(xí)一下C/C++如何操作excel表,在網(wǎng)上調(diào)研了一下,覺得使用C/C++去操作很麻煩,遂轉(zhuǎn)向QT這邊;QT有一個(gè)自帶的類QAxObject,可以使用他去操作,但隨著了解的深入,覺得他并不是很好,有很多其他缺陷(例如必須電腦安裝了辦公軟件才可以進(jìn)行操作等),所以繼續(xù)調(diào)研,終于找到了QT的一個(gè)第三方庫可以很好的實(shí)現(xiàn):QtXlsx.?
目錄
一、下載QtXlsx
二、QtXlsx源碼嵌入QTCreator中使用
三、QtXlsx源碼編譯成為.lib庫使用
1. 下載安裝Perl
2. 編譯QtXlsx
3. 在vs中使用
四、QtXlsx
1. 知識(shí)點(diǎn)
2. 使用公式
五、練手小demo
Github下載:https://github.com/dbzhang800/QtXlsxWriter
官方文檔:http://qtxlsx.debao.me/
在Github下載后,可以直接添加到QtCreator項(xiàng)目中,也可以編譯成lib庫后再添加到VS中去使用。
一、下載QtXlsx
點(diǎn)擊鏈接進(jìn)入Github下載
下載解壓后得到如下文件
二、QtXlsx源碼嵌入QTCreator中使用
新建一個(gè)QTCreator窗體項(xiàng)目
將上圖src文件夾拷貝到該項(xiàng)目路徑中
之后雙擊項(xiàng)目中的.pro文件
將如下代碼拷貝到.pro文件中
include(src/xlsx/qtxlsx.pri)
Ctrl + s 保存一下,就可以把QtXlsx源碼模塊加載進(jìn)來啦!
可以在項(xiàng)目構(gòu)造函數(shù)中添加如下代碼進(jìn)行測(cè)試:
#include "xlsxdocument.h"
#include "xlsxchartsheet.h"
#include "xlsxcellrange.h"
#include "xlsxchart.h"
#include "xlsxrichstring.h"
#include "xlsxworkbook.h"
QXlsx::Document xlsx;
xlsx.write(1, 2, "Hello Qt!");
xlsx.write(2, 2, QString::fromLocal8Bit("中文"));
xlsx.saveAs("Text.xlsx");
編譯運(yùn)行后,就可以在項(xiàng)目路徑看到程序創(chuàng)建的Text.xlsx文件,打開后就可以看到寫入的?"Hello Qt!"和"中文".
三、QtXlsx源碼編譯成為.lib庫使用
1. 下載安裝Perl
下載安裝:Perl
下載鏈接:https://strawberryperl.com/
注意,這個(gè)是一定要下載安裝的,否則編譯lib庫會(huì)編譯失?。。?!?
下載后默認(rèn)安裝即可
2. 編譯QtXlsx
打開下載的QtXlsx文件夾,雙擊打開.pro
根據(jù)自己安裝的vs版本,選擇相應(yīng)的msvc編譯
?打開后直接點(diǎn)擊編譯
編譯完成后,就可以在相應(yīng)路徑找到編譯好的lib庫
3. 在vs中使用
新建vsQT項(xiàng)目,將include文件夾和Qt5Xlsxd.dll和Qt5Xlsxd.lib拷貝到項(xiàng)目路徑中;
將QtXlsxWriter-master文件夾整個(gè)拷貝到項(xiàng)目路徑中;
拷貝之后項(xiàng)目路徑文件,下圖方框中的就是我們需要拷貝的文件
右鍵項(xiàng)目 - 屬性 - C/C++ - 常規(guī) - 附加包含目錄,把頭文件路徑添加進(jìn)來
右鍵項(xiàng)目 - 屬性 - 鏈接器 - 輸入 - 附加依賴項(xiàng),添加Qt5Xlsxd.lib
之后,可以加入頭文件
#include "xlsxdocument.h"
#include "xlsxchartsheet.h"
#include "xlsxcellrange.h"
#include "xlsxchart.h"
#include "xlsxrichstring.h"
#include "xlsxworkbook.h"
在構(gòu)造函數(shù)中加入代碼
QXlsx::Document xlsx;
xlsx.write(1, 2, "Hello Qt!");
xlsx.write(2, 2, QString::fromLocal8Bit("中文"));
xlsx.saveAs("Text.xlsx");
編譯運(yùn)行,不出意外的話, 在項(xiàng)目路徑會(huì)一個(gè)名為Text.xlsx的文件,雙擊打開
數(shù)據(jù)也已經(jīng)寫入,測(cè)試成功!?
四、QtXlsx
1. 知識(shí)點(diǎn)
a. 定義
QXlsx::Document xlsx;
QXlsx::Document xlsx("Text.xlsx");
b. 往單元格中寫入數(shù)據(jù)
write
xlsx.write(2, 2, "中文"); ????????參數(shù)一是行,參數(shù)二是列,參數(shù)三是數(shù)據(jù)
xlsx.write("C3", "C3");? ? ? ? 參數(shù)一是對(duì)應(yīng)單元格名字,參數(shù)二是數(shù)據(jù)
c.?設(shè)置行高
setRowHeight
xlsx.setRowHeight(4, 30);????????設(shè)置第四行高度為30
d.?設(shè)置列寬
setColumnWidth
xlsx.setColumnWidth(3, 50); ????????設(shè)置第三列寬度為50
?e.?設(shè)置單元格樣式
QXlsx::Format format;
format.setFontColor(Qt::red); ???????????????? // 設(shè)置字體顏色為紅色
format.setFontBold(true);???????????????????????? // 設(shè)置加粗
format.setFontSize(30);????????????????????????????// 設(shè)置字體大小
format.setFontItalic(true); ???????????????????????? // 設(shè)置傾斜
format.setFontName("楷體"); ????????????????????// 設(shè)置字體
format.setPatternBackgroundColor(QColor(100, 200, 100));???????? // 設(shè)置單元格背景顏色
format.setHorizontalAlignment(QXlsx::Format::AlignHCenter); ?????// 設(shè)置水平居中,更多參考enum HorizontalAlignment枚舉
format.setVerticalAlignment(QXlsx::Format::AlignVCenter);? ? ? ? ?? // 設(shè)置垂直居中
format.setBorderColor(QColor(50, 50, 50));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 設(shè)置邊框顏色
format.setFontUnderline(QXlsx::Format::FontUnderlineDouble); ???// 設(shè)置雙下劃線,更多參考enum FontUnderline枚舉
format.setFontUnderline(QXlsx::Format::FontUnderlineSingle); ?????// 設(shè)置單下劃線
format.setFillPattern(QXlsx::Format::PatternLightUp); ????????????????????// 填充方式,更多參考enum FillPattern枚舉
xlsx.write("C4", "紅色|加粗|30", format);? ? ? ? 作為第三個(gè)參數(shù)
f. 設(shè)置單元格方框
setBorderStyle
format.setBorderStyle(QXlsx::Format::BorderThin);????????更多參考enum BorderStyle枚舉
g.?合并單元格
mergeCells
xlsx.mergeCells("C4:E6");? ? ? ? 參數(shù)指定那個(gè)單元格區(qū)間
h.?取消合并
unmergeCells
xlsx.unmergeCells("C4:E6");? ? ? ? 參數(shù)指定的單元格區(qū)間一定是要已經(jīng)合并的,否則打開xlsx文件報(bào)錯(cuò)
i.?讀取單元格中的數(shù)據(jù)
read
QString str1 = xlsx.read(1, 1).toString();? ? ? ? 指定行列獲取
QString str2 = xlsx.read("B2").toString();? ? ? ? 指定單元格名字獲取
j.?獲得單元格對(duì)象
cellAt
QXlsx::Cell *cell = xlsx.cellAt("C4");? ? ? ? ? ? ? ? 獲取到的是指針對(duì)象
QXlsx::Cell *cell = xlsx.cellAt(1, 1);
cell->value();? ? ? ? 可以通過value()函數(shù)獲取單元格中的值
k.?添加工作表
addSheet
xlsx.addSheet("sheet_2");? ? ? ? 添加這一張名為“sheet_2”的工作表
l.?工作表重命名
renameSheet
xlsx.workbook()->renameSheet(1, "sheet_3");? ? ? ? 將索引為1(也就是第二張)的工作表命名為“sheet_3”
m.?選擇當(dāng)前工作表
selectSheet
xlsx.selectSheet("sheet_3");? ? ? ? 選擇名為“sheet_3”的工作表為當(dāng)前xlsx工作表
n.?獲得所有工作表的名字
sheetNames
QStringList sheetList = xlsx.sheetNames();? ? ? ? 獲取返回的是一個(gè)字符串鏈表
o.?獲取工作簿對(duì)象
workbook
QXlsx::Workbook *workBook = xlsx.workbook();
p. 獲取當(dāng)前工作簿的第一張sheet工作表
QXlsx::Worksheet *workSheet = static_cast<QXlsx::Worksheet*>(workBook->sheet(0));
q.?獲取當(dāng)前sheet表所使用到的行數(shù)
int row = workSheet->dimension().rowCount();
r.?獲取當(dāng)前sheet表所使用到的列數(shù)
int colum = workSheet->dimension().columnCount();
s. 遍歷sheet表中有數(shù)據(jù)的單元格
for (int i = 0; i < row; i++) {
for (int j = 0; j < colum; j++) {
// 獲取單元格
QXlsx::Cell *cell = workSheet->cellAt(i, j); // 讀取單元格
if (cell) {
qDebug() << "(" << i << ", " << j << ")\t" << cell->value().toString().trimmed(); // trimmed 去除字符串兩側(cè)的空格
}
}
}
t. 刪除單元格數(shù)據(jù)
xlsx.write("G5", "");? ? ? ? 直接重新設(shè)置為空即可
u. 修改單元格數(shù)據(jù)
xlsx.write("G6", "修改");? ? ? ? 重新對(duì)單元格寫入數(shù)據(jù)即可
v. 保存
saveAs
xlsx.saveAs("Text.xlsx");? ? ? ? 初始化xlsx對(duì)象時(shí)沒有指定excel文件,那么保存時(shí)使用這個(gè)
save
xlsx.save();? ? ? ? 初始化xlsx對(duì)象時(shí),指定了excel文件,那么保存時(shí)使用這個(gè)
w. 設(shè)置單元格中字符串不同字體顏色
RichString
QXlsx::Document xlsx("Text.xlsx");
QXlsx::Format blue; // 設(shè)置字體顏色
blue.setFontColor(Qt::blue);
QXlsx::Format red;
red.setFontColor(Qt::red);
red.setFontSize(20); // 設(shè)置字體大小
QXlsx::Format bold;
bold.setFontBold(true); // 設(shè)置字體加粗
QXlsx::RichString rich;
rich.addFragment("test", blue);
rich.addFragment("QT", red);
rich.addFragment("中文", bold);
xlsx.write("C3", rich);
xlsx.save();
x. 給單元格命名
xlsx.defineName("Cell_1", "=Sheet1!$A$1:$A$10"); // A1-A10命名為Cell_1
xlsx.defineName("Cell_2", "=Sheet1!$B$1:$B$10", "這是描述信息"); // B1-B10命名為Cell_2
?y. 賦值
xlsx.defineName("Factor", "=0.5");???????? // 將0.5賦值給Factor,相當(dāng)于變量賦值一樣,我們就可以使用這個(gè)變量了
2. 使用公式
xlsx.write(11, 1, "=SUM(Cell_1)"); // 計(jì)算A1-A10數(shù)據(jù)總和,并寫入(11,1)單元格中
xlsx.write(15, 1, "=SUM($A$1:$A$10)"); // 計(jì)算A1-A10數(shù)據(jù)總和,并寫入(15,1)單元格中
使用公式和變量
xlsx.write(12, 1, "=SUM(Cell_1)*Factor"); // 計(jì)算A1-A10數(shù)據(jù)總和再乘以0.5,并寫入(12,1)單元格中
xlsx.write(16, 1, "=SUM($A$1:$A$10)*Factor"); // 計(jì)算A1-A10數(shù)據(jù)總和再乘以0.5,并寫入(16,1)單元格中
xlsx.write(13, 2, "=SUM($B$1:B$10)*0.1"); // B1 - B10 計(jì)算總和后乘以0.1
五、練手小demo
自己寫的一個(gè)小demo,操作excel文件,自動(dòng)生成該excel文件,然后可以對(duì)其插入,刪除,保存,刷新的操作!
使用QTCreator進(jìn)行操作編寫!
?文章來源:http://www.zghlxwxcb.cn/news/detail-610705.html
下載鏈接:Qtxlsx+QtCreator+自己編寫的對(duì)excel文件操作小案例-C++文檔類資源-CSDN文庫文章來源地址http://www.zghlxwxcb.cn/news/detail-610705.html
到了這里,關(guān)于QT 使用第三方庫QtXlsx操作Excel表的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!