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的更多相关文章

  1. Qt QAxObject操作excel文件过程总结(转):

    正好同事问道Qt下操作excel. 转自:http://blog.csdn.net/a156392343/article/details/48092515 配制方面: 1.确保Excel软件在本地服务 ...

  2. qt 操作excel表格

     自己编写的一个Qt C++类,用于操作excel表格,在Qt中操作excel需在.pro中增加CONFIG+=qaxcontainer配置. 1.打开Excel:objExcel = new QAx ...

  3. QT操作EXCEL

    介绍一下最基本的QT对EXCEL的读写操作. 声明:转载于:http://blog.csdn.net/czyt1988/article/details/52121360 在使用QT的操作数据库的时候, ...

  4. Qt高仿Excel表格组件-支持冻结列、冻结行、内容自适应和合并单元格

    目录 一.概述 二.效果展示 三.实现思路 1.冻结行.冻结列 2.行高自适应 3.蚂蚁线 四.测试代码 1.添加表格数据 2.设置冻结行.列 3.行高.列宽 4.单元格背景色 5.单元格文字 6.其 ...

  5. Python学习随笔:使用xlwings设置和操作excel多行多列数据以及设置数据字体颜色填充色对齐方式的方法

    ☞ ░ 前往老猿Python博文目录 ░ 在前面老猿的文章中,<Python学习随笔:使用xlwings读取和操作Excel文件>.<Python学习随笔:使用xlwings读取和操 ...

  6. 免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)

    很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel ...

  7. C#通过NPOI操作Excel

    参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-post.html http://www.yuanjiaocheng.net/w ...

  8. POI操作Excel

    POI和Excel简介 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作 ...

  9. NPOI操作EXCEL(六)——矩阵类表头EXCEL模板的解析

    哈哈~~~很高兴还活着.总算加班加点的把最后一类EXCEL模板的解析做完了... 前面几篇文章介绍了博主最近项目中对于复杂excel表头的解析,写得不好,感谢园友们的支持~~~ 今天再简单讲诉一下另一 ...

随机推荐

  1. CSS元素 之 float

    1. float 设计的初衷 Float 设计的初衷是为了文字环绕的效果 使得文字可以围绕着 图片.就像下面这样 2. float 的包裹和 破坏 A) 包裹性 和 破坏性 例如下图   我们原本是希 ...

  2. Sass@规则

    @importSass 支持所有 CSS3 的 @ 规则, 以及一些 Sass 专属的规则,也被称为“指令(directives)”.Sass 扩展了 CSS 的 @import 规则,让它能够引入 ...

  3. xhtml规范

    在使用XHTML语言进行网页制作时,必须要遵循一定的语法规范.下面进行详细讲解,其中具体内容可以分为以下几点. 文档方面: 必须定义文档类型(DTD)和你的名字空间 标签方面: 所有标签均要小写,合理 ...

  4. WebApi2官网学习记录---Media Formatters

    Web API内建支持XML.JSON.BSON.和form-urlencoded的MiME type. 创建的自定义MIME类型要继承一下类中的一个: MediaTypeFormatter 这个类使 ...

  5. Java数据结构漫谈-Vector

    List除了ArrayList和LinkedList之外,还有一个最常用的就是Vector. Vector在中文的翻译是矢量,向量,所以大家喜欢把Vector叫做矢量数组,或者向量数组. 其实就底层实 ...

  6. 《第一行代码》学习笔记20-广播接收器Broadcast_Receiver(3)

    1.强制用户下线的逻辑并不是写在MainActivity里的,而是应该写在接收这条广播的广播接收器里面,这样强制下线的功能就不会 依附于任何的界面,不管是在程序的任何地方,只需要发出一条广播,就可以完 ...

  7. web-打印

    项目前景 由于之前的打印是客户端程序,也就是winform做的,现在需要改版成网页版,其他功能都能够很好的实现,就是在打印上遇到一些难点.由于第一次做打印功能,刚开始照搬winform中调用word文 ...

  8. 二维码生成 - QrCodeNet

    下载QrCodeNet /// <summary> /// 生成QR码 /// </summary> /// <param name="output_path& ...

  9. 3 linux、windows环境---路径分隔符不同导致的问题

    问题:通常在eclipse,IntelliJ IDEA等进行代码编写时,程序中用到路径通常采用/job/test.properties或D:/job/test.properties等是形式作为文件路径 ...

  10. JavaScript可否多线程? 深入理解JavaScript定时机制(转载)

    说明:最近写 js 时需要用setinterval函数做定时操作,谁知道,刚开始后运行完好,但一段时间后他就抽风了,定时任务运行的时间间隔越来越短,频率加快,这是一个完全不能容忍的问题,带着一个可以出 ...