Qt 使用QXlsx将QTableView数据导出到Excel表格
这是我记录Qt学习过程的第7篇心得文章,上次写到使用QAxObject将QTableView数据导出到Excel表格,使用过程中发现,执行效率不高,而且当电脑同时安装Office和WPS时,还经常出错,于是就研究了QXlsx,发现利用QXlsx处理Excel真的太方便了,啥也不说,上代码。
实现代码:
//将QTableView数据写入EXcel,使用QXlsx
bool Skysonya::writeTableviewToExcelByQXlsx(const QString &fileName, QString tableName, QTableView *tableView,QString strTitle)
{
QAbstractTableModel *model = qobject_cast<QAbstractTableModel *>(tableView->model());
int rowCount = model->rowCount();
int colCount = model->columnCount();
QXlsx::Document xlsx;
xlsx.addSheet(tableName);
int colW[200] = {};
// 写入表头并设置字体
QXlsx::Format headerFormat;
headerFormat.setFontName("黑体"); //设置字体
headerFormat.setFontSize(12); //设置字号
headerFormat.setHorizontalAlignment(QXlsx::Format::AlignHCenter); //设置单元格居中
headerFormat.setBorderStyle(QXlsx::Format::BorderThin); //设置单元格边线
// 写入表头
for (int col = 0; col < colCount + 1; ++col)
{
QString cell;
if (col == 0)
cell = "序号"; //增加序号列
else
cell = model->headerData(col - 1, Qt::Horizontal).toString();
xlsx.write(1, col + 1, cell, headerFormat);
// 设置列宽
int columnWidth = cell.toLocal8Bit().length() + 2; //计算字符串长度,中文字符占位2
if (columnWidth > colW[col])
{
colW[col] = columnWidth;
xlsx.setColumnWidth(col + 1, columnWidth); // 设置每列宽度为字符数+2
}
}
// qDebug() << "1:" << ArrayToString(colW, colCount) << Qt::endl;
qDebug() << strTitle + ":数据表头写入成功!" << Qt::endl;
QXlsx::Format itemFormat;
itemFormat.setHorizontalAlignment(QXlsx::Format::AlignHCenter);
itemFormat.setBorderStyle(QXlsx::Format::BorderThin);
// 写入数据
for (int row = 0; row < rowCount; ++row)
{
for (int col = 0; col < colCount + 1; ++col)
{
QString cell;
if (col == 0)
cell = QString::number(row + 1);
else
cell = model->data(model->index(row, col - 1)).toString();
xlsx.write(row + 2, col + 1, cell, itemFormat);
// 设置列宽
int columnWidth = cell.toLocal8Bit().length() + 2; //计算字符串长度,中文字符占位2
if (columnWidth > colW[col])
{
colW[col] = columnWidth;
xlsx.setColumnWidth(col + 1, columnWidth); // 设置每列宽度为字符数+2
}
}
// qDebug() << QString::number(row + 2) + ":" << ArrayToString(colW, colCount) << Qt::endl;
}
qDebug() << strTitle + ":数据表数据写入成功!" << Qt::endl;
// 保存文件
if (!xlsx.saveAs(fileName))
{
messageBox("warning", strTitle, "保存Excel文件失败!");
return false;
}
qDebug() << strTitle + ":保存Excel文件成功!" << Qt::endl;
xlsx.deleteLater();
return true;
}
messageBox()函数参考拙文QT实现QMessageBox中文按钮
QXlsx下载与配置,查阅QXlsx Qt操作excel,作者周不易,在此也表示感谢!