经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
38.QT-QAxObject快速写入EXCEL示例
来源:cnblogs  作者:NQian  时间:2019/4/22 9:19:56  对本文有异议

参考链接: https://blog.csdn.net/czyt1988/article/details/52121360

http://blog.sina.com.cn/s/blog_a6fb6cc90101gv2p.html

 

1. QAxObject介绍

在QT中,有个自带的QAxObject类,可以直接操作EXCEL

除此之外,当我们操作某个文件夹下的EXCEL的时候,都会在该文件夹下出现一个隐藏文件~$XX.xlsx,如下图所示:

此时,如果我们再用QAxObject去操作这个文件时,该文件是只读的,无法保存成功的,所以我们使用QAxObject时,需要提前判断一次.

 

2.示例

首先在项目下创建一个模板templatePath.xlsx文件

 

3.效果如下

4.写代码

  1. #include <QApplication>
  2. #include "widget.h"
  3. #include <QtGui>
  4. #include <QAxObject>
  5. #include <QStandardPaths>
  6. #include <QFileDialog>
  7. #include <QFileDialog>
  8.  
  9. /*excel操作*/
  10. enum EXcel_ColumnType{
  11. ColumnA = 1,
  12. ColumnB = 2,
  13. ColumnC = 3,
  14. ColumnD = 4,
  15. ColumnE = 5,
  16. ColumnF = 6,
  17. ColumnG = 7,
  18. ColumnH = 8,
  19. ColumnI = 9
  20. };
  21. QString saveas()
  22. {
  23. QString file;
  24. QString filter;
  25. //如果版本低于QT5,则需要将:
  26. // QStandardPaths::writableLocation(QStandardPaths::DesktopLocation),
  27. //改为:QDesktopServices::storageLocation(QDesktopServices::DesktopLocation),
  28. file = QFileDialog::getSaveFileName (
  29. NULL, //父组件
  30. "另存为", //标题
  31. QStandardPaths::writableLocation(QStandardPaths::DesktopLocation), //设置路径, .表示当前路径,./表示更目录
  32. "Excel(*.xlsx)", //过滤器
  33. &filter );
  34. return file;
  35. }
  36. //设置EXCEL中单个内容的数据
  37. void Excel_SetCell(QAxObject *worksheet,EXcel_ColumnType column,int row,QColor color,QString text)
  38. {
  39. QAxObject *cell = worksheet->querySubObject("Cells(int,int)", row, column);
  40. cell->setProperty("Value", text);
  41. QAxObject *font = cell->querySubObject("Font");
  42. font->setProperty("Color", color);
  43. }
  44. //把QVariant转为QList<QList<QVariant> >,用于快速读出的
  45. void castVariant2ListListVariant(const QVariant &var, QList<QList<QVariant> > &res)
  46. {
  47. QVariantList varRows = var.toList();
  48. if(varRows.isEmpty())
  49. {
  50. return;
  51. }
  52. const int rowCount = varRows.size();
  53. QVariantList rowData;
  54. for(int i=0;i<rowCount;++i)
  55. {
  56. rowData = varRows[i].toList();
  57. res.push_back(rowData);
  58. }
  59. }
  60. //把QList<QList<QVariant> > 转为QVariant,用于快速写入的
  61. void castListListVariant2Variant(const QList<QList<QVariant> > &cells, QVariant &res)
  62. {
  63. QVariantList vars;
  64. const int rows = cells.size();
  65. for(int i=0;i<rows;++i)
  66. {
  67. vars.append(QVariant(cells[i]));
  68. }
  69. res = QVariant(vars);
  70. }
  71. int main(int argc, char *argv[])
  72. {
  73. QApplication a(argc, argv);
  74. QString templatePath = "./template.xlsx";
  75. QFileInfo info(templatePath);
  76. if(!info.exists())
  77. {
  78. qDebug()<<"template.xlsx is NULL";
  79. return 0;
  80. }
  81. templatePath = info.absoluteFilePath(); //获取模板的绝地路径
  82. templatePath = QDir::toNativeSeparators(templatePath); //转换一下路径,让windows能够识别
  83. QString ExcelFile = QDir::toNativeSeparators(saveas()); //打开文件保存对话框,找到要保存的位置
  84.  
  85. if(ExcelFile=="")
  86. return 0;
  87. QFile::copy(templatePath, ExcelFile); //将模板文件复制到要保存的位置去
  88. info.setFile(ExcelFile);
  89. info.setFile(info.dir().path()+"/~$"+info.fileName());
  90. if(info.exists()) //判断一下,有没有"~$XXX.xlsx"文件存在,是不是为只读
  91. {
  92. qDebug()<<"报表属性为只读,请检查文件是否已打开!";
  93. return 0;
  94. }
  95. QAxObject *excel = new QAxObject();//建立excel操作对象
  96. excel->setControl("Excel.Application");//连接Excel控件
  97. excel->setProperty("Visible", true);//显示窗体看效果
  98. excel->setProperty("DisplayAlerts", false);//显示警告看效果
  99. QAxObject *workbooks = excel->querySubObject("WorkBooks");
  100. QAxObject* workbook = workbooks->querySubObject("Open(const QString&)",QDir::toNativeSeparators(ExcelFile) ); //打开
  101. excel->setProperty("Caption", "Qt Excel"); //标题为Qt Excel
  102. QAxObject *work_book = excel->querySubObject("ActiveWorkBook");
  103. QAxObject *worksheet = work_book->querySubObject("Sheets(int)",1); //获取表单1
  104. Excel_SetCell(worksheet,ColumnB,2,QColor(74,51,255),"12345"); //设置B2单元格内容为12345
  105. Excel_SetCell(worksheet,ColumnB,3,QColor(255,255,0),"B3"); //设置B3单元格内容
  106. Excel_SetCell(worksheet,ColumnB,4,QColor(255,0,0),"B4"); //设置B4单元格内容
  107.  
  108.  
  109. /*批量一次性设置A6~I106所在内容*/
  110. QAxObject *user_range = worksheet->querySubObject("Range(const QString&)","A6:I106");
  111. QList<QList<QVariant> > datas;
  112. for(int i=1;i<101;i++)
  113. {
  114. QList<QVariant> rows;
  115. for(int j=1;j<10;j++)
  116. {
  117. rows.append(i*j);
  118. }
  119. datas.append(rows);
  120. }
  121. QVariant var;
  122. castListListVariant2Variant(datas,var);
  123. user_range->setProperty("Value", var);
  124. workbook->dynamicCall("Save()" );

  125. // workbook->dynamicCall("Close()"); //关闭文件
  126. // excel->dynamicCall("Quit()");//关闭excel
  127.  
  128. return 0;
  129. }

 

未完待续,下章学习Qtxlsx库操作EXCEL: https://www.cnblogs.com/lifexy/p/10743352.html

原文链接:http://www.cnblogs.com/lifexy/p/10743316.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号