QT--生成Excel文件

快要赶不上生活本身的温柔和可爱了。
提示:本文是作者学习的记录,若有错误指出,作者虚心请教。

一、 设置编码

一般程序按照16进制,8进制,2进制以及十进制来传输数据的,所以一般中文会在应用程序中形成乱码,为了避免这种情况,我们会在.cpp文件的开始将UTF-8编码

//设置编码为UTF8
    static void SetUTF8Code()
    {
#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
        QTextCodec *codec = QTextCodec::codecForName("UTF-8");
        QTextCodec::setCodecForLocale(codec);
        QTextCodec::setCodecForCStrings(codec);
        QTextCodec::setCodecForTr(codec);
#endif
    }

二、生成Excel文件步骤

1.添加开发工具

需要在QT官网上添加以下两个文件,记住自己的编译器(QTcreator是32位还是64位的)根据自己的需求下载对应的版本。
在这里插入图片描述
下载要求以及注意事项:
1. 将QtXlsxWriter-master解压,然后拷到任意一个盘下,C盘除外
2. 用QtCreator打开QtXlsxWriter-master的工程
3. 导入工程
4. 修改QVector,将QList改为QVector
5. 编译工程
6. 退出工程
7. 重新打开工程,编译工程
8. 退出工程,然后打开Qt的命令行,进入QtXlsxWriter-master的目录(注意是QT的命令行不是cmd命令行)
9. 输入qmake
10. 输入Mingw32-make
11. 等待编译完成.
12. Mingw32-make install

13. 等待安装完成。可使用命令行perl-v查看是否安装成功

2.添加命令行

首先要生成Excel文件的话,需要在Pro文件上添加


    QT+=xlsx

3.添加库文件

在.h头文件里添加


  #include <QtXlsx>

在.cpp文件里添加


#include <QtWidgets/QApplication>
#include <QtXlsx/QtXlsx>
.......
 QXlsx::Document xlsx;
    xlsx.write("A1", "Hello Qt!");
    xlsx.saveAs("Test.xlsx");
.......

4.运行程序

可在debug/ /Release目录下生成excel文件

三、保存Excel路径

绝对路径: 文件在硬盘上真正存在的路径。例如“EXCEL.xlsx”这个图片是存放在硬盘的“C:\TEST\目录下,那么 “EXCEL.xlsx”这个图片的绝对路径就是“C:\TEST\EXCEL.xlsx";

相对路径:由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系

如:当前文件1的路径是/user/File/文件1/文件1.txt,
文件2的路径是/user/File/文件2/文件2.txt
那么file2相对于file的路径就是“…/文件2/文件2.txt”。
相对路径里常使用 “…/” 来表示上一级目录

使用代码保存excel时
QString filepath = QFileDialog::getSaveFileName()各个参数的含义如图所示:
在这里插入图片描述

四、Excel对象简介

在进行excel交互之前,有必要了解excel对象。
尤其是使用QAxObject类导出表格时
在这里插入图片描述

五、导出Excel数据文件

在.cpp文件下编辑代码,可点击pushbutton按钮时导出下位机传输的数据文件,并且可选择文件保存的地方和修改文件的名称等。
代码如下(示例):

1.方法一:

