Qt保存Excel格式数据

目录

      • 前言
      • 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源码路径和构建路径,如下图所示:
Qt保存Excel格式数据_第1张图片
点击 【Configure】按钮配弹出如下页面,选择vs版本及目标平台,默认是32位,这里选择64位,编译器用默认选项即可。
Qt保存Excel格式数据_第2张图片
再点击【Generate】按钮生成VS工程,点击【Open Project】打开创建的vs工程,切换到Release模式,在ALL_BUILD 工程上右键生成,等待编译完成。编译结束后打开build/Release目录可以看到生成了zlib的静态库zlibstatic.lib 和 动态库zlib 、zlib.dll。如下图所示
Qt保存Excel格式数据_第3张图片

接下来我们编译libxlswriter,同样用cmake生成VS工程进,在cmakeGUI中设置好libxlswriter的源码根目录及build目录后,点击【Configure】按钮,在弹出的页面中选择与编译zlib相同的配置,配置结束后会提示zlib找不到,这时需要我们手动设置zlib的两个配置项,ZLIB_INCLUDE_DIR 、ZLIB_LIBRARY_RELEASE,这里我们选择zlib的静态库,配置好之后再次点击【Configure】按钮,效果如下图所示
Qt保存Excel格式数据_第4张图片
点击【Generate】按钮生成VS工程,在【解决方案】上右键选择【批生成】菜单,在弹出的页面中勾选 ALL_BUILD的Debug和Release,然后点击生成按钮,等待编译完成。注意这里xlswriter默认生成静态库
Qt保存Excel格式数据_第5张图片
我遇到的问题是,在工程的属性配置中没有链接zlibstatic库,导致在使用xlswriter时报zlib中对应api符号找不到的错误,如果你也遇到类似的情况,可以在这一步手动添加zlib静态库链接,如下图所示。
Qt保存Excel格式数据_第6张图片
编译完成后在build/Release目录中看到已经生成了xlswriter的静态库。如下图所示
Qt保存Excel格式数据_第7张图片

3、写Excel数据示例

在Qt Creator中新建excelDemo项目,在pro目录下新建libxlswriter目录,接着创建include和lib目录,将xlsxwriter.lib和include目录下的文件拷贝到libxlswriter对应目录下,如图所示
Qt保存Excel格式数据_第8张图片
Qt保存Excel格式数据_第9张图片

Qt保存Excel格式数据_第10张图片
在pro文件中引入libxlswriter库,添加下面两行代码到pro文件中

INCLUDEPATH += $$PWD/libxlswriter/include
LIBS += -L$$PWD/libxlswriter/lib -lxlsxwriter 

在UI文件中拖拽一个QPushButton按钮和一个QTableWidget表格控件,布局如下
Qt保存Excel格式数据_第11张图片
当点击保存按钮时,将表格中的数据写到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文件打开后的效果。

Qt保存Excel格式数据_第12张图片

Qt保存Excel格式数据_第13张图片

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

你可能感兴趣的:(C++,excel,qt,开发语言)