使用QT操作Excel 表格的常用方法

news/2024/7/21 4:53:11 标签: excel, qt

VBA 简介   

        Microsoft Office软件通常使用VBA来扩展Windows的应用程序功能,Visual Basic for Applications(VBA)是一种Visual Basic的一种宏语言。 在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)");  //退出

 

效果如下:

操作前:

Qt之操作Excel

操作后:

Qt之操作Excel

    到这里很多人也许都在纳闷,单元格的宏怎么获取的?比如对齐方式(居中对齐),为什么值是-4108,而不是其他值呢?当然那不是我随便写的,自己可以录制宏,然后跟踪。

看下图:

Qt之操作Excel


http://www.niftyadmin.cn/n/5000072.html

相关文章

【深度学习实验】数据可视化

目录 一、实验介绍 二、实验环境 三、实验内容 0. 导入库 1. 归一化处理 归一化 实验内容 2. 绘制归一化数据折线图 报错 解决 3. 计算移动平均值SMA 移动平均值 实验内容 4. 绘制移动平均值折线图 5 .同时绘制两图 6. array转换为tensor张量 7. 打印张量 一、…

Linux下 /sys/class 一些操作

Linux下&#xff0c;/dev、/sys/class的区别 /dev下面有很多节点&#xff0c;每一个节点代表一个设备&#xff0c;/dev目录下面是按物理器件进行分类&#xff1b;而/sys/class下面的更多是按功能抽象出来的。 参考1 demo 在正点原子的基础上进行演示 #include <linux/ty…

POJ 3662 Telephone Lines 二分,最小化第k大的数

一、题目大意 我们有n个点&#xff0c;p条边&#xff0c;最小化从1到n之间的路径的第k1大的数&#xff08;当路径不超过k时就是0&#xff09; 二、解题思路 我们首先用dijkstra过一遍&#xff0c;判断从1能不能到n&#xff0c;不能直接输出-1结束。 1能到达n的话&#xff0…

Mysql底层数据结构为什么选择B+树

索引底层采用什么数据结构&#xff0c;为什么使用B树而不是其他数据结构&#xff1a; &#xff08;1&#xff09;如果采用二叉树&#xff1a;使用递增字段作为索引时&#xff0c;二叉树会退化成链表&#xff0c;查找效率太低 &#xff08;2&#xff09;如果采用红黑树&#xf…

改变金融贷款市场营销方式 ---- 运营商大数据精准获客

与传统的企业网络营销相比&#xff0c;最常见的是网络推广和硬广告推广。一些企业无法找到可靠准确的数据来源&#xff0c;也无法找到一些未知的总数据。这些数据大多存在持续时间长、准确性差的缺点&#xff0c;企业在将这些数据信息应用于商品在线营销时往往会遇到不足。 在…

算法:合并两个有序数组---双指针[1]

1、题目&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&a…

Docker 使用

简介 Docker是一个开源的容器引擎&#xff0c;它有助于更快地交付应用。 Docker可将应用程序和基础设施层隔离&#xff0c;并且能将基础设施当作程序一样进行管理。使用 Docker可更快地打包、测试以及部署应用程序&#xff0c;并可以缩短从编写到部署运行代码的周期。 Docker…

C语言中结构体和位段的一些知识

一、结构体 struct stu {char name[20];//20//对齐数为8int age;//4//两个数中最大对齐数为8&#xff0c;而24又是8的整数倍 }; int main () {printf("%d\n", sizeof(struct stu));//只有vs中有对齐数为8&#xff0c;gcc没有对齐数&#xff0c;对齐数为成员变量自…