原文地址:点击打开链接

Visual Basic for Applications(VBA)是一种Visual Basic的一种宏语言,主要能用来扩展Windows的应用程式功能,特别是Microsoft Office软件。也可说是一种应用程式视觉化的Basic Script。1994年发行的Excel 5.0版本中,即具备了VBA的宏功能。

    在VBA的参考手册中就可以看到具体函数、属性的用法,Qt操作Excel主要通过  QAxObject + Excel VBA来实现!

    关于Qt对Excel的操作,网上的资料挺多的, 但大多数都是比较基础的,关于插入工作表(至最后一行)、删除工作表、合并/拆分单元格、设置单元格背景色、设置单元格边框色、设置单元格字体(类型、大小、加粗、斜体、下划线、颜色等)、以及设置单元格对齐方式等用法都没有怎么提到,今天就总结一下有关Qt对Excel的操作。

    Qt操作Excel,无论后缀是xls还是xlsx都可以。
    如下,是我下载的一个Excel VBA参考手册,内容不算太全!
Excel读取
    
    为了便于测试,假设已存在一个excel文件,操作内容已经被红色标记出来。如下所示:
主要读取内容:

  • 标题
  • 工作表数目
  • 工作表名称
  • 起始行
  • 起始列
  • 行数
  • 列数
  • 单元格内容
