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

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)");  //退出

效果如下:

操作前:

操作后:

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

看下图:

相关推荐
用户805533698034 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner4 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz9 天前
QML Hello World 入门示例
qt
xcyxiner12 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner12 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner13 天前
DicomViewer (添加模型类)3
qt
xcyxiner13 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
Non-existent98715 天前
WPS批量清理单元格空白字符的4种方法-异常数字格式处理-实战
excel·wps
桥田智能15 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构