Qt保存Excel格式数据
作者:快盘下载 人气:85目录
- 前言
- 1、下载源码
- 2、编译源码
- 3、写Excel数据示例
前言
本文以一个示例介绍了如何使用 libxlsxwriter 开源库保存QTableWidget表格中的数据到Excel文件。libxlsxwriter 是一个C语言库;可用于将文本、数字、公式和超链接写入Excel 2007以上的excel文件中的多个工作表。它支持的特性非常丰富;如合并单元格、设置字体样式、设置单元格样式、支持图标、支持各种操作系统等;这里就不一一列举了;除此之外它唯一依赖zlib库。
1、下载源码
zlib 下载地址; https://github.com/madler/zlib
libxlsxwriter 下载地址;https://github.com/jmcnamara/libxlsxwriter
2、编译源码
这里我们使用cmake 来生成vs工程进行编译。首先编译zlib;打开cmake GUI客户端;设置好zlib源码路径和构建路径;如下图所示;
点击 【Configure】按钮配弹出如下页面;选择vs版本及目标平台;默认是32位;这里选择64位;编译器用默认选项即可。
再点击【Generate】按钮生成VS工程;点击【Open Project】打开创建的vs工程;切换到Release模式;在ALL_BUILD 工程上右键生成;等待编译完成。编译结束后打开build/Release目录可以看到生成了zlib的静态库zlibstatic.lib 和 动态库zlib 、zlib.dll。如下图所示
接下来我们编译libxlswriter;同样用cmake生成VS工程进;在cmakeGUI中设置好libxlswriter的源码根目录及build目录后;点击【Configure】按钮;在弹出的页面中选择与编译zlib相同的配置;配置结束后会提示zlib找不到;这时需要我们手动设置zlib的两个配置项;ZLIB_INCLUDE_DIR 、ZLIB_LIBRARY_RELEASE;这里我们选择zlib的静态库;配置好之后再次点击【Configure】按钮;效果如下图所示
点击【Generate】按钮生成VS工程;在【解决方案】上右键选择【批生成】菜单;在弹出的页面中勾选 ALL_BUILD的Debug和Release;然后点击生成按钮;等待编译完成。注意这里xlswriter默认生成静态库
我遇到的问题是;在工程的属性配置中没有链接zlibstatic库;导致在使用xlswriter时报zlib中对应api符号找不到的错误;如果你也遇到类似的情况;可以在这一步手动添加zlib静态库链接;如下图所示。
编译完成后在build/Release目录中看到已经生成了xlswriter的静态库。如下图所示
3、写Excel数据示例
在Qt Creator中新建excelDemo项目;在pro目录下新建libxlswriter目录;接着创建include和lib目录;将xlsxwriter.lib和include目录下的文件拷贝到libxlswriter对应目录下;如图所示
在pro文件中引入libxlswriter库;添加下面两行代码到pro文件中
INCLUDEPATH ;= $$PWD/libxlswriter/include
LIBS ;= -L$$PWD/libxlswriter/lib -lxlsxwriter
在UI文件中拖拽一个QPushButton按钮和一个QTableWidget表格控件;布局如下

当点击保存按钮时;将表格中的数据写到excel文件中;并打开保存的excel文件;我们在cpp文件中向QTableWidget添加一些测试数据;
void MainWindow::initTableWidget()
{ ui->tableWidget->horizontalHeader()->setStretchLastSection(true); QList<QStringList> dataList; QStringList rowData; rowData << ;1; << tr(;20220120;) << tr(;张三;) <<tr(;18;); dataList.append(rowData); rowData.clear(); rowData << ;2; << tr(;20220121;) << tr(;李四;) <<tr(;19;); dataList.append(rowData); rowData.clear(); rowData << ;3; << tr(;20220122;) << tr(;王五;) <<tr(;19;); dataList.append(rowData); rowData.clear(); rowData << ;4; << tr(;20220123;) << tr(;赵六;) <<tr(;17;); dataList.append(rowData); for(int i = 0; i < dataList.size(); i;;) { rowData = dataList[i]; ui->tableWidget->insertRow(i); for(int j = 0; j < rowData.size(); j;;) { QTableWidgetItem *pItem = new QTableWidgetItem(rowData[j]); ui->tableWidget->setItem(i, j, pItem); } } }
在保存按钮的响应函数中;添加代码保存数据。
void MainWindow::slot_btnClicked() { QString fileName = QFileDialog::getSaveFileName(this, tr(;输入保存文件名称;)); if(fileName.isEmpty()) { return; } //lxw_workbook 代表Excel文件 lxw_workbook *pWorkBook = workbook_new(fileName.toLocal8Bit().data()); //lxw_worksheet 代表sheet页 lxw_worksheet *pWorkSheet = workbook_add_worksheet(pWorkBook, tr(;学生信息;).toUtf8().data()); lxw_format *pHeaderFormat = workbook_add_format(pWorkBook); format_set_bold(pHeaderFormat); format_set_align(pHeaderFormat, LXW_ALIGN_CENTER); format_set_align(pHeaderFormat, LXW_ALIGN_VERTICAL_CENTER); format_set_border(pHeaderFormat, LXW_BORDER_THIN); int row = 0; for(int i = 0; i < ui->tableWidget->columnCount(); i;;) { QTableWidgetItem* pHeaderItem = ui->tableWidget->horizontalHeaderItem(i); worksheet_write_string(pWorkSheet, row, i, pHeaderItem->text().toUtf8().data(), pHeaderFormat); } row;;; lxw_format *pItemFormat = workbook_add_format(pWorkBook); format_set_align(pItemFormat, LXW_ALIGN_CENTER); format_set_align(pItemFormat, LXW_ALIGN_VERTICAL_CENTER); format_set_border(pItemFormat, LXW_BORDER_THIN); for(int i = 0; i < ui->tableWidget->rowCount(); i;;) { for(int j = 0; j < ui->tableWidget->columnCount(); j;;) { QTableWidgetItem* pItem = ui->tableWidget->item(i, j); worksheet_write_string(pWorkSheet, row, j, pItem->text().toUtf8().data(), pItemFormat); } row;;; } lxw_error error = workbook_close(pWorkBook); if(error != LXW_NO_ERROR) { qDebug() << ;save excel failed!;; } QFileInfo fileInfo(fileName); QString fileDirPath = fileInfo.absoluteFilePath(); //打开文件所在目录 QDesktopServices::openUrl(QUrl(QString(;file:///%1;).arg(fileDirPath))); //打开保存的Excel文件 QDesktopServices::openUrl(QUrl(QString(;file:///%1;).arg(fileName))); }
从上面的代码可以看出libxlswriter的使用也是非常简单的。下面是程序运行效果;及导出的Excel文件打开后的效果。


以上就是本篇的所有内容了;关于libxlswriter的更多用法;可以自己研究学习;并不难。对以上内容有疑问的朋友;欢迎 留言讨论。
加载全部内容