这段代码实现了将Qt界面中的QTableWidget保存为Excel文件的功能。在尝试了网上几个代码后发现会有越界导致程序崩溃的问题,这里做出了改进。
代码写成了点击槽函数,可以直接复制,将TabClientRes改成你自己代码中定义的QTableWidget类的变量名即可。
1.首先在pro文件中添加QT += axcontainer
2.头文件
#include <QString>
#include <QFileDialog>
#include <QDir>
#include <QAxObject>
#include <QTableWidgetItem>
3.下面是代码
// 保存表格为Excel文件
void Widget::on_BtnSaveTabClient_clicked()
{
//获取保存路径
QString filePath = QFileDialog::getSaveFileName(this, tr("Save Excel File"), "", tr("Excel Files (*.xlsx)"));
if (!filePath.isEmpty()) {
filePath = QDir::toNativeSeparators(filePath);
QAxObject* excel = new QAxObject("Excel.Application", this);
excel->dynamicCall("SetVisible(bool)", false);
QAxObject* workbooks = excel->querySubObject("Workbooks");
QAxObject* workbook = workbooks->querySubObject("Add");
QAxObject* sheets = workbook->querySubObject("Sheets");
QAxObject* sheet = sheets->querySubObject("Item(int)", 1);
if (sheet) {
// 获取表头
for (int col = 0; col < ui->TabClientRes->columnCount(); col++) {
QTableWidgetItem* headerItem = ui->TabClientRes->horizontalHeaderItem(col);
if (headerItem)
sheet->querySubObject("Cells(int,int)", 1, col + 1)->setProperty("Value", headerItem->text());
}
// 获取表格数据
for (int row = 0; row < ui->TabClientRes->rowCount(); row++) {
for (int col = 0; col < ui->TabClientRes->columnCount(); col++) {
QTableWidgetItem* item = ui->TabClientRes->item(row, col);
if (item)
sheet->querySubObject("Cells(int,int)", row + 2, col + 1)->setProperty("Value", item->text());
}
}
// 保存文件
workbook->dynamicCall("SaveAs(const QString&)", filePath);
workbook->dynamicCall("Close()");
excel->dynamicCall("Quit()");
}
delete excel;
}
}