前言
QAxObject和qtxlsx都可以处理表格,QAxObject比较慢,并且功能少,建议是使用qtxlsx。
功能讲解
QAxObject
QAxObject
是 Qt 框架中的一个类,用于通过 COM(Component Object Model)自动化与 Windows 平台上的 ActiveX 控件进行交互。
使用QAxObject时,需要在.pro文件中加入QT+=axcontainer,
这个模块提供了对 ActiveX 容器的支持,使得可以使用 QAxObject
等类来与 ActiveX 控件进行交互。
#include <QCoreApplication>
#include <QAxObject>
#include <QDebug>
int realexcel()
{
// 创建 Excel 应用对象
QAxObject *excel = new QAxObject("Excel.Application");
//excel->setControl("ket.Application");//wps
excel->setControl("Excel.Application"); //Excel
// 获取工作簿集合
QAxObject *workbooks = excel->querySubObject("Workbooks");
// 打开一个现有的工作簿
QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", "D:\\test.xlsx");
// 获取第一个工作表
QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);
// 获取工作表的维度
QAxObject *usedRange = worksheet->querySubObject("UsedRange");
// 获取行数和列数
int rowCount = usedRange->property("Rows").toVariant().toList().size();
int colCount = usedRange->property("Columns").toVariant().toList().size();
// 读取数据
for (int row = 1; row <= rowCount; ++row) {
for (int col = 1; col <= colCount; ++col) {
QAxObject *cell = worksheet->querySubObject("Cells(int,int)", row, col);
QVariant cellValue = cell->property("Value");
qDebug() << "Cell(" << row << "," << col << "):" << cellValue.toString();
}
}
// 释放资源
workbook->dynamicCall("Close()");
excel->dynamicCall("Quit()");
delete excel;
}
void writeexcel(){
// 创建 Excel 应用对象
QAxObject *excel = new QAxObject("Excel.Application");
//excel->setControl("ket.Application");//wps
excel->setControl("Excel.Application"); //Excel
// 获取工作簿集合
QAxObject *workbooks = excel->querySubObject("Workbooks");
// 创建一个新的工作簿
QAxObject *workbook = workbooks->querySubObject("Add()");
// 获取第一个工作表
QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);
// 写入数据
worksheet->querySubObject("Cells(int,int)").toVariant().setValue("Hello", 1, 1); // A1 单元格
worksheet->querySubObject("Cells(int,int)").toVariant().setValue(123, 1, 2); // B1 单元格
// 写入一行数据
QAxObject *row = worksheet->querySubObject("Rows(int)").toVariant().value<QAxObject*>(1);
for (int col = 1; col <= 3; ++col) {
row->querySubObject("Cells(int)").toVariant().setValue(QString("Row1-Col%1").arg(col), col);
}
// 保存并关闭工作簿
workbook->querySubObject("Save()");
workbook->querySubObject("Close()");
// 退出 Excel 应用
excel->dynamicCall("Quit()");
delete excel;
}
使用QAxObject写数据到excel时(即使内容很少),都会卡个5秒钟以上,才会生成文件。
qtxlsx
QTXlsx
是 第三方工具QtXlsxWriter
的一部分,读写excel非常快,需要下载工具:QT读写excel文件的第三方工具QtXlsxWriter
解压后,把src目录整个拷贝到你的项目与main.cpp文件同一级目录下,并且在.pro文件中加入
include(src/xlsx/qtxlsx.pri) 即可引入qtxlsx,下面是保存数据到excel
#include "xlsxdocument.h"
#include "xlsxworksheet.h"
void MainWindow::saveexcel(QTableWidget *tableWidget, const QString &fileName)
{
QXlsx::Document xlsx;
QXlsx::Worksheet *worksheet = xlsx.currentWorksheet();
// 设置表头和数据
for (int row = 0; row < tableWidget->rowCount(); ++row) {
for (int col = 0; col < tableWidget->columnCount(); ++col) {
QTableWidgetItem *item = tableWidget->item(row, col);
if (item) {
worksheet->write(row + 1, col + 1, item->text());
} else {
worksheet->write(row + 1, col + 1, "");
}
}
}
//合并表头
xlsx.mergeCells(QXlsx::CellRange(1, 1, 1, tableWidget->columnCount()));
// 保存到文件
xlsx.saveAs(fileName);
}
使用qtxlsx读写的代码都很简洁,并且很快就生成excel文件。