QT 使用第三方庫QtXlsx操作Excel表

1.簡介

一直以來,都想學習一下C/C++如何操作excel表,在網上調研了一下,覺得使用C/C++去操作很麻煩,遂轉向QT這邊;QT有一個自帶的類QAxObject,可以使用他去操作,但隨著了解的深入,覺得他并不是很好,有很多其他缺陷(例如必須電腦安裝了辦公軟件才可以進行操作等),所以繼續調研,終于找到了QT的一個第三方庫可以很好的實現:QtXlsx.?
?

Github下載:https://github.com/dbzhang800/QtXlsxWriter
官方文檔:http://qtxlsx.debao.me/

在Github下載后,可以直接添加到QtCreator項目中,也可以編譯成lib庫后再添加到VS中去使用。

2、下載QtXlsx

點擊鏈接進入Github下載

?下載解壓后得到如下文件

二、QtXlsx源碼嵌入QTCreator中使用

新建一個QTCreator窗體項目

將上圖src文件夾拷貝到該項目路徑中

之后雙擊項目中的.pro文件

將如下代碼拷貝到.pro文件中

include(src/xlsx/qtxlsx.pri)

Ctrl + s?保存一下,就可以把QtXlsx源碼模塊加載進來啦!

可以在項目構造函數中添加如下代碼進行測試:

#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");

編譯運行后,就可以在項目路徑看到程序創建的Text.xlsx文件,打開后就可以看到寫入的?"Hello Qt!"和"中文".

三、QtXlsx源碼編譯成為.lib庫使用

1. 下載安裝Perl

下載安裝:Perl

下載鏈接:Strawberry Perl for Windows

注意,這個是一定要下載安裝的,否則編譯lib庫會編譯失敗!!!?

下載后默認安裝即可

2. 編譯QtXlsx

打開下載的QtXlsx文件夾,雙擊打開.pro

?根據自己安裝的vs版本,選擇相應的msvc編譯

?打開后直接點擊編譯

編譯完成后,就可以在相應路徑找到編譯好的lib庫

3. 在vs中使用

新建vsQT項目,將include文件夾和Qt5Xlsxd.dll和Qt5Xlsxd.lib拷貝到項目路徑中;

將QtXlsxWriter-master文件夾整個拷貝到項目路徑中;

拷貝之后項目路徑文件,下圖方框中的就是我們需要拷貝的文件

右鍵項目 - 屬性 - C/C++ - 常規 - 附加包含目錄,把頭文件路徑添加進來

右鍵項目 - 屬性 - 鏈接器 - 輸入 - 附加依賴項,添加Qt5Xlsxd.lib

之后,可以加入頭文件

#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");

編譯運行,不出意外的話, 在項目路徑會一個名為Text.xlsx的文件,雙擊打開

?數據也已經寫入,測試成功!?

四、QtXlsx
1. 知識點

a. 定義

QXlsx::Document xlsx;QXlsx::Document xlsx("Text.xlsx");

b. 往單元格中寫入數據

writexlsx.write(2, 2, "中文"); ? ? ? ? 參數一是行,參數二是列,參數三是數據xlsx.write("C3", "C3"); ? ? ? ?參數一是對應單元格名字,參數二是數據

c. 設置行高

setRowHeightxlsx.setRowHeight(4, 30); ? ? ? ?設置第四行高度為30

d. 設置列寬

setColumnWidthxlsx.setColumnWidth(3, 50); ? ? ? ? 設置第三列寬度為50

?e. 設置單元格樣式

QXlsx::Format format;format.setFontColor(Qt::red); ? ? ? ? ? ? ? ? ?// 設置字體顏色為紅色format.setFontBold(true); ? ? ? ? ? ? ? ? ? ? ? ? // 設置加粗format.setFontSize(30); ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 設置字體大小format.setFontItalic(true); ? ? ? ? ? ? ? ? ? ? ? ? ?// 設置傾斜format.setFontName("楷體"); ? ? ? ? ? ? ? ? ? ? // 設置字體format.setPatternBackgroundColor(QColor(100, 200, 100)); ? ? ? ? // 設置單元格背景顏色format.setHorizontalAlignment(QXlsx::Format::AlignHCenter); ? ? ?// 設置水平居中,更多參考enum HorizontalAlignment枚舉format.setVerticalAlignment(QXlsx::Format::AlignVCenter); ? ? ? ? ? // 設置垂直居中format.setBorderColor(QColor(50, 50, 50)); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 設置邊框顏色format.setFontUnderline(QXlsx::Format::FontUnderlineDouble); ? ?// 設置雙下劃線,更多參考enum FontUnderline枚舉format.setFontUnderline(QXlsx::Format::FontUnderlineSingle); ? ? ?// 設置單下劃線format.setFillPattern(QXlsx::Format::PatternLightUp); ? ? ? ? ? ? ? ? ? ? // 填充方式,更多參考enum FillPattern枚舉xlsx.write("C4", "紅色|加粗|30", format); ? ? ? ?作為第三個參數

