QtCreator

QT界面开发-QAxObject 读写excel(COM组件)_参考资料

 

VS2013

QT界面开发-QAxObject 读写excel(COM组件)_数据_02

 

QAxObject在线帮助

​Qt Documentation​

 

使用中遇到的问题

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

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

 

使用步骤,参考资料

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

初学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 一下。


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