百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Qt之excel 操作使用说明

lipiwang 2024-12-01 00:49 8 浏览 0 评论

(qt 5.1版本),office2007 Excel做验证,Win 7(64位)

一.简单介绍

    QAxObject是Qt提供的包装COM组件的类,通过COM通过COM操作使用QAxObject类,使用此类,需要在pro文件中添加"QT  += axcontainer "。

二.与excel com连接的方法

  1. #include <ActiveQt/QAxObject>

  2. QAxObject *excel = new QAxObject("Excel.Application"); //!建立excel操作对象,并连接Excel控件

  3. excel->dynamicCall("SetVisible (bool Visible)", "false"); //! 设置为不显示窗体

  4.excel->setProperty("DisplayAlerts", false); //! 不显示任何警告信息, 如关闭时的是否保存提示

  5.excel->dynamicCall("Quit(void)"); //! 关闭excel程序,操作完后记着关闭,由于是隐藏在后台进程中,不关闭进程会有很多excel.exe。

  6.workbook->dynamicCall("Close(Boolean)", false); //! 关闭exce程序先关闭.xls文件

【相关文章推荐:】

Qt开发进阶技术栈学习路线和资料

三.Excel基本操作

  只介绍简单的读写操作,需要修改单元格格式等操作,请"Excel VBA参考手册.chm"

  3.1 excel文件操作

   获取当前工作簿的集合

  1> QAxObject *workbooks = excel->querySubObject("Workbooks"); //! 获取工作簿(excel文件)集合

  新建一个工作簿

  1> workbooks->synamicCall("Add"); //新建一个工作簿

   QAxObject *workbook = excel->querySubObject("ActiveWorkBook"); //! 获取当前工作簿

  打开一个已有的工作簿

  1>QString filename = "e:/123.xlsx";

  2>QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", filename);

  保存工作簿

  1>workbook->dynamicCall("Save()"); //!保存文件

  2>workbook->dynamicCall("Close(Boolean)", false); //! 关闭文件

  3>excel->dynamicCall("Quit()"); //! 关闭excel

  另存为工作簿

  1>QDir::toNativeSeparators,将路径中的"/"转换为"\",否则无法保存,"/"只是qt中可以识别

  2>workbook->dynamiCall("SaveAs(const QString&)", QDit::toNativeSeparators(filename));

  3>workbook->synamicCall("Close(Boolean)", false); //! 关闭文件

  4>excel->dynamicCall("Quit()"); //! 关闭excel

  3.2 Sheet工作表操作

  获取所有工作表

  1> QAxObject *worksheets = workbook->querySubObject("Sheets"):

  根据序号获取某个工作表,序号顺序就是excel 打开后下方的排序

  1>QAxObject *worksheet = worksheets->querySubObejct("Item(int)", 1);

  获取表中的行数列数

  1>QAxObject* usedrange = worksheet->querySubObject("UsedRange"); //! sheet 范围

  2>int intRowStart = usedrange->property("Row").toInt(); //! 起始行数

  3>int intColStart = usedrange->property("Column").toInt(); //! 起始列数 

  4>QAxObject *rows, *columns;

  5>rows = usedrange->querySubObject("Rows"): //! 行 

  6>columns = usedrange->querySubObject("Columns"); //! 列

  7>int intRow = rows->property("Count").toInt(); //! 行数

  8>int intCol = columns->property("Count").toInt(); //! 列数

  3.3 内容操作

  数据内容操作--获取单元格--基于坐标

  1> QAxObject *cell = worksheet->querySubObject("Cells(int, int)", i, j);

  数据内容操作--获取单元格--基于行列名称

  1>QAxObject *cell = worksheet->querySubObject("Range(QVariant, QVariant)", "A1");

  数据内容操作--读单元格内容

  1> QVariant cell_value = cell->property("Value");

  数据内容操作-- 写单元格内容

1> cell->setProperty("Value", "内容");

4.其他

  4.1 大数据量读取

    读取所有单元格内容-数据量大,只需要进行一次操作即可读取所有内容,避免重复对每个单元格进行QAxObect操作

  1. QVariant var;

  2. QAxObject * usedRange = sheet->querySubObject("UseRange"); //! 获取用户区域范围

  3. if(NULL == usedRange || usedRange->isNull()){

    return var;

  }

  4. var = usedRange->dynamicCall("Value"); // 读取区域内所有值

  5.delete usedRange;

  此时结果以QVariant保存,需要自行转化为QList<QList<QVariant>>

  QList<QList<QVariant>> excel_list;

  auto rows = var.toList();

  for(auto row:rows) {

  •     excel_list.append(row.toList());


  • }
  •   4.2 大数据写入

  以QList<QList<QVariant>>存储,需要限定范围

  1>QAxObject *user_rang = this->sheet->querySubObject("Rang(const QString&)", "A1:D100");

   写入数据

  1> rang->setProperty("Value", var);

  4.3 简单的范例