f. 設置單元格方框

setBorderStyleformat.setBorderStyle(QXlsx::Format::BorderThin); ? ? ? ?更多參考enum BorderStyle枚舉

g. 合并單元格

mergeCellsxlsx.mergeCells("C4:E6"); ? ? ? ?參數指定那個單元格區間

h. 取消合并

unmergeCellsxlsx.unmergeCells("C4:E6"); ? ? ? ?參數指定的單元格區間一定是要已經合并的,否則打開xlsx文件報錯

i. 讀取單元格中的數據

readQString str1 = xlsx.read(1, 1).toString(); ? ? ? ?指定行列獲取QString str2 = xlsx.read("B2").toString(); ? ? ? ?指定單元格名字獲取

j. 獲得單元格對象

cellAtQXlsx::Cell *cell = xlsx.cellAt("C4"); ? ? ? ? ? ? ? ?獲取到的是指針對象QXlsx::Cell *cell = xlsx.cellAt(1, 1);cell->value(); ? ? ? ?可以通過value()函數獲取單元格中的值

k. 添加工作表

addSheetxlsx.addSheet("sheet_2"); ? ? ? ?添加這一張名為“sheet_2”的工作表

l. 工作表重命名

renameSheetxlsx.workbook()->renameSheet(1, "sheet_3"); ? ? ? ?將索引為1(也就是第二張)的工作表命名為“sheet_3”

m. 選擇當前工作表

selectSheetxlsx.selectSheet("sheet_3"); ? ? ? ?選擇名為“sheet_3”的工作表為當前xlsx工作表

n. 獲得所有工作表的名字

sheetNames
QStringList sheetList = xlsx.sheetNames(); ? ? ? ?獲取返回的是一個字符串鏈表

o. 獲取工作簿對象

workbookQXlsx::Workbook *workBook = xlsx.workbook();

p. 獲取當前工作簿的第一張sheet工作表

QXlsx::Worksheet *workSheet = static_cast<QXlsx::Worksheet*>(workBook->sheet(0));

q. 獲取當前sheet表所使用到的行數

int row = workSheet->dimension().rowCount();

r. 獲取當前sheet表所使用到的列數

int colum = workSheet->dimension().columnCount();

s. 遍歷sheet表中有數據的單元格

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 去除字符串兩側的空格                                                                                              }                                                                                     }                                                                                         
}                                                                                             

t. 刪除單元格數據

xlsx.write("G5", ""); ? ? ? ?直接重新設置為空即可

u. 修改單元格數據

xlsx.write("G6", "修改"); ? ? ? ?重新對單元格寫入數據即可

v. 保存

saveAsxlsx.saveAs("Text.xlsx"); ? ? ? ?初始化xlsx對象時沒有指定excel文件,那么保存時使用這個savexlsx.save(); ? ? ? ?初始化xlsx對象時,指定了excel文件,那么保存時使用這個

w. 設置單元格中字符串不同字體顏色

RichString

QXlsx::Document xlsx("Text.xlsx");             QXlsx::Format blue;     // 設置字體顏色              
blue.setFontColor(Qt::blue);                   
QXlsx::Format red;                             
red.setFontColor(Qt::red);                     
red.setFontSize(20);    // 設置字體大小              
QXlsx::Format bold;                            
bold.setFontBold(true); // 設置字體加粗              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,相當于變量賦值一樣,我們就可以使用這個變量了

z. 使用公式

xlsx.write(11, 1, "=SUM(Cell_1)"); ?// 計算A1-A10數據總和,并寫入(11,1)單元格中
xlsx.write(15, 1, "=SUM($A$1:$A$10)"); ?// 計算A1-A10數據總和,并寫入(15,1)單元格中


使用公式和變量

xlsx.write(12, 1, "=SUM(Cell_1)*Factor"); ? // 計算A1-A10數據總和再乘以0.5,并寫入(12,1)單元格中
xlsx.write(16, 1, "=SUM($A$1:$A$10)*Factor"); // 計算A1-A10數據總和再乘以0.5,并寫入(16,1)單元格中
xlsx.write(13, 2, "=SUM($B$1:B$10)*0.1"); ? ?// B1 - B10 計算總和后乘以0.1

五、QtXlsx知識點補充

1.QStringList sheetNames() const


2.bool addSheet(const QString &name = QString(), AbstractSheet::SheetType type = AbstractSheet::ST_WorkSheet)


