Qt 操作 Excel

Qt之操作Excel

 (2013-12-0613:57:20)



    
VBA的参考手册中就可以看到具体函数、属性的用法,Qt操作Excel主要通过 QAxObject + Excel VBA来实现!    VisualBasic for ApplicationsVBA)是一种Visual Basic的一种宏语言,主要能用来扩展Windows的应用程式功能,特别是Microsoft Office软件。也可说是一种应用程式视觉化的Basic Script1994年发行的Excel 5.0版本中,即具备了VBA的宏功能。

    关于QtExcel的操作,网上的资料挺多的,但大多数都是比较基础的,关于插入工作表(至最后一行)、删除工作表、合并/拆分单元格、设置单元格背景色、设置单元格边框色、设置单元格字体(类型、大小、加粗、斜体、下划线、颜色等)、以及设置单元格对齐方式等用法都没有怎么提到,今天就总结一下有关QtExcel的操作。

    Qt操作Excel,无论后缀是xls还是xlsx都可以。

    如下,是我下载的一个Excel VBA参考手册,内容不算太全!

 

 

Excel读取

    

    为了便于测试,假设已存在一个excel文件,操作内容已经被红色标记出来。如下所示:

 

主要读取内容:

·        标题

·        工作表数目

·        工作表名称

·        起始行

·        起始列

·        行数

·        列数

·        单元格内容

 

代码如下:

 

QAxObjectexcel("Excel.Application");  

excel.setProperty("Visible",true);  

QAxObject*work_books = excel.querySubObject("WorkBooks");  

work_books->dynamicCall("Open(const QString&)", QString("E:/test.xlsx"));

QVarianttitle_value = excel.property("Caption");  //获取标题

qDebug()<<QString("exceltitle : ")<<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("sheetcount : ")<<sheet_count;  

for(int i=1;i<=sheet_count; i++)  

{  

QAxObject*work_sheet = work_book->querySubObject("Sheets(int)", i); //Sheets(int)也可换用Worksheets(int)

QStringwork_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(inti=row_start; i

{  

for(intj=column_start; j

{  

QAxObject *cell= work_sheet->querySubObject("Cells(int,int)", i, j);  

QVariantcell_value = cell->property("Value");  //获取单元格内容

QString message= QString("row-")+QString::number(i,10)+QString("-column-")+QString::number(j,10)+QString(":");

qDebug()<<message<<cell_value; 

}  

}  

}

 

效果如下:

 

Excel增、删、改

主要操作:

·        设置标题

·        插入工作表(至最后一行)

·        设置工作表名称

·        删除工作表

·        设置单元格内容

·        设置单元格字体(类型、大小、加粗、斜体、下划线、颜色等)

·        设置单元格对齐方式

·        设置单元格高度、宽度

·        设置单元格背景色、边框色

·        合并/拆分单元格

·        清空单元格

代码如下:

 

QAxObjectexcel("Excel.Application");  

excel.setProperty("Visible",true);  

QAxObject*work_books = excel.querySubObject("WorkBooks");  

work_books->dynamicCall("Open(constQString&)", "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++");

 

QStringmerge_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(constQString&)", 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...

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中可以使用QAxObject类库来操作Excel文件。QAxObject是一个Qt的类,用于与ActiveX对象进行交互。它可以用于操作Office应用程序,如Excel、Word、PowerPoint等。 以下是一些常用的QAxObject类成员函数,用于操作Excel文件: - QAxObject(const QString& progID, QObject* parent = 0):创建一个QAxObject对象,用于与指定的ActiveX对象进行交互。 - setProperty(const QString& name, const QVariant& value):设置指定属性的值。 - dynamicCall(const QString& functionName, const QVariant& arg1, const QVariant& arg2, ...):调用指定函数,并传递参数。 - querySubObject(const QString& name):获取指定子对象。 - enumChildren():枚举子对象。 下面是一个示例代码,用于读取Excel文件中的数据: ```cpp QAxObject* excel = new QAxObject("Excel.Application", this); QAxObject* workbooks = excel->querySubObject("Workbooks"); QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", "C:/example.xlsx"); QAxObject* sheets = workbook->querySubObject("Sheets"); QAxObject* sheet = sheets->querySubObject("Item(int)", 1); // 获取单元格A1的值 QAxObject* cell = sheet->querySubObject("Range(QString)", "A1"); QVariant value = cell->dynamicCall("Value()"); // 输出单元格A1的值 qDebug() << value.toString(); // 关闭工作簿和Excel应用程序对象 workbook->dynamicCall("Close()"); excel->dynamicCall("Quit()"); ``` 在上面的示例中,我们创建了一个Excel应用程序对象,打开了一个Excel文件,并获取了第一个工作表的对象。然后,我们获取了单元格A1的值,并输出了这个值。最后,我们关闭了工作簿和Excel应用程序对象。 除此之外,我们还可以使用QAxObject来写入Excel文件中的数据。下面是一个示例代码,用于向Excel文件中写入数据: ```cpp QAxObject* excel = new QAxObject("Excel.Application", this); QAxObject* workbooks = excel->querySubObject("Workbooks"); QAxObject* workbook = workbooks->querySubObject("Add()"); QAxObject* sheets = workbook->querySubObject("Sheets"); QAxObject* sheet = sheets->querySubObject("Item(int)", 1); // 写入单元格A1的值 QAxObject* cell = sheet->querySubObject("Range(QString)", "A1"); cell->dynamicCall("SetValue(const QVariant&)", "Hello, World!"); // 保存工作簿并关闭Excel应用程序对象 workbook->dynamicCall("Save()"); workbook->dynamicCall("Close()"); excel->dynamicCall("Quit()"); ``` 在上面的示例中,我们创建了一个Excel应用程序对象,并创建了一个新的工作簿。然后,我们获取了第一个工作表的对象,并将数据写入单元格A1中。最后,我们保存了工作簿,并关闭了Excel应用程序对象。 需要注意的是,在使用QAxObject操作Excel文件时,需要确保已经安装了Microsoft Office软件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值