专栏首页Linux驱动QT-QAxObject快速写入EXCEL示例

QT-QAxObject快速写入EXCEL示例

参考链接: https://blog.csdn.net/czyt1988/article/details/52121360

http://blog.sina.com.cn/s/blog_a6fb6cc90101gv2p.html

1. QAxObject介绍

在QT中,有个自带的QAxObject类,可以直接操作EXCEL

除此之外,当我们操作某个文件夹下的EXCEL的时候,都会在该文件夹下出现一个隐藏文件~$XX.xlsx,如下图所示:

此时,如果我们再用QAxObject去操作这个文件时,该文件是只读的,无法保存成功的,所以我们使用QAxObject时,需要提前判断一次.

2.示例

首先在项目下创建一个模板templatePath.xlsx文件

3.效果如下

4.写代码

#include <QApplication>
#include "widget.h"
#include <QtGui>
#include <QAxObject>
#include <QStandardPaths>
#include <QFileDialog>
#include <QFileDialog>

 
/*excel操作*/
enum EXcel_ColumnType{
    ColumnA = 1,
    ColumnB = 2,
    ColumnC = 3,
    ColumnD = 4,
    ColumnE = 5,
    ColumnF = 6,
    ColumnG = 7,
    ColumnH = 8,
    ColumnI = 9
};

 
QString saveas()
{
    QString file;
    QString filter;
 

    //如果版本低于QT5,则需要将:
    //  QStandardPaths::writableLocation(QStandardPaths::DesktopLocation),
    //改为:QDesktopServices::storageLocation(QDesktopServices::DesktopLocation),
    file = QFileDialog::getSaveFileName (
     NULL,                               //父组件
    "另存为",                              //标题
     QStandardPaths::writableLocation(QStandardPaths::DesktopLocation),                 //设置路径, .表示当前路径,./表示更目录
     "Excel(*.xlsx)",     //过滤器
     &filter  );

    return file;
}

//设置EXCEL中单个内容的数据
void  Excel_SetCell(QAxObject *worksheet,EXcel_ColumnType column,int row,QColor color,QString text)
{
  QAxObject *cell = worksheet->querySubObject("Cells(int,int)", row, column);
  cell->setProperty("Value", text);
  QAxObject *font = cell->querySubObject("Font");
  font->setProperty("Color", color);
}


//把QVariant转为QList<QList<QVariant> >,用于快速读出的
void castVariant2ListListVariant(const QVariant &var, QList<QList<QVariant> > &res)
{
    QVariantList varRows = var.toList();
    if(varRows.isEmpty())
    {
        return;
    }

    const int rowCount = varRows.size();
    QVariantList rowData;

    for(int i=0;i<rowCount;++i)
    {
        rowData = varRows[i].toList();
        res.push_back(rowData);
    }
}