3.bool insertSheet(int index, const QString &name = QString(), AbstractSheet::SheetType type = AbstractSheet::ST_WorkSheet)

4.bool renameSheet(const QString &oldName, const QString &newName)

5.bool moveSheet(const QString &srcName, int distIndex)

6.bool deleteSheet(const QString &name)


7.AbstractSheet *Document::sheet(const QString &sheetName) const

8.AbstractSheet::SheetState AbstractSheet::sheetState() const

9.void AbstractSheet::setSheetState(SheetState state)

10.bool AbstractSheet::isHidden() const

11.bool AbstractSheet::isVisible() const

12.void AbstractSheet::setHidden(bool hidden)

13.void AbstractSheet::setVisible(bool visible)\

14.Chart *Document::insertChart(int row, int col, const QSize &size)

15.void Chart::setChartType(ChartType type)

16.void Chart::addSeries(const CellRange &range, AbstractSheet *sheet, bool headerH, bool headerV, bool swapHeaders)

17.void Chart::setChartLegend(Chart::ChartAxisPos legendPos, bool overlay)

18.void Chart::setChartTitle(QString strchartTitle)

19.void Chart::setGridlinesEnable(bool majorGridlinesEnable, bool minorGridlinesEnable)
?

20.int Document::insertImage(int row, int column, const QImage &image)

21.uint Document::getImageCount()

22.bool Document::getImage(int imageIndex, QImage& img)

23.bool Document::getImage(int row, int col, QImage &img)

不錯的連接:https://blog.csdn.net/qq_43627907/category_11756312.html???????

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42242.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42242.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42242.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c++游戲制作指南(四):c++實現數據的存儲和讀取(輸入流fstream)

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f35f;歡迎來到靜淵隱者的csdn博文&#xff0c;本文是c游戲制作指南的一部&#x1f35f; &#x1f355;更多文章請點擊下方鏈接&#x1f355; &#x1f368; c游戲制作指南&#x1f3…

最長重復子數組(力扣)動態規劃 JAVA

給兩個整數數組 nums1 和 nums2 &#xff0c;返回 兩個數組中 公共的 、長度最長的子數組的長度 。 示例 1&#xff1a; 輸入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 輸出&#xff1a;3 解釋&#xff1a;長度最長的公共子數組是 [3,2,1] 。 示例 2&#xff1a; 輸…

新寶馬M5諜照曝光,侵略感十足,將與奧迪、梅賽德斯-AMG正面競爭

報道稱&#xff0c;寶馬即將推出全新一代M5&#xff0c;該車的諜照最近再次曝光。早先&#xff0c;寶馬 M5 Touring 旅行汽車的賽道測試圖片已經在網絡上流傳開來&#xff0c;預計該車將與奧迪的RS6 Avant和梅賽德斯-AMG E63 Estate展開正面競爭。 從最新曝光的照片來看&#x…

【操作系統考點匯集】操作系統考點匯集

關于操作系統可能考察的知識點 操作系統基本原理 什么是操作系統&#xff1f; 操作系統是指控制和管理整個計算機系統的硬件和軟件資源&#xff0c;并合理地組織調度計算機的工作和資源的分配&#xff0c;以提供給用戶和它軟件方便的接口和環境&#xff0c;是計算機系統中最基…

Python土力學與基礎工程計算.PDF-鉆探泥漿制備

Python 求解代碼如下&#xff1a; 1. rho1 2.5 # 黏土密度&#xff0c;單位&#xff1a;t/m 2. rho2 1.0 # 泥漿密度&#xff0c;單位&#xff1a;t/m 3. rho3 1.0 # 水的密度&#xff0c;單位&#xff1a;t/m 4. V 1.0 # 泥漿容積&#xff0c;單位&#xff1a;…

神經網絡基礎-神經網絡補充概念-53-將batch norm擬合進神經網絡

代碼實現 import numpy as np import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, BatchNormalization, Activation from tensorflow.keras.optimizers import SGD# 生成隨機數據 np.random.seed(0) X np.…

【0基礎入門Python筆記】一、python 之基礎語法、基礎數據類型、復合數據類型及基本操作

一、python 之基礎語法、基礎數據類型、復合數據類型及基本操作 基礎語法規則基礎數據類型數字類型&#xff08;Numbers&#xff09;字符串類型&#xff08;String&#xff09;布爾類型&#xff08;Boolean&#xff09; 復合數據類型List&#xff08;列表&#xff09;Tuple&…

代碼隨想錄DAY62

這個移動0的問題還是比較重要的 因為涉及到一種思想&#xff1a;快慢指針&#xff01; class Solution { public: void moveZeroes(vector<int>& nums) { int slow0,fast0; for(;fast<nums.size();fast){ if(nums[fast]!0){ swap(nums[slow],nums[fast]); slow;…

