• 使用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文件,

    主要读取内容:标题,工作表数目,工作表名称,起始行,起始列,行数,列数,单元格内容。

     

    1. QAxObject excel("Excel.Application");
    2. excel.setProperty("Visible", true);
    3. QAxObject *work_books = excel.querySubObject("WorkBooks");
    4. work_books->dynamicCall("Open (const QString&)", QString("E:/test.xlsx"));
    5. QVariant title_value = excel.property("Caption"); //获取标题
    6. qDebug()<<QString("excel title : ")<<title_value;
    7. QAxObject *work_book = excel.querySubObject("ActiveWorkBook");
    8. QAxObject *work_sheets = work_book->querySubObject("Sheets"); //Sheets也可换用WorkSheets
    9. int sheet_count = work_sheets->property("Count").toInt(); //获取工作表数目
    10. qDebug()<<QString("sheet count : ")<<sheet_count;
    11. for(int i=1; i<=sheet_count; i++)
    12. {
    13. QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", i); //Sheets(int)也可换用Worksheets(int)
    14. QString work_sheet_name = work_sheet->property("Name").toString(); //获取工作表名称
    15. QString message = QString("sheet ")+QString::number(i, 10)+ QString(" name");
    16. qDebug()<<message<<work_sheet_name;
    17. }
    18. if(sheet_count > 0)
    19. {
    20. QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", 1);
    21. QAxObject *used_range = work_sheet->querySubObject("UsedRange");
    22. QAxObject *rows = used_range->querySubObject("Rows");
    23. QAxObject *columns = used_range->querySubObject("Columns");
    24. int row_start = used_range->property("Row").toInt(); //获取起始行
    25. int column_start = used_range->property("Column").toInt(); //获取起始列
    26. int row_count = rows->property("Count").toInt(); //获取行数
    27. int column_count = columns->property("Count").toInt(); //获取列数
    28. for(int i=row_start; i
    29. {
    30. for(int j=column_start; j
    31. {
    32. QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", i, j);
    33. QVariant cell_value = cell->property("Value"); //获取单元格内容
    34. QString message = QString("row-")+QString::number(i, 10)+QString("-column-")+QString::number(j, 10)+QString(":");
    35. qDebug()<<message<<cell_value;
    36. }
    37. }
    38. }

    效果如下:

     

     Excel增、删、改

    主要操作:

    • 设置标题
    • 插入工作表(至最后一行)
    • 设置工作表名称
    • 删除工作表
    • 设置单元格内容
    • 设置单元格字体(类型、大小、加粗、斜体、下划线、颜色等)
    • 设置单元格对齐方式
    • 设置单元格高度、宽度
    • 设置单元格背景色、边框色
    • 合并/拆分单元格
    • 清空单元格

    代码如下:

    1. QAxObject excel("Excel.Application");
    2. excel.setProperty("Visible", true);
    3. QAxObject *work_books = excel.querySubObject("WorkBooks");
    4. work_books->dynamicCall("Open(const QString&)", "E:\\test.xlsx");
    5. excel.setProperty("Caption", "Qt Excel");
    6. QAxObject *work_book = excel.querySubObject("ActiveWorkBook");
    7. QAxObject *work_sheets = work_book->querySubObject("Sheets"); //Sheets也可换用WorkSheets
    8. //删除工作表(删除第一个)
    9. QAxObject *first_sheet = work_sheets->querySubObject("Item(int)", 1);
    10. first_sheet->dynamicCall("delete");
    11. //插入工作表(插入至最后一行)
    12. int sheet_count = work_sheets->property("Count").toInt(); //获取工作表数目
    13. QAxObject *last_sheet = work_sheets->querySubObject("Item(int)", sheet_count);
    14. QAxObject *work_sheet = work_sheets->querySubObject("Add(QVariant)", last_sheet->asVariant());
    15. last_sheet->dynamicCall("Move(QVariant)", work_sheet->asVariant());
    16. work_sheet->setProperty("Name", "Qt Sheet"); //设置工作表名称
    17. //操作单元格(第2行第2列)
    18. QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", 2, 2);
    19. cell->setProperty("Value", "Java C++ C# PHP Perl Python Delphi Ruby"); //设置单元格值
    20. cell->setProperty("RowHeight", 50); //设置单元格行高
    21. cell->setProperty("ColumnWidth", 30); //设置单元格列宽
    22. cell->setProperty("HorizontalAlignment", -4108); //左对齐(xlLeft):-4131 居中(xlCenter):-4108 右对齐(xlRight):-4152
    23. cell->setProperty("VerticalAlignment", -4108); //上对齐(xlTop)-4160 居中(xlCenter):-4108 下对齐(xlBottom):-4107
    24. cell->setProperty("WrapText", true); //内容过多,自动换行
    25. //cell->dynamicCall("ClearContents()"); //清空单元格内容
    26. QAxObject* interior = cell->querySubObject("Interior");
    27. interior->setProperty("Color", QColor(0, 255, 0)); //设置单元格背景色(绿色)
    28. QAxObject* border = cell->querySubObject("Borders");
    29. border->setProperty("Color", QColor(0, 0, 255)); //设置单元格边框色(蓝色)
    30. QAxObject *font = cell->querySubObject("Font"); //获取单元格字体
    31. font->setProperty("Name", QStringLiteral("华文彩云")); //设置单元格字体
    32. font->setProperty("Bold", true); //设置单元格字体加粗
    33. font->setProperty("Size", 20); //设置单元格字体大小
    34. font->setProperty("Italic", true); //设置单元格字体斜体
    35. font->setProperty("Underline", 2); //设置单元格下划线
    36. font->setProperty("Color", QColor(255, 0, 0)); //设置单元格字体颜色(红色)
    37. //设置单元格内容,并合并单元格(第5行第3列-第8行第5列)
    38. QAxObject *cell_5_6 = work_sheet->querySubObject("Cells(int,int)", 5, 3);
    39. cell_5_6->setProperty("Value", "Java"); //设置单元格值
    40. QAxObject *cell_8_5 = work_sheet->querySubObject("Cells(int,int)", 8, 5);
    41. cell_8_5->setProperty("Value", "C++");
    42. QString merge_cell;
    43. merge_cell.append(QChar(3 - 1 + 'A')); //初始列
    44. merge_cell.append(QString::number(5)); //初始行
    45. merge_cell.append(":");
    46. merge_cell.append(QChar(5 - 1 + 'A')); //终止列
    47. merge_cell.append(QString::number(8)); //终止行
    48. QAxObject *merge_range = work_sheet->querySubObject("Range(const QString&)", merge_cell);
    49. merge_range->setProperty("HorizontalAlignment", -4108);
    50. merge_range->setProperty("VerticalAlignment", -4108);
    51. merge_range->setProperty("WrapText", true);
    52. merge_range->setProperty("MergeCells", true); //合并单元格
    53. //merge_range->setProperty("MergeCells", false); //拆分单元格
    54. //work_book->dynamicCall("Save()"); //保存文件(为了对比test与下面的test2文件,这里不做保存操作) work_book->dynamicCall("SaveAs(const QString&)", "E:\\test2.xlsx"); //另存为另一个文件
    55. work_book->dynamicCall("Close(Boolean)", false); //关闭文件
    56. excel.dynamicCall("Quit(void)"); //退出

     

    效果如下:

    操作前:

    Qt之操作Excel

    操作后:

    Qt之操作Excel

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

    看下图:

    Qt之操作Excel

  • 相关阅读:
    PyTorch - Diffusion Model 公式推导 (1)
    Linux基础开发工具学习
    企业数字化时代,浅谈数据分析报告
    不使用oh-my-zsh配置轻量级zsh环境
    攻防演练蓝队|Windows应急响应入侵排查
    PPT转PDF转换器:便捷的批量PPT转PDF转换软件
    Linux无文件木马程序渗透测试复现
    如何进行性能评估
    网络安全(黑客)—自学笔记
    跳动爱心代码-李峋同款爱心代码1(完整代码)
  • 原文地址:https://blog.csdn.net/hulinhulin/article/details/132677540