//保存数据Excel表格
void control::on_btnExport_clicked()   //利用按钮的槽函数
{
    QString strPath;  //定义路径为字符串
    strPath = QFileDialog::getSaveFileName(this,"保存文件","G:","Excel File(*.xlsx)");//保存文件以Excel形式保存
    if(strPath == "")
    {
        return ;
    }

    else
    {
        //uint8_t i,j;
        QXlsx::Document xlsx;  //创建Excel文件
        QXlsx::Document xlsxPara;
        QXlsx::Format Format1;  //设置该单元的样式
        QDateTime currenttime;  //显示当前的时间
        QString currenttimestring;
        QString QStrSheetName;  //定义表格名称字符串QStrSheetName

        Format1.setHorizontalAlignment(QXlsx::Format::AlignHCenter);/*横向居中*/
        Format1.setBorderStyle(QXlsx::Format::BorderDashDotDot);/*边框样式*/
        Format1.setVerticalAlignment(QXlsx::Format::AlignVCenter);//横向居中
       // Format1.setPatternBackgroundColor(QColor(218,238,243));
        Format1.setFontSize(13);

        QXlsx::Format headFormat;  //设置表头样式
        headFormat.setPatternBackgroundColor(QColor(218,238,243));    //设置背景颜色
        headFormat.setFontSize(13);  //设置字体大小
        headFormat.setHorizontalAlignment(QXlsx::Format::AlignHCenter);  //横向居中
        headFormat.setVerticalAlignment(QXlsx::Format::AlignVCenter);
        headFormat.setBorderStyle(QXlsx::Format::BorderDashDotDot);/*边框样式*/

        //建立Sheet
        QStrSheetName = "FFT记录表";  //工作簿的名称
        QStrSheetName += QString::number(1);
        xlsx.addSheet(QStrSheetName);  //添加该命名的工作簿

        //写入第一行,第一行是目录
        xlsx.write(1,1,"时间(秒)",headFormat); //表格的第一行第一列显示时间(秒),表头
        xlsx.setColumnWidth(1,15);//宽度15
        xlsx.write(1,2,"J1",headFormat);//第一行第二列设置为J1,表头
        xlsx.setColumnWidth(2,15);
        xlsx.write(2,1,"str"); 
//线程:保存Excel文件
  bool b = xlsx.saveAs(strPath);
    }

}

2.方法二:

               uchar rs[4];
                rs[0]=rcvBuf[6];
                rs[1]=rcvBuf[7];
                rs[2]=rcvBuf[8];
                rs[3]=rcvBuf[9];
                float FF_No;
                memcpy_s(&FF_No,sizeof (float),rs,4);
                QString Str_No = QString::number(FF_No);
                ui->gas14->setPalette(palette);
                ui->gas14->setText(Str_No);
                this->ui->label_No->setText("正常运行");
                ui->label_No->setStyleSheet("color:green");


```cpp
void MainWindow::on_bt_openfile_clicked()
{
    //数据         
    QString str_CO2="123";         
    dataList_CO2.push_back(QList<QVariant>() <<Str_CO2);
    QString filepath = QFileDialog::getSaveFileName(this, QString::fromLocal8Bit("导出表格"), ".", tr("Excel File(*.xlsx)"));//获取保存路径
    //"Excel File(*.xlsx)"
    if (!filepath.isEmpty()) {
        ui->savefilepath->setText(filepath);
        //              QAxObject *excel = new QAxObject(this);
        excel->setControl("Excel.Application");//连接Excel控件
        excel->dynamicCall("SetVisible (bool Visible)", "false");//不显示窗体
        excel->setProperty("DisplayAlerts", false);//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示

        QAxObject *workbooks = excel->querySubObject("WorkBooks");//获取工作簿集合
        workbooks->dynamicCall("Add");//新建一个工作簿
        QAxObject *workbook = excel->querySubObject("ActiveWorkBook");//获取当前工作簿
        QAxObject *worksheets = workbook->querySubObject("Sheets");//获取工作表集合
        QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1);//获取工作表集合的工作表1,即sheet1
        //CO2的数值
        QAxObject* user_titleCO2 = worksheet->querySubObject("Range(const QString&)", "A1");//写数据在表格的范围(A1:A列1行位置;D100:D列100行位置)
        QString M_CO2="CO2数值";
        user_titleCO2->dynamicCall("SetValue(const QVariant&)", QVariant(M_CO2));
        QAxObject* user_rangeCO2 = worksheet->querySubObject("Range(const QString&)", "A2:A200");//写数据在表格的范围(A1:A列1行位置;D100:D列100行位置)
        user_rangeCO2->dynamicCall("SetValue(const QVariant&)", QVariant(dataList_CO2));

        workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(filepath));//保存至filepath,注意一定要用QDir::toNativeSeparators将路径中的"/"转换为"\",不然一定保存不了。
        workbook->dynamicCall("Close()");//关闭工作簿
        excel->dynamicCall("Quit()");//关闭excel
        //             delete excel;
        //             excel = NULL;
        QMessageBox::information(this,"提示","导出数据成功!");
         }
}

总结

以上就是直接生成Excel文件,以及通过Pushbutton按钮将生成Excel数据文件导出。

  • 4
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值