引言
Qt无自带的库处理Excel 文件,但可通过QAxObject 借助COM接口进行Excel的读写1。亦可使用免费的开源第三方库:QXlsx,一个基于Qt库开发的用于读写Microsoft Excel文件的C++库。它提供了一组简单易用的API,可以方便地创建、修改和操作Excel文件。
一、安装配置
1.下载源码,如下图所示,QXlsx就是核心代码,里面还包含了很多示例。
2.创建一个工程,控制台或者带界面的都可以,将QXlsx
复制到工程目录下。
3.在.pro文件
中添加以下语句,将QXlsx
添加到工程中,保存pro文件 (自动会执行qmake 或自己手动执行) :
1 # QXlsx code for Application Qt project
2 QXLSX_PARENTPATH=./QXlsx/ # current QXlsx path is . (. means curret directory)
3 QXLSX_HEADERPATH=./QXlsx/header/ # current QXlsx header path is ./header/
4 QXLSX_SOURCEPATH=./QXlsx/source/ # current QXlsx source path is ./source/
5 include(./QXlsx/QXlsx.pri)
二、简单测试
1.创建一个.xlsx
文件,对单元格赋值,保存到磁盘上。
1 #include "mainwindow.h"
2 #include <QApplication>
3
4 // QXlsx
5 #include "xlsxdocument.h"
6 #include "xlsxchartsheet.h"
7 #include "xlsxcellrange.h"
8 #include "xlsxchart.h"
9 #include "xlsxrichstring.h"
10 #include "xlsxworkbook.h"
11
12 int main(int argc, char *argv[])
13 {
14 // QApplication a(argc, argv);
15 // MainWindow w;
16 // w.show();
17
18 // return a.exec();
19 // 测试QXlsx
20 QXlsx::Document xlsx;
21 xlsx.write("A1", "A1"); // (A,1) 第一行第一列
22 xlsx.write(1, 2, "A2"); // (A,2) 第一行第二列
23 xlsx.saveAs("Test.xlsx"); // 保存
24 return 0;
25 }
2.读取一个.xlsx
文件,输出到控制台。(使用官方的ShowConsole
代码)
修改官方代码.pro
文件,配置添加QXlsx。修改xlsxFileName
为刚才生成的Test.xlsx
,运行即可。
1 // main.cpp
2
3 #include <iostream>
4 #include <vector>
5
6 #include <QCoreApplication>
7 #include <QDebug>
8 #include <QDir>
9 #include <QVariant>
10 #include <QtCore>
11 #include <QtGlobal>
12 using namespace std;
13
14 // [0] include QXlsx headers
15 #include "xlsxcellrange.h"
16 #include "xlsxchart.h"
17 #include "xlsxchartsheet.h"
18 #include "xlsxdocument.h"
19 #include "xlsxrichstring.h"
20 #include "xlsxworkbook.h"
21 using namespace QXlsx;
22
23 #include "fort.hpp" // libfort
24
25 int main(int argc, char *argv[])
26 {
27 QCoreApplication app(argc, argv);
28
29 // get xlsx file name
30 QString xlsxFileName = "Test.xlsx";
31 qDebug() << xlsxFileName;
32
33 // tried to load xlsx using temporary document
34 QXlsx::Document xlsxTmp(xlsxFileName);
35 if (!xlsxTmp.isLoadPackage()) {
36 qCritical() << "Failed to load" << xlsxFileName;
37 return (-1); // failed to load
38 }
39
40 // load new xlsx using new document
41 QXlsx::Document xlsxDoc(xlsxFileName);
42 xlsxDoc.isLoadPackage();
43
44 int sheetIndexNumber = 0;
45 foreach (QString curretnSheetName, xlsxDoc.sheetNames()) {
46 QXlsx::AbstractSheet *currentSheet = xlsxDoc.sheet(curretnSheetName);
47 if (NULL == currentSheet)
48 continue;
49
50 // get full cells of sheet
51 int maxRow = -1;
52 int maxCol = -1;
53 currentSheet->workbook()->setActiveSheet(sheetIndexNumber);
54 Worksheet *wsheet = (Worksheet *) currentSheet->workbook()->activeSheet();
55 if (NULL == wsheet)
56 continue;
57
58 QString strSheetName = wsheet->sheetName(); // sheet name
59
60 // display sheet name
61 std::cout << std::string(strSheetName.toLocal8Bit()) << std::endl;
62
63 QVector<CellLocation> clList = wsheet->getFullCells(&maxRow, &maxCol);
64
65 QVector<QVector<QString>> cellValues;
66 for (int rc = 0; rc < maxRow; rc++) {
67 QVector<QString> tempValue;
68 for (int cc = 0; cc < maxCol; cc++) {
69 tempValue.push_back(QString(""));
70 }
71 cellValues.push_back(tempValue);
72 }
73
74 for (int ic = 0; ic < clList.size(); ++ic) {
75 // cell location
76 CellLocation cl = clList.at(ic);
77
78 int row = cl.row - 1;
79 int col = cl.col - 1;
80
81 // https://github.com/QtExcel/QXlsx/commit/9ab612ff5c9defc35333799c55b01be31aa66fc2
82 // {{
83 // QSharedPointer<Cell> ptrCell = cl.cell; // cell pointer
84 std::shared_ptr<Cell> ptrCell = cl.cell; // cell pointer
85
86 // value of cell
87 // QVariant var = cl.cell.data()->value();
88 QVariant var = ptrCell->value();
89 // }}
90
91 QString str = var.toString();
92
93 cellValues[row][col] = str;
94 }
95
96 fort::table fortTable;
97 for (int rc = 0; rc < maxRow; rc++) {
98 for (int cc = 0; cc < maxCol; cc++) {
99 QString strTemp = cellValues[rc][cc];
100 fortTable << std::string(strTemp.toLocal8Bit()); // display value
101 }
102 fortTable << fort::endr; // change to new row
103 }
104
105 std::cout << fortTable.to_string() << std::endl; // display forttable row
106
107 sheetIndexNumber++;
108 }
109
110 return 0;
111 }