//  HRESULT r = OleInitialize(0);
   // if(r != S_OK && r != S_FALSE)
   // {
        //qWaring("Qt:初始化Ole 失败(error %x)", (unsigned int)r);
    //}
    QString filename = "e:/123.xlsx"; //具体路径
    QFile  file(filename);
    bool isExit = file.exists();
    if(!isExit)
        return false;
    qDebug()<<"isExit"<<isExit;
    qDebug()<<filename;
    QAxObject *excel = new QAxObject("Excel.Application");
    excel->dynamicCall("SetVisible(bool Visble)", "false");
    excel->setProperty("DisplayAlerts", false);
    QAxObject *workbooks = excel->querySubObject("WorkBooks");
    QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", filename);
    QAxObject *worksheets = workbook->querySubObject("Sheets");
    QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1);

    //写入到指定位置
    QAxObject *workrang = worksheet->querySubObject("Cells(int, int)", 5, 1);
    //不能这么存
    workrang->dynamicCall("SetValue(const QString&)", QString("1ssssssfffssssssssssssssssssssssssssssss10987654321"));


    //读取出来并打印
    QAxObject *workrang1 = worksheet->querySubObject("Cells(int,int)", 3, 5);

    QVariant var = workrang1->dynamicCall("Value");
    qDebug()<<var;
    qDebug()<<var.toDouble();

    //另存保存
    //workbook->dynamicCall("SaveAs(const QString&)",
             //             QDir::toNativeSeparators(filename));

    workbook->dynamicCall("Save()", true);
    //关闭文件
    workbook->dynamicCall("Close(Boolean)", true);
    excel->dynamicCall("Quit()");
    delete excel;
    excel = NULL;
   // OleUninitialize();

 4.4 关于权限配置

  1):在服务器上安装office的Excel软件.

  2):在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务" ,win7 64 可以通过在运行里面输入 comexp.msc -32 来打开32位的组件服务,在里就能看到excel组件了

  3):依次双击"组件服务"->"计算机"->"我的电脑"->"DCOM配置"

  4):在"DCOM配置"中找到"Microsoft Excel 应用程序",在它上面点击右键,然后点击"属性",弹出"Microsoft Excel 应用程序属性"对话框

  5):点击"标识"标签,选择"交互式用户

  6):点击"安全"标签,在"启动和激活权限"上点击"自定义",然后点击对应的"编辑"按钮,在弹出的"安全性"对话框中填加一个"NETWORK SERVICE"用户

  (注意要选择本计算机名),并给它赋予"本地启动"和"本地激活"权限.

  7):依然是"安全"标签,在"访问权限"上点击"自定义",然后点击"编辑",在弹出的"安全性"对话框中也填加一个"NETWORK SERVICE"用户,然后赋予"本地访问"权限.

  8).如果交互式用户设置后出现错误8000401a,可取消交互式用户,指定为administratr,可暂时解决此问题。进一步的解决方式还有待探讨

  9).采用第8点的设置后,打开Excel可能会出现“无法使用对象引用或链接”,并且不能进行单元格粘贴。原因不明,取消设置后即可消失。

  4.5 关于在分线程中调用QAXObject

    请首先初始化COM

    代码:

HRESULT r = OleInitialize(0);
if(r != S_OK && r != S_FALSE)
{
         qWaring("Qt:初始化Ole 失败(error %x)", (unsigned int)r);
     }
 OleUninitialize();

相关推荐

前端入门——css 网格轨道详细介绍

上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...

Islands Architecture(孤岛架构)在携程新版首页的实践

一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...

HTML中script标签中的那些属性

HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...

CSS 中各种居中你真的玩明白了么

页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...

CSS样式更改——列表、表格和轮廓

上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...

一文吃透 CSS Flex 布局

原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...

css实现多行文本的展开收起

背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...

css 垂直居中的几种实现方式

前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...

WordPress固定链接设置

WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...

面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿

前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...

3种CSS清除浮动的方法

今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...

2025 年 CSS 终于要支持强大的自定义函数了?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...

css3属性(transform)的一个css3动画小应用

闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...

CSS基础知识(七)CSS背景

一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...

CSS 水平居中方式二

<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...

取消回复欢迎 发表评论: