Qt之操作Excel

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...

时间: 2024-10-10 10:02:52

Qt之操作Excel的相关文章

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

正好同事问道Qt下操作excel. 转自:http://blog.csdn.net/a156392343/article/details/48092515 配制方面: 1.确保Excel软件在本地服务器注册成功,没注册成功的可以通过 在运行中"E:\program Files\Microsoft Office\Office12\EXCEL.EXE" /regserver 手动注册,注意路径要用自己的excel路径. 2.确保组件配制正确,运行命令:dcomcnfg,查看DCOM配置下是

qt 操作excel表格

自己编写的一个Qt C++类,用于操作excel表格,在Qt中操作excel需在.pro中增加CONFIG+=qaxcontainer配置. 1.打开Excel:objExcel = new QAxObject("Excel.Application"): <?xml:namespace prefix = o /> 2.创建工作表:workSheet->dynamicCall("Add"); 3.打开工作表:workExcel->dynamic

Qt操作excel

QAxWidget excel("Excel.Application");1) 显示当前窗口:excel.setProperty("Visible", true);2) 更改 Excel 标题栏:excel.setProperty("Caption", "Invoke Microsoft Excel");3) 添加新工作簿:QAxObject * workbooks = excel.querySubObject("W

QT 操作excel 类封装

1 # pro file 2 [plain] view plaincopy 3 CONFIG += qaxcontainer 4 5 QT += core 6 7 QT -= gui 8 9 TARGET = QExcel 10 CONFIG += console 11 CONFIG -= app_bundle 12 13 TEMPLATE = app 14 15 16 SOURCES += main.cpp \ 17 qexcel.cpp 18 19 HEADERS += \ 20 qexce

POI操作Excel

Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,从A开始到Z共26列,然后再从AA到AZ又26列,再从BA到BZ再26列以此类推.行则使用数字表示,例如:A3 表示第三行第一列,E5表示第五行第五列. POI工具包 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 9

java 操作 Excel,java导出excel

WritableWorkbook out = null; try { response.getServletResponse().reset(); ((HttpServletResponse) response.getServletResponse()).setHeader("Content-Disposition", "attachment;filename=export.xls"); response.getServletResponse().setConten

python操作excel

python操作exce的方式: 使用win32com 使用xlrd(读excel).xlwt(写excel) 1.使用win32com方式 代码: # coding=utf-8 from win32com.client import Dispatch import pywintypes ''' 查看excel最大行数和列数 打开一个空白新建EXCEL表格,按CTRL+下箭头,可以查看到最大行数:按CTRL+右箭头, 可以查看到最大列标(若想显示列数,可在最右一列的某单元格中输入=column(

java使用POI操作excel文件,实现批量导出,和导入

一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel. POI全称 Poor Obfuscation Implementation,直译为"可怜的模糊实现",利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能.官网:htt

POI组件:POI操作Excel

1.Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,从A开始到Z共26列,然后再从AA到AZ又26列,再从BA到BZ再26列以此类推.行则使用数字表示,例如:A3 表示第三行第一列,E5表示第五行第五列. 2.POI工具包 POI全称 Poor Obfuscation Implementation,直译为"可怜的模糊实现&qu