这是我记录Qt学习过程的第6篇心得文章,主要是方便自己编写的应用程序导出Excel数据的,走了不少弯路直接上代码。
实现代码:
//人员信息导出
ui->pbtn2->setEnabled(false);
// 打开文件对话框,选择 excel文件
QString fileName = QFileDialog::getSaveFileName(this, "人员信息导出", "personnel", "excel文件(*.xlsx)");
if (fileName.isEmpty()) return;
this->fun_statusBar("人员信息导出 " + fileName);
// 创建Excel应用程序对象
QAxObject *excel = new QAxObject("Excel.Application");
if (!excel->isNull())
{
this->fun_statusBar("人员信息导出 创建Excel对象成功!");
excel->setProperty("Visible", false); //设置为false以在后台运行
// excel->setProperty("SetVisible(bool)", false); //设置为false以在后台运行
// 新建工作簿
QAxObject *workbooks = excel->querySubObject("Workbooks");
this->fun_statusBar("人员信息导出 新建Excel工作簿成功!");
// 添加一个工作簿
QAxObject *workbook = workbooks->querySubObject("Add");
this->fun_statusBar("人员信息导出 添加Excel工作簿成功!");
QAxObject *worksheets = workbook->querySubObject("Worksheets");
// 获取第一个工作簿
// QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1);
QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)", 1);
this->fun_statusBar("人员信息导出 打开Excel获取第一个工作表成功!");
// 设置工作表标题
worksheet->setProperty("Name", "personnel");
// 获取表格数据模型 根据自己表格使用的数据模型更改为 QAbstractItemModel获其他
QSqlRelationalTableModel *itemModel = qobject_cast<QSqlRelationalTableModel *>(ui->tableView->model());
if (itemModel)
{
this->fun_statusBar("人员信息导出 打开数据表成功!");
int rowCount = itemModel->rowCount();
int colCount = itemModel->columnCount();
QString str = "";
// 写入表头
for (int col = 1; col <= colCount; ++col)
{
QString data = itemModel->headerData(col - 1, Qt::Horizontal).toString();
QAxObject *cell = worksheet->querySubObject("Cells(int,int)", 1, col);
cell->setProperty("Value", data);
str += data + " ";
// 设置文字格式
QAxObject *range = cell->querySubObject("Characters()");
QAxObject *font = range->querySubObject("Font");
font->setProperty("Name", "黑体"); // 字体名称
font->setProperty("Size", 12); // 字体大小
font->setProperty("Color", 0x000000); // 字体颜色(蓝色)
cell->setProperty("HorizontalAlignment", -4108); // 水平居中
cell->setProperty("VerticalAlignment", -4108); // 垂直居中
//设置列宽
QAxObject *column = worksheet->querySubObject("Columns(int)", col + 1);
int columnWidth{};
switch (col)
{
case 0:
case 2:
case 3:
columnWidth = 10;
break;
case 7:
columnWidth = 12;
break;
case 8:
columnWidth = 50;
break;
case 11:
case 12:
columnWidth = 14;
break;
default:
columnWidth = 20;
break;
}
column->setProperty("ColumnWidth", columnWidth); // 设置每列的宽度根据实际自己调整
delete font;
delete range;
delete column;
delete cell;
}
qDebug() << "人员信息导出:表头写入 " + str << Qt::endl;
// 写入数据
for (int row = 2; row <= rowCount; ++row)
{
str = "";
for (int col = 1; col <= colCount; ++col)
{
QVariant data = itemModel->index(row - 2, col - 1).data();
QAxObject *cell = worksheet->querySubObject("Cells(int,int)", row, col);
// 前缀单引号以确保作为文本处理
if (data.toString().length() == 18 && data.toString().contains(QRegExp("\\d{18}")))
{
// 检查是否是身份证号(假设身份证号是18位数字)
cell->dynamicCall("SetValue(const QVariant&)", QString("'") + data.toString());
}
else if (data.toString().length() == 11 && data.toString().contains(QRegExp("\\d{11}")))
{
// 检查是否是手机号码(假设手机号码是11位数字)
cell->dynamicCall("SetValue(const QVariant&)", QString("'") + data.toString());
}
else
{
cell->dynamicCall("SetValue(const QVariant&)", data.toString());
}
// 设置单元格格式为文本
cell->setProperty("NumberFormat", "@"); // "@" 表示文本格式
cell->setProperty("HorizontalAlignment", -4108); // 水平居中
cell->setProperty("VerticalAlignment", -4108); // 垂直居中
str += data.toString() + " ";
delete cell;
}
qDebug() << "人员信息导出:数据写入 " + str << Qt::endl;
}
this->fun_statusBar("人员信息导出 数据表数据写入成功!");
// 保存工作簿
if (!workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(fileName)).toBool())
{
skysonya.messageBox("warning", wTitle, "保存Excel文件失败!");
}
}
else
{
skysonya.messageBox("warning", wTitle, "打开数据表失败!");
}
// 关闭工作簿
workbook->dynamicCall("Close (bool)", false);
// 退出Excel应用程序
excel->dynamicCall("Quit()");
// 清理对象
delete worksheet;
delete worksheets;
delete workbook;
delete workbooks;
delete excel;
}
else
{
skysonya.messageBox("warning", wTitle, "创建Excel对象失败!");
}
ui->pbtn2->setEnabled(true);
this->fun_statusBar()为自己构建的函数,代码如下:
//状态栏信息显示
void MainWindow::fun_statusBar(QString str)
{
str = " 提示信息:" + str;
this->statusBar()->showMessage(str);
qDebug() << str << Qt::endl;
}
skysonya.messageBox()函数前文中已有介绍。