这是我记录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 = "序号"; //增加序号列elsecell = model->headerData(col - 1, Qt::Horizontal).toString();xlsx.write(1, col + 1, cell, headerFormat);// 设置列宽int columnWidth = cell.toLocal8Bit().length() + 2; //计算字符串长度,中文字符占位2if (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);elsecell = model->data(model->index(row, col - 1)).toString();xlsx.write(row + 2, col + 1, cell, itemFormat);// 设置列宽int columnWidth = cell.toLocal8Bit().length() + 2; //计算字符串长度,中文字符占位2if (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,作者周不易,在此也表示感谢!