Qt下Excel操作.docx
- 文档编号:4805822
- 上传时间:2022-12-09
- 格式:DOCX
- 页数:11
- 大小:221.23KB
Qt下Excel操作.docx
《Qt下Excel操作.docx》由会员分享,可在线阅读,更多相关《Qt下Excel操作.docx(11页珍藏版)》请在冰豆网上搜索。
Qt下Excel操作
Qt下Excel操作
Qt之操作Excel
(2013-12-0613:
57:
20)
转载▼
标签:
qt
qaxobject
qt操作excel
qtvba
excelvba
分类:
Qt
VisualBasicforApplications(VBA)是一种VisualBasic的一种宏语言,主要能用来扩展Windows的应用程式功能,特别是MicrosoftOffice软件。
也可说是一种应用程式视觉化的BasicScript。
1994年发行的Excel5.0版本中,即具备了VBA的宏功能。
在VBA的参考手册中就可以看到具体函数、属性的用法,Qt操作Excel主要通过 QAxObject +ExcelVBA来实现!
关于Qt对Excel的操作,网上的资料挺多的,但大多数都是比较基础的,关于插入工作表(至最后一行)、删除工作表、合并/拆分单元格、设置单元格背景色、设置单元格边框色、设置单元格字体(类型、大小、加粗、斜体、下划线、颜色等)、以及设置单元格对齐方式等用法都没有怎么提到,今天就总结一下有关Qt对Excel的操作。
Qt操作Excel,无论后缀是xls还是xlsx都可以。
如下,是我下载的一个ExcelVBA参考手册,内容不算太全!
Excel读取
为了便于测试,假设已存在一个excel文件,操作内容已经被红色标记出来。
如下所示:
主要读取内容:
∙标题
∙工作表数目
∙工作表名称
∙起始行
∙起始列
∙行数
∙列数
∙单元格内容
代码如下:
QAxObjectexcel("Excel.Application");
excel.setProperty("Visible",true);
QAxObject*work_books=excel.querySubObject("WorkBooks");
work_books->dynamicCall("Open(constQString&)",QString("E:
/test.xlsx"));
introw_start=used_range->property("Row").toInt(); //获取起始行
intcolumn_start=used_range->property("Column").toInt(); //获取起始列
introw_count=rows->property("Count").toInt(); //获取行数
intcolumn_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"); //获取单元格内容
QStringmessage=QString("row-")+QString:
:
number(i,10)+QString("-column-")+QString:
:
number(j,10)+QString(":
");
qDebug()< } } } 效果如下: 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","QtExcel"); 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"); //插入工作表(插入至最后一行) intsheet_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","QtSheet"); //设置工作表名称 //操作单元格(第2行第2列) QAxObject*cell=work_sheet->querySubObject("Cells(int,int)",2,2); cell->setProperty("Value","JavaC++C#PHPPerlPythonDelphiRuby"); //设置单元格值 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(constQString&)","E: \\test2.xlsx"); //另存为另一个文件 work_book->dynamicCall("Close(Boolean)",false); //关闭文件 excel.dynamicCall("Quit(void)"); //退出 效果如下: 操作前: 操作后: 到这里很多人也许都在纳闷,单元格的宏怎么获取的? 比如对齐方式(居中对齐),为什么值是-4108,而不是其他值呢? 当然那不是我随便写的,自己可以录制宏,然后跟踪。 看下图: 如上所讲,已经基本可以满足常用的操作,如有更多专业需求,请参考ExcelVBA... ∙ExcelObjectModelReference. 最近写程序中需要将数据输出保存到Excel文件中。 翻看《C++GUIProgrammingwithQt4》(SecondEdition)发现可以在Qt中运用ActiveX控件,这真是太好了。 看了很久教程也没有学会,毕竟是新手,平时也没学过ActiveX编程。 一些在VB中可以方便使用的函数在Qt中都没法儿运行。 网上的方法也很多解决不了问题,还会报错。 也许是版本问题吧,Qt都更新了好几次了。 所以只好自己多试几次。 经过摸索我的方法如下: 首先在.pro文件中添加CONFIG+=qaxcontainer 接着程序实现 [cpp] viewplaincopy 1.QString filepath=QFileDialog: : getSaveFileName(this,tr("Save orbit"),".",tr("Microsoft Office 2007 (*.xlsx)"));//获取保存路径 2. if(! filepath.isEmpty()){ 3. QAxObject *excel = new QAxObject(this); 4. excel->setControl("Excel.Application");//连接Excel控件 5. excel->dynamicCall("SetVisible (bool Visible)","false");//不显示窗体 6. excel->setProperty("DisplayAlerts", false);//不显示任何警告信息。 如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示 7. 8. QAxObject *workbooks = excel->querySubObject("WorkBooks");//获取工作簿集合 9. workbooks->dynamicCall("Add");//新建一个工作簿 10. QAxObject *workbook = excel->querySubObject("ActiveWorkBook");//获取当前工作簿 11. QAxObject *worksheets = workbook->querySubObject("Sheets");//获取工作表集合 12. QAxObject *worksheet = worksheets->querySubObject("Item(int)",1);//获取工作表集合的工作表1,即sheet1 13. QAxObject *cellX,*cellY; 14. for(int i=0;i 15. QString X="A"+QString: : number(i+1);//设置要操作的单元格,如A1 16. QString Y="B"+QString: : number(i+1); 17. cellX = worksheet->querySubObject("Range(QVariant, QVariant)",X);//获取单元格 18. cellY = worksheet->querySubObject("Range(QVariant, QVariant)",Y); 19. cellX->dynamicCall("SetValue(const QVariant&)",QVariant(ui->tableWidget->formula(i,0).toInt()));//设置单元格的值 20. cellY->dynamicCall("SetValue(const QVariant&)",QVariant(ui->tableWidget->formula(i,1).toInt())); 21. } 22. 23. workbook->dynamicCall("SaveAs(const QString&)",QDir: : toNativeSeparators(filepath));//保存至filepath,注意一定要用QDir: : toNativeSeparators将路径中的"/"转换为"\",不然一定保存不了。 24. workbook->dynamicCall("Close()");//关闭工作簿 25. excel->dynamicCall("Quit()");//关闭excel 26. delete excel; 27. excel=NULL; 28. } 另外附上在网上搜到的一些常用操作: QAxWidgetexcel("Excel.Application"); 1)显示当前窗口: excel.setProperty("Visible",true); 2)更改Excel标题栏: excel.setProperty("Caption","InvokeMicrosoftExcel"); 3)添加新工作簿: QAxObject*workbooks=excel.querySubObject("WorkBooks"); workbooks->dynamicCall("Add"); 4)打开已存在的工作簿: workbooks->dynamicCall("Open(constQString&)",QString("c: /test.xls")); 5)获取活动工作簿: QAxObject*workbook=excel.querySubObject("ActiveWorkBook"); 6)获取所有的工作表: QAxObject*worksheets=workbook->querySubObject("WorkSheets"); 7)获取工作表数量: intintCount=worksheets->property("Count").toInt(); 8)获取第一个工作表: QAxObject*worksheet=workbook->querySubObject("Worksheets(int)",1); 9)获取cell的值: QAxObject*range=worksheet->querySubObject("Cells(int,int)",1,1); 以上操作不一定每个都可用(都好用),仅作为参考吧。 起码我第9)个就没成功,不知为何? 后来我改用了Range(QVariant,QVariant)的方法来替代它。 最后附上我用QAxBase: : generateDocumentation()方法获得的对应于Excel.Application的带Qt数据类型的QAxObject或者QAxWidget中可用的属性、信号和槽列表(虽然我还不大会用,不过参考下还是很好的):
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Qt Excel 操作