四时宝库

程序员的知识宝库

Qt读写excel(Qt读写excel文件)

Qt操作excel主要有以下这些类型的库。



qt6 操作excel 看这个视频

https://www.ixigua.com/7162467187918275076?logTag=786127dd071d6f3182cb

工程配套源码 https://github.com/alantop0720/QT_Demo/tree/main/Qt6_sample/QtExcel

qt5读写excel本文主要介绍下面两种方法

方法一:通过微软的com组件读取,这个方法只适合windows平台,效率较低。

工程文件pro增加如下

QT       += core gui axcontainer

头文件包含

#include <QAxObject>
#include <QMessageBox>
#include <QDir>

导出excel函数

QString filepath = "d:/2.xlsx";//QFileDialog::getSaveFileName(this, QString::fromLocal8Bit("导出表格"), ".", tr("Microsoft Office(*.xlsx)"));//获取保存路径
    if (!filepath.isEmpty()) {
        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

        QAxObject *cell;
        for (int i1 =0 ; i1<3;i1++)
        {
            cell = worksheet->querySubObject("Cells(int,int)", 1,i1+1);
            cell->setProperty("Value", "macd");
        }


        for (int i=0; i < 5; i++)
        {
            for (int j =0 ; j < 5;j++)
            {
                cell=worksheet->querySubObject("Cells(int, int)", i+2,j+1);
                cell->setProperty("Value", "cci");
            }
        }

        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, "123", "345");
    }

方法二:通过qtxlsx库读写excel,支持跨平台

库平台网址: qtxlsx.debao.me

  1. 下载源码编译,编译的时候只编译主工程,example和test两个工程不要编译。
  2. 部署库(根据你自己的qt路径做对应修改)

拷贝bin的下dll到D:\alantop_dir\alantop_sde\Qt\5.15.2\msvc2019_64\bin

把lib目录下的pri和lib拷贝到D:\alantop_dir\alantop_sde\Qt\5.15.2\msvc2019_64\lib

把mkspecs\modules下的pri文件拷贝到D:\alantop_dir\alantop_sde\Qt\5.15.2\msvc2019_64\mkspecs\modules

  1. 增加模块和头文件

pro 增加xlsx

QT       += core gui  xlsx

包含头文件

#include "xlsxdocument.h"
#include "xlsxformat.h"
#include "xlsxcellrange.h"
#include "xlsxchart.h"


操作excel代码

        QXlsx::Document xlsx("test1.xlsx");/*打开一个book1的文件*/
        QXlsx::Format format1;/*设置该单元的样式*/
        format1.setFontColor(QColor(Qt::red));/*文字为红色*/
        format1.setPatternBackgroundColor(QColor(152,251,152));/*北京颜色*/
        format1.setFontSize(15);/*设置字体大小*/
        format1.setHorizontalAlignment(QXlsx::Format::AlignHCenter);/*横向居中*/
        format1.setBorderStyle(QXlsx::Format::BorderDashDotDot);/*边框样式*/
        xlsx.write("A1", "Hello Qt!", format1);/*写入文字,应该刚才设置的样式*/
        xlsx.write(2, 1, 12345, format1);/*写入文字,应该刚才设置的样式*/

        QXlsx::Format format2;/*重新设置另一个单元的样式*/
        format2.setFontBold(true);/*设置加粗*/
        format2.setFontUnderline(QXlsx::Format::FontUnderlineDouble);/*下双划线*/
        format2.setFillPattern(QXlsx::Format::PatternLightUp);/*填充方式*/
        xlsx.write("A4", "=44+33", format2);/*写入文字,应该刚才设置的样式*/
        xlsx.write("C4", true, format2);

        xlsx.saveAs("test1.xlsx");/*保存*/
        QXlsx::Document xlsx2("test1.xlsx");/*复制book1到book2*/
        xlsx2.saveAs("test2.xlsx");


示例代码

#include <QtXlsx>
        QXlsx::Document xlsx1;

        xlsx1.write("A1" , "Hello Qt");
        xlsx1.saveAs("Test.xlsx");
        //写
        QXlsx::Document xlsx;
        if(!xlsx.selectSheet("station"))
        {
        xlsx.addSheet("station");
        }
        xlsx.write(1, 1, "x");
        xlsx.write(1,2, "y");
        xlsx.write(1, 3, "v");
        xlsx.write(2, 1, 100);
        xlsx.write(2,2, 100);
        xlsx.write(2, 3, 20);
        xlsx.saveAs("./agv.xlsx");
        //读取
        QXlsx::Document xlsxx("./agv.xlsx");
        xlsx.selectSheet("station");
        QXlsx::CellRange range;
        range = xlsxx.dimension();
        int rowCount = xlsxx.dimension().rowCount();//获取行数
        for(int i = 1; i < rowCount + 1; i ++)
        {
        qDebug()<<QString::number(i)<<xlsxx.cellAt(i,1)->value().toString()<<xlsxx.cellAt(i,2)->value().toString()
                 <<xlsxx.cellAt(i,3)->value().toString();
        }

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接