引言
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 }
标签:QXlsx,Qt,xlsx,int,Excel,cell,include From: https://www.cnblogs.com/ybqjymy/p/18167336