QtXlsx库
- QtXlsx介绍
- QtXlsx + Qt配置
- 简单使用示例
QtXlsx介绍
QtXlsx是一个可以读取和写入Excel文件的库。它不需要Microsoft Excel,可以在Qt5支持的任何平台上使用。 这里一定是需要QT5支持的。
- 生成一个新的 .xlsx 文件
- 从现有的 .xlsx 文件中提取数据
- 编辑现有的 .xlsx 文件
区别于QAxObject不同的是,QAxObject需要WPS或者Office控件的支持,而且读写有卡顿,若是电脑上安装了PDF工具,也有可能会在调用的时候出现一些非正常错误。
QtXlsx + Qt配置
-
安装perl
这里选择官网下载安装即可(懒人安装方法,这里不列举或者腾讯应用中下载一个老版本)。
官网地址:https://platform.activestate.com/tangxing806/ActivePerl-5.28/distributions安装是否成功,可以打开命令提示符(CMD)查看,如下图即安装OK:
如果提示找不到命令,则是未安装成功! -
QtXlsx源码下载
源码地址:https://github.com/dbzhang800/qtxlsxwriter
下载之后得到如图所示文件
打开 Qt 5.14.2 (MinGW 7.3.0 32-bit)按照如下图示操作即可(根据自己Qt版本选择就行)。 -
MinGW32配置
进入刚才解压后的文件夹找到src如图:
切换到当前目录下面
执行如下指令即可。
qmake src.pro
mingw32-make
mingw32-make install
等待命令完成!
然后进入自己的项目.pro文件添加
QT += xlsx
下一步就是项目里面头文件导入
#include “xlsxdocument.h”
使用参考简单示例
简单使用示例
bool MainWindow::saveDataToExcel(const QString _strFilePath, QString _strFileName)
{
// 检查路径下是否存在PGFile文件夹,存在则跳过,不存在就创建
QString folderPath = _strFilePath + QString("/PGFile");
qDebug()<< folderPath;
// 创建QDir对象
QDir dir;
// 检查文件夹是否存在
if(dir.exists(folderPath)) {
qDebug()<< "文件夹已存在,跳过,请忽略错误";
} else {
// 尝试创建文件夹
if(dir.mkpath(folderPath)) {
// success
} else {
QMessageBox::information(this,QStringLiteral("错误提示"),QStringLiteral("PGFile文件夹创建失败"));
return false;
}
}
// 创建excel文件名
QString excelName = folderPath + QString("/") + _strFileName;
#if 1 // 使用xlsx可以不依赖wps或者office,但是QAxObject依赖,并且很卡顿
// 创建xlsx文件
QXlsx::Document xlsx;
RKQPoint writePoint;
// 遍历需要写入的文件
for(int i = 0; i < m_saveVec.size(); i++) {
// 创建A行
QString aString = QString("A%1").arg(i+1);
xlsx.write(aString, m_saveVec[i].point_x);
// 创建B行
QString bString = QString("B%1").arg(i+1);
xlsx.write(bString, m_saveVec[i].point_y);
}
// 写入excel文件
xlsx.saveAs(excelName);
#else
// 创建Excel应用对象
QAxObject* excel = new QAxObject("Excel.Application");
if(excel) {
// 打开Excel文件
QAxObject* workBooks = excel->querySubObject("workBooks");
QAxObject* workBook = workBooks->querySubObject("Open(const QString&)",excelName);
if(workBook) {
// 获取第一个工作表
QAxObject* workSheets = workBook->querySubObject("workSheets");
QAxObject* workSheet = workSheets->querySubObject("Item(int)",1);
if(workSheet) {
// 将数据转换为QVariantList和QVariantMap
QVariantList rows;
for(int i = 0; i < m_saveVec.size(); ++i) {
QVariantMap row;
row["Gray"] = m_saveVec[i].point_x;
row["Power"] = m_saveVec[i].point_y;
rows.append(row);
}
// 写入数据到Excel表
for(int n = 0; n < m_saveVec.size(); ++n) {
QAxObject* range = workSheet->querySubObject("Cells(int,int)",n+1, 1);
range->dynamicCall("SetValue(const QVariant&)",m_saveVec[n].point_x);
delete range;
range = workSheet->querySubObject("Cells(int,int)",n+1, 2);
range->dynamicCall("SetValue(const QVariant&)",m_saveVec[n].point_y);
delete range;
}
// 保存Excel文件
workBook->dynamicCall("SaveAs(const QString&)",excelName);
workSheet->dynamicCall("Activate()");
workBook->dynamicCall("Close()");
excel->dynamicCall("Quit()");
delete workSheet;
delete workSheets;
delete workBook;
}
}
delete workBooks;
delete excel;
}
#endif
qDebug()<< "保存成功!";
return true;
}
项目用到了QAxObject和QtXlsx,记录一下。