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. (转)CommandArgument用法

    1.绑定数据库中一个主键前台代码:<ItemTemplate>                        <asp:ImageButton ID="ibtnUpdate ...

  2. C#中Property和Attribute的区别

    C#中Property和Attribute的区别 Attribute 字段Property 属性(get;set;) 属性的正常写: private string name; public strin ...

  3. 关于Oracle dmp文件导入随笔

    进入博客园已经两年多了,每次想写点什么,都是给自己个各种借口,不了了之~今天就从Oracle数据库最长用的导入开始吧! 1.低版本的exp/imp可以连接到高版本(或同版本)的数据库服务器,比如:10 ...

  4. oc随笔三:多态

    多态使用总结: (1)没有继承就没有多态 (2)代码的体现:父类类型的指针指向子类对象 (3)好处:如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行 ...

  5. windows下配置svn的https访问

    svn是一个功能强大的代码版本管理系统,可以将服务端安装在linux.unix以及windows下.svn通常采用http方式进行代码提交与下载.由于密码采用明文传输,因此存在泄密的风险.若采用htt ...

  6. Fedora下YouCompleteMe配置

    需要在默认的.ycm_extra_conf.py 中添加(C++的路径可能需要根据版本号修改) '-isystem', '/usr/include', '-isystem', '/usr/includ ...

  7. JSP EL

    一.JSP EL语言定义 E L(Expression Language)  目的:为了使JSP写起来更加简单. 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 ...

  8. python——lambda

    一lambda函数基础 1.lambda函数为匿名函数,即没有具体的函数名,而def函数创建的函数有函数名. >>> def foo(): return 'test' #命名为foo ...

  9. Trucking(HDU 2962 最短路+二分搜索)

    Trucking Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  10. C语言读写伯克利DB 4

    因为缓存数据的buffer总是不够大(会引起段错误)索性从堆上拿了两块大内存 /* 功能说明:逐日存储来访用户(使用伯克利DB) 根据存储的用户信息确定某用户是否是首次来访用户(未被存储的伯克利DB) ...