//把QList<QList<QVariant> > 转为QVariant,用于快速写入的
void castListListVariant2Variant(const QList<QList<QVariant> > &cells, QVariant &res)
{
    QVariantList vars;
    const int rows = cells.size();
    for(int i=0;i<rows;++i)
    {
        vars.append(QVariant(cells[i]));
    }
    res = QVariant(vars);
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QString templatePath = "./template.xlsx";
    QFileInfo info(templatePath);

    if(!info.exists())
    {
            qDebug()<<"template.xlsx is NULL";
            return 0;
    }

    templatePath = info.absoluteFilePath();                   //获取模板的绝地路径
    templatePath = QDir::toNativeSeparators(templatePath);   //转换一下路径,让windows能够识别

    QString ExcelFile = QDir::toNativeSeparators(saveas());  //打开文件保存对话框,找到要保存的位置

    if(ExcelFile=="")
            return  0;

    QFile::copy(templatePath, ExcelFile);                   //将模板文件复制到要保存的位置去

    info.setFile(ExcelFile);
    info.setFile(info.dir().path()+"/~$"+info.fileName());

    if(info.exists())          //判断一下,有没有"~$XXX.xlsx"文件存在,是不是为只读
    {
        qDebug()<<"报表属性为只读,请检查文件是否已打开!";
         return   0;
    }

 
    QAxObject *excel = new QAxObject();//建立excel操作对象
    excel->setControl("Excel.Application");//连接Excel控件
    excel->setProperty("Visible", true);//显示窗体看效果
    excel->setProperty("DisplayAlerts", false);//显示警告看效果
    QAxObject *workbooks = excel->querySubObject("WorkBooks");

    QAxObject* workbook = workbooks->querySubObject("Open(const QString&)",QDir::toNativeSeparators(ExcelFile) ); //打开

    excel->setProperty("Caption", "Qt Excel");      //标题为Qt Excel
    QAxObject *work_book = excel->querySubObject("ActiveWorkBook");

    QAxObject *worksheet = work_book->querySubObject("Sheets(int)",1);     //获取表单1

    Excel_SetCell(worksheet,ColumnB,2,QColor(74,51,255),"12345");     //设置B2单元格内容为12345

    Excel_SetCell(worksheet,ColumnB,3,QColor(255,255,0),"B3");     //设置B3单元格内容

    Excel_SetCell(worksheet,ColumnB,4,QColor(255,0,0),"B4");     //设置B4单元格内容

 

    /*批量一次性设置A6~I106所在内容*/
    QAxObject *user_range = worksheet->querySubObject("Range(const QString&)","A6:I106");

    QList<QList<QVariant> > datas;
    for(int i=1;i<101;i++)
    {
        QList<QVariant> rows;
        for(int j=1;j<10;j++)
        {
            rows.append(i*j);
        }
        datas.append(rows);
    }

    QVariant var;
    castListListVariant2Variant(datas,var);

    user_range->setProperty("Value", var);

 
    workbook->dynamicCall("Save()" );


    // workbook->dynamicCall("Close()");  //关闭文件
    // excel->dynamicCall("Quit()");//关闭excel

    return 0;

}

未完待续,下章学习Qtxlsx库操作EXCEL: https://www.cnblogs.com/lifexy/p/10743352.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 小程序显示H5网页教程

    小程序里显示Html代码,目前插件(wxParse 解析html)解析支持不太好,有时候格式还是达不到预想的效果。 小程序里的HTML语法有台奇葩, 最好的解决...

    大王12
  • Windows版InfluxDB及相关软件安装与配置

    公司在做一个工业监控系统,虽然数据采集点并不算多但是数据量积累下来也非常大,使用mysql数据库进行数据存储和查询时很慢,所以让我调研一下时序数据库,通过调研和...

    周小董
  • 腾讯云部署nginx静态项目

    部署静态页面归纳为2点:①:项目相关的文件上传到云服务上;②:可以通过IP或者域名打开页面

    tengxunyun8点com活动整理
  • SpringBoot整合shiro从初恋到失恋

    另外三个跳转页面就不贴出来了,panpan账号登录可以查看和删除,用xiaoli账号登录则只有查看而没有删除的权限,代码见下面,sql文件在resources包...

    道可道非常道
  • python项目实战:切换iframe模拟登陆126网易邮箱

    今天为大家介绍一个模拟登陆126网易邮箱的案例,大多数登陆都是用input,今天这个案例特殊一点,126登陆框是使用iframe进行嵌套的,所以需要先切换到该i...

    一墨编程学习
  • Angular+PhotoSwipe实现图片预览组件

    先前写过一篇文章:【组件篇】ionic3图像手指缩放滑动预览,是原来封装的一个组件的原型,后来用ionic4后,这个组件不兼容,需要改,那时我开始考虑组件的封装...

    IT晴天
  • Elasticsearch自定义分词,从一个问题说开去

    设计索引的Mapping阶段,要根据业务用途确定是否需要分词,如果不需要分词,建议设置keyword类型;需要分词,设置为text类型并指定分词器。

    用户1390885
  • Django 博客生成 Markdown 摘要的几种方式对比

    在搭建博客中, 自动生成摘要是一个很普遍的需求, 今天讲的生成摘要方式均为抽取式, 并且实质仍是抽取文章前 N 个字, 真正的抽取式通常会使用 TextRank...

    benny
  • 什么是TensorBoard?

    这篇文章主要讲讲TensorBoard的基本使用以及name_scope和variable_scope的区别

    Java3y
  • Pandas的API怎么快速为你所用?

    Python的数据分析利器Pandas,是比较知名,好用的。每个函数的 *agrs, **kargs, 这些列表、字典参数,往往比较多,如何快速定位某个函数...

    double

扫码关注云+社区

领取腾讯云代金券