代码如下:
QAxObject excel("Excel.Application");  
excel.setProperty("Visible", true);  
QAxObject *work_books = excel.querySubObject("WorkBooks");  
work_books->dynamicCall("Open (const QString&)", QString("E:/test.xlsx"));
QVariant title_value = excel.property("Caption");   //获取标题
qDebug()<<QString("excel title : ")<<title_value;  
QAxObject *work_book = excel.querySubObject("ActiveWorkBook");  
QAxObject *work_sheets = work_book->querySubObject("Sheets");   //Sheets也可换用WorkSheets
int sheet_count = work_sheets->property("Count").toInt();   //获取工作表数目
qDebug()<<QString("sheet count : ")<<sheet_count;  
for(int i=1; i<=sheet_count; i++)  
{  
QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", i);   //Sheets(int)也可换用Worksheets(int)
QString work_sheet_name = work_sheet->property("Name").toString();   //获取工作表名称
QString message = QString("sheet ")+QString::number(i, 10)+ QString(" name");
qDebug()<<message<<work_sheet_name;  
}
if(sheet_count > 0)
{
QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", 1);  
QAxObject *used_range = work_sheet->querySubObject("UsedRange");  
QAxObject *rows = used_range->querySubObject("Rows");  
QAxObject *columns = used_range->querySubObject("Columns");  
int row_start = used_range->property("Row").toInt();   //获取起始行    
int column_start = used_range->property("Column").toInt();   //获取起始列
int row_count = rows->property("Count").toInt();   //获取行数
int column_count = columns->property("Count").toInt();   //获取列数
for(int i=row_start; i
{  
for(int j=column_start; j
{  
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", i, j);  
QVariant cell_value = cell->property("Value");   //获取单元格内容
QString message = QString("row-")+QString::number(i, 10)+QString("-column-")+QString::number(j, 10)+QString(":");
qDebug()<<message<<cell_value;  
}  
}  
}

效果如下:

Excel增、删、改

主要操作:
  • 设置标题
  • 插入工作表(至最后一行)
  • 设置工作表名称
  • 删除工作表
  • 设置单元格内容
  • 设置单元格字体(类型、大小、加粗、斜体、下划线、颜色等)
  • 设置单元格对齐方式
  • 设置单元格高度、宽度
  • 设置单元格背景色、边框色
  • 合并/拆分单元格
  • 清空单元格

代码如下:

QAxObject excel("Excel.Application");  
excel.setProperty("Visible", true);  
QAxObject *work_books = excel.querySubObject("WorkBooks");  
work_books->dynamicCall("Open(const QString&)", "E:\\test.xlsx");
excel.setProperty("Caption", "Qt Excel");
QAxObject *work_book = excel.querySubObject("ActiveWorkBook");  
QAxObject *work_sheets = work_book->querySubObject("Sheets");   //Sheets也可换用WorkSheets
//删除工作表(删除第一个)
QAxObject *first_sheet = work_sheets->querySubObject("Item(int)", 1);
first_sheet->dynamicCall("delete");
//插入工作表(插入至最后一行)
int sheet_count = work_sheets->property("Count").toInt();   //获取工作表数目
QAxObject *last_sheet = work_sheets->querySubObject("Item(int)", sheet_count);
QAxObject *work_sheet = work_sheets->querySubObject("Add(QVariant)", last_sheet->asVariant());
last_sheet->dynamicCall("Move(QVariant)", work_sheet->asVariant());
work_sheet->setProperty("Name", "Qt Sheet");   //设置工作表名称
//操作单元格(第2行第2列)
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", 2, 2);
cell->setProperty("Value", "Java C++ C# PHP Perl Python Delphi Ruby");   //设置单元格值
cell->setProperty("RowHeight", 50);   //设置单元格行高
cell->setProperty("ColumnWidth", 30);   //设置单元格列宽
cell->setProperty("HorizontalAlignment", -4108); //左对齐(xlLeft):-4131   居中(xlCenter):-4108   右对齐(xlRight):-4152
cell->setProperty("VerticalAlignment", -4108);   //上对齐(xlTop)-4160 居中(xlCenter):-4108   下对齐(xlBottom):-4107
cell->setProperty("WrapText", true);   //内容过多,自动换行
//cell->dynamicCall("ClearContents()");   //清空单元格内容
QAxObject* interior = cell->querySubObject("Interior");
interior->setProperty("Color", QColor(0, 255, 0));    //设置单元格背景色(绿色)
QAxObject* border = cell->querySubObject("Borders"); 
border->setProperty("Color", QColor(0, 0, 255));    //设置单元格边框色(蓝色)
QAxObject *font = cell->querySubObject("Font");   //获取单元格字体
font->setProperty("Name", QStringLiteral("华文彩云"));   //设置单元格字体
font->setProperty("Bold", true);   //设置单元格字体加粗
font->setProperty("Size", 20);   //设置单元格字体大小
font->setProperty("Italic", true);   //设置单元格字体斜体
font->setProperty("Underline", 2);   //设置单元格下划线
font->setProperty("Color", QColor(255, 0, 0));   //设置单元格字体颜色(红色)

//设置单元格内容,并合并单元格(第5行第3列-第8行第5列)
QAxObject *cell_5_6 = work_sheet->querySubObject("Cells(int,int)", 5, 3);
cell_5_6->setProperty("Value", "Java");   //设置单元格值
QAxObject *cell_8_5 = work_sheet->querySubObject("Cells(int,int)", 8, 5);
cell_8_5->setProperty("Value", "C++");
QString merge_cell;
merge_cell.append(QChar(3 - 1 + 'A'));   //初始列
merge_cell.append(QString::number(5));   //初始行
merge_cell.append(":");
merge_cell.append(QChar(5 - 1 + 'A'));   //终止列
merge_cell.append(QString::number(8));   //终止行
QAxObject *merge_range = work_sheet->querySubObject("Range(const QString&)", merge_cell);
merge_range->setProperty("HorizontalAlignment", -4108);
merge_range->setProperty("VerticalAlignment", -4108);
merge_range->setProperty("WrapText", true);
merge_range->setProperty("MergeCells", true);   //合并单元格
//merge_range->setProperty("MergeCells", false);   //拆分单元格
//work_book->dynamicCall("Save()");   //保存文件(为了对比test与下面的test2文件,这里不做保存操作) work_book->dynamicCall("SaveAs(const QString&)", "E:\\test2.xlsx");   //另存为另一个文件 
work_book->dynamicCall("Close(Boolean)", false);   //关闭文件
excel.dynamicCall("Quit(void)");   //退出

效果如下:
操作前:
操作后:
    到这里很多人也许都在纳闷,单元格的宏怎么获取的?比如对齐方式(居中对齐),为什么值是-4108,而不是其他值呢?当然那不是我随便写的,自己可以录制宏,然后跟踪。
看下图:
如上所讲,已经基本可以满足常用的操作,如有更多专业需求,请参考Excel VBA...

QT操纵excel详解2:实现对excel的全面控制相关推荐

  1. python修改excel数据-python之实现对excel表格数据的修改

    题目: 有一个名为produceSales.xlsx的表格文件,每一行代表一次单独的销售纪录,第一列(A)是产品名字,第二行(B)是产品价格,第三行(C)是销售的数量,第四行(D)是本次销售总收入(根 ...

  2. 基于Python的高校勤工俭学工资管理系统——实现对excel表格的数据操作(xwlings库)

    基于Python的高校勤工俭学工资管理系统 1 需求概述 1.1 需求分析 勤工俭学是指学校组织的或学生个人从事的有酬劳动,用以助学.在我国,许多高校借以对学生进行劳动技术教育,培养正确的劳动观点和态 ...

  3. 【转】用VB操作Excel详解

    用VB操作Excel详解 一. VB读写EXCEL表: VB本身提自动化功能可以读写EXCEL表,其方法如下: 1.在工程中引用MicrosoftExcel 类型库: 从"工程"菜 ...

  4. .NET NPOI导出Excel详解

    http://www.cnblogs.com/yinrq/p/5590970.html .NET NPOI导出Excel详解 NPOI,顾名思义,就是POI的.NET版本.那POI又是什么呢?POI是 ...

  5. python对excel表统计视频教程_Python实现对excel文件列表值进行统计的方法

    本文实例讲述了Python实现对excel文件列表值进行统计的方法.分享给大家供大家参考.具体如下: #!/usr/bin/env python #coding=gbk #此PY用来统计一个execl ...

  6. 用python编excel统计表_Python实现对excel文件列表值进行统计的方法

    本文实例讲述了Python实现对excel文件列表值进行统计的方法.分享给大家供大家参考.具体如下: #!/usr/bin/env python #coding=gbk #此PY用来统计一个execl ...

  7. SpringBoot通过WorkBook快速实现对Excel的导入和导出(包括数据校验)

    之前转载过一篇对Excel基本操作相关的文章,这篇文章的浏览量迅速飙升,以至于在我博客的热门文章中排到了第三的位置,不过那篇转载的文章实用性差并且讲解不是很清晰,所以打算趁着今天休息,写一篇关于Spr ...

  8. QT QtableView操作详解

    本文实现了使用QtableView控件来显示数据,数据源使用txt文本作为数据源,使用了QStandardItemModel作为数据模型来实现了对TableView空间的初始化,和对txt数据源的增删 ...

  9. Qt pro 文件详解

     Qt pro 文件详解 1. TEMPLATE  变量TEMPLATE描述了为建立目标文件而采用何种模板,即生成何种形式的Makefile文件.Qmake  工具定义了5种模板:   a. 应用 ...

  10. 使用Python实现对excel数据的处理

    前言 **使用Python实现对excel数据的处理, 预先知识简单介绍 xlrd中 # File_Path是Excel路径,打开Excel工作蒲 workbook = xlrd.open_workb ...

最新文章

  1. python函数定义与使用
  2. Java_WEB项目OOM(OutOfMemError内存溢出) MyEclipse配置Jvm内存
  3. 苏宁易购:公司改选董事 同意聘任张近东为公司名誉董事长
  4. table合并单元格_element ui el-table 合并单元格
  5. kafka中处理超大消息的一些考虑
  6. Atitit 眼科医学之道 attilax总结
  7. Java实现KMP算法
  8. win10显示WiFi已连接但无法访问互联网?
  9. Justinmind Prototyper中如何使用变量达到一些效果
  10. Hibernate学习总结(一)——hibernate的简单配置使用
  11. Python 用Ursina引擎制作一个3D迷宫游戏
  12. thinkadmin下拉框实现默认选中
  13. Mac系统之----教你怎么显示隐藏文件,或者关闭显示隐藏文件
  14. 2021年中国医药CDMO重点企业对比(药明康德VS凯莱英VS博腾股份VS九洲药业)[图]
  15. Android 手机设置 Charles 代理,pem 证书安装不上?
  16. android 定时推送提醒,使用workManager实现每日定时推送通知
  17. 朴素贝叶斯算法,点进来了解了解。
  18. jq animate动画详解
  19. unity访问其他游戏对象的四种方式
  20. 怎样取消老毛桃软件赞助商---只需在输入框中输入老毛桃官网网址“laomaotao.org”...

热门文章

  1. 推荐一个图片管理软件
  2. 【富芮坤】 RF801xH的rost demo添加 OTA 功能
  3. Helmholtz方程在球坐标系下的变量分离及Legendre方程的导出 | 特殊函数(三) |偏微分方程(二十五)
  4. 如何自己制作PCB板(单面板)入门级完全教程
  5. 问题随记 —— Git 多账号配置问题
  6. angular安装卸载
  7. 一箭双雕 刷完阿里P8架构师spring学习笔记+源码剖析,涨薪8K
  8. Qt开发 — 显示gif动画
  9. simple sentence to complex
  10. 上海迪士尼将以一系列季节限定的特别惊喜继续庆祝5岁生日庆典