Kafka 什么速度那么快

批量發送消息 Kafka 采用了批量發送消息的方式&#xff0c;通過將多條消息按照分區進行分組&#xff0c;然后每次發送一個消息集合&#xff0c;看似很平常的一個手段&#xff0c;其實它大大提升了 Kafka 的吞吐量。 消息壓縮 消息壓縮的目的是為了進一步減少網絡傳輸帶寬。而…

故障012:定時備份作業-6007懸案

故障012&#xff1a;定時備份作業-6007懸案 1. 問題描述2. 解決過程2.1 大膽推想2.2 找規律2.3 嘗試換掉AP2.4 檢查資源限制2.5 資源放寬SYSDBA 3. 精神感悟 DM技術交流QQ群&#xff1a;940124259 1. 問題描述 詭異的現象總是伴隨著隱藏的功能被打開&#xff0c;可能耽誤你很…

比ChatGPT更強的星火大模型V2版本發布!

初體驗 測試PPT生成 結果&#xff1a; 達到了我的預期&#xff0c;只需要微調就可以直接交付&#xff0c;這點比ChatGPT要強很多. 測試文檔問答 結果&#xff1a; 這點很新穎&#xff0c;現在類似這種文檔問答的AI平臺收費都貴的離譜&#xff0c;星火不但免費支持而且效果也…

opencv圖片換背景色

#include <iostream> #include<opencv2/opencv.hpp> //引入頭文件using namespace cv; //命名空間 using namespace std;//opencv這個機器視覺庫&#xff0c;它提供了很多功能&#xff0c;都是以函數的形式提供給我們 //我們只需要會調用函數即可in…

uniapp評論列表插件獲取

從評論列表&#xff0c;回復&#xff0c;點贊&#xff0c;刪除&#xff0c;留言板 - DCloud 插件市場里導入&#xff0c;并使用。 代碼樣式優化及接入如下&#xff1a; <template><view class"hb-comment"><!-- 閱讀數-start --><view v-if&q…

5.利用matlab完成 符號矩陣的轉置和 符號方陣的冪運算(matlab程序)

1.簡述 Matlab符號運算中的矩陣轉置 轉置向量或矩陣 B A. B transpose(A) 說明 B A. 返回 A 的非共軛轉置&#xff0c;即每個元素的行和列索引都會互換。如果 A 包含復數元素&#xff0c;則 A. 不會影響虛部符號。例如&#xff0c;如果 A(3,2) 是 12i 且 B A.&#xff0…

java中excel文件下載

1、System.getProperty(user.dir) 獲取的是啟動項目的容器位置 2、 Files.copy(sourceFile.toPath(), destinationFile.toPath(), StandardCopyOption.REPLACE_EXISTING); StandardCopyOption.REPLACE_EXISTING 來忽略文件已經存在的異常&#xff0c;如果存在就去覆蓋掉它Sta…

00-認識C++

2、認識C 2.1、例子 一個簡單的C例子 #include <iostream>int main() {using namespace std; //使用名稱空間cout << "Com up and C me some time.";cout << endl; //換行符&#xff0c;還可以cout<<"\n";cout <…

驅動DAY5

1.實現設備文件和設備的綁定&#xff0c;編寫LED驅動 2.復習競態的解決方法和阻塞IO實現 第一個任務 頭文件 #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;u…

【MySQL系列】表內容的基本操作(增刪查改)

「前言」文章內容大致是對MySQL表內容的基本操作&#xff0c;即增刪查改。 「歸屬專欄」MySQL 「主頁鏈接」個人主頁 「筆者」楓葉先生(fy) 目錄 一、MySQL表內容的增刪查改1.1 Create1.1.1 單行數據全列插入1.1.2 多行數據指定列插入1.1.3 插入否則更新1.1.4 數據替換 1.2 Ret…

MS Word表格寬度自適應

x.1 問題&#xff1a; 你的表格可能并沒有占滿整行&#xff0c;且右對齊&#xff0c;例如如下&#xff0c; x.2 解決方式 這個時候你想右對齊&#xff0c;你可以這么操作&#xff0c;點左上角的十字全選表格&#xff0c; 在布局里選擇自動對齊&#xff0c; 對齊方式選擇居中右…

git日常操作-案例

文章目錄 查看tag對應版本tag一個版本切換到指定tag查看遠程有那些分支 查看tag對應版本 要查看 Git 倉庫中標簽&#xff08;tag&#xff09;對應的版本&#xff0c;可以使用以下命令&#xff1a; git show <tag>將 替換為你要查看的標簽名稱。該命令將顯示與標簽對應的…