QT界面开发-QAxObject 读写excel(COM组件)

QtCreator

VS2013

QAxObject在线帮助

Qt Documentation

使用中遇到的问题

QT界面开发-在VS2017环境下Qt读写Excel遇到"无法打开 源 文件 'QAxObject'"的错误解决办法【转载】
QT界面开发-QtCreator error: C1083: 无法打开包括文件:“QDomDocument”“QAxObject”【转载】

QT界面开发-QAxObject 解析 excel 时报错error LNK2019: 无法解析的外部符号

使用步骤,参考资料

由于这部分资料网上百度一大堆,我就不自己去写详细步骤了。

收集了几个写的比较好的博客文章。

转载自https://blog.csdn.net/weixin_37204973/article/details/80059096

初学Qt 时,发现Qt 并没有自带操作excel 的API, 所以很长时间内都是用的CSV 文件来储存数据报表。这段时间,因为需要,所以参考了一下网上资料,捣鼓了一番。

 1 //mainwindow.h
 2  
 3 #ifndef MAINWINDOW_H
 4 #define MAINWINDOW_H
 5  
 6 #include <QMainWindow>
 7 #include <QAxObject>
 8 #include <QAxWidget>
 9 #include <QDebug>
10 #include <QList>
11 #include <QVariant>
12 #include <QDir>
13  
14 namespace Ui {
15 class MainWindow;
16 }
17  
18 class MainWindow : public QMainWindow
19 {
20     Q_OBJECT
21  
22 public:
23     explicit MainWindow(QWidget *parent = 0);
24     ~MainWindow();
25  
26 private slots:
27     void on_Write_clicked();
28  
29     void on_Quit_clicked();
30  
31     void on_read_clicked();
32  
33 private:
34     Ui::MainWindow *ui;
35  
36     QAxObject *excel;
37     QAxObject *workbooks;
38     QAxObject *workbook;
39     QAxObject *worksheets;
40     QAxObject *worksheet;
41     QAxObject *range;
42     QAxObject *cell;
43     QList<QVariant> allRowData;
44 };
45  
46 #endif // MAINWINDOW_H
  1 //mainwindow.cpp
  2  
  3 #include "mainwindow.h"
  4 #include "ui_mainwindow.h"
  5  
  6 QString path = "E:/test.xlsx";
  7  
  8 MainWindow::MainWindow(QWidget *parent) :
  9     QMainWindow(parent),
 10     ui(new Ui::MainWindow)
 11 {
 12     ui->setupUi(this);
 13  
 14     //连接excel
 15     excel = new QAxObject("Excel.Application");
 16     //是否可视化excel
 17     excel->dynamicCall("SetVisible(bool Visible)", true);
 18     //是否弹出警告窗口
 19     excel->setProperty("DisplayAlerts", false);
 20  
 21     //获取工作簿集合
 22     workbooks = excel->querySubObject("WorkBooks");
 23     //新建一个工作簿
 24     workbooks->dynamicCall("Add");
 25     //获取当前工作簿
 26     workbook = excel->querySubObject("ActiveWorkBook");
 27     //获取工作表格集合
 28     worksheets = workbook->querySubObject("Sheets");
 29     //获取当前工作表格1,即sheet1
 30     worksheet  = worksheets->querySubObject("Item(int)", 1);
 31 }
 32  
 33 MainWindow::~MainWindow()
 34 {
 35     delete ui;
 36 }
 37  
 38 void MainWindow::on_Write_clicked()
 39 {
 40     //产生数据
 41     for(int row = 1; row <=1000; row++) {
 42         QList<QVariant> aRowData;
 43         for(int column = 1; column <= 2; column++) {
 44             aRowData.append(QVariant(row*column));
 45         }
 46         allRowData.append(QVariant(aRowData));
 47     }
 48  
 49     //选取范围
 50     range = worksheet->querySubObject("Range(const QString)", "A1:B1000");
 51     //批量写入
 52     range->dynamicCall("SetValue(const QVariant&", QVariant(allRowData));
 53     //设置字体大小
 54     range->querySubObject("Font")->setProperty("Size", 30);
 55     //获取单元格
 56     cell = worksheet->querySubObject("Cells(int, int", 1, 1);
 57     //储存一个字符串数据至表格
 58     cell->dynamicCall("setValue(const QVariant&", QVariant("abc"));
 59     //读取单元格数据
 60     QString str = cell->dynamicCall("Value2()").toString();
 61     qDebug()<<"The value of cell is "<< str <<endl;
 62     //调整行高
 63     worksheet->querySubObject("Range(const QString&", "1:1")->setProperty("RowHeight", 60);
 64     //保存至文件注意一定要用QDir::toNativeSeparators将路径中的"/"转换为"",不然一定保存不了。
 65     workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(path));
 66     workbook->dynamicCall("Close()");
 67 }
 68  
 69 void MainWindow::on_Quit_clicked()
 70 {
 71  
 72     excel->dynamicCall("Quit()");
 73 }
 74  
 75 void MainWindow::on_read_clicked()
 76 {
 77     //获取工作簿集合
 78     workbooks = excel->querySubObject("WorkBooks");
 79     //打开一个工作簿
 80     workbooks->dynamicCall("Open(const QString&)", QDir::toNativeSeparators(path));
 81     //获取当前工作簿
 82     workbook = excel->querySubObject("ActiveWorkBook");
 83     //获取工作表格集合
 84     worksheets = workbook->querySubObject("Sheets");
 85     //获取当前工作表格1,即sheet1
 86     worksheet  = worksheets->querySubObject("Item(int)", 1);
 87  
 88     QVariant var;
 89     //读取当前工作表所有数据
 90     QAxObject *usedRange = worksheet->querySubObject("UsedRange");
 91     var = usedRange->dynamicCall("Value");
 92  
 93     QVariantList varRows = var.toList();
 94     const int rowCount = varRows.size();
 95     QVariantList rowData;
 96     for(int i = 0; i<rowCount; ++i) {
 97         rowData = varRows[i].toList();
 98         qDebug()<< rowData.at(1);
 99     }
100     workbook->dynamicCall("Close()");
101 }
QAxObject* querySubObject(const char *name, QList<QVariant> &vars);

使用上面这个函数时,要注意,虽然获取的子对象是由父对象统一管理,但他们是在父对象被析构时进行销毁的,所以如果操作单元格时,频繁获取单元格对象,需要手动del 一下。

相关资料

QtXlsx 的配置

QtXlsx 使用例程

参考资料:

1.Qt 下快速读写Excel指南https://blog.csdn.net/czyt1988/article/details/52121360

2.qt之读写excelhttps://blog.csdn.net/qq_35057840/article/details/54318443

3.QT 操作 excel 教程https://www.cnblogs.com/woxinfeixiang2015/p/7677295.html

4.QT在子线程中使用QAxWidget需要初始化COM的问题https://blog.csdn.net/a1069962325/article/details/48975179

感谢网上提供参考资料的大神们!

原文地址:https://www.cnblogs.com/nxopen2018/p/12195775.html