QAxObject 读写 excel
程序员文章站
2024-03-17 19:33:58
...
初学Qt 时,发现Qt 并没有自带操作excel 的API, 所以很长时间内都是用的CSV 文件来储存数据报表。这段时间,因为需要,所以参考了一下网上资料,捣鼓了一番,发现使用 QAxObject 操作excel 也不是特别费劲,现在分享给大家。
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QAxObject>
#include <QAxWidget>
#include <QDebug>
#include <QList>
#include <QVariant>
#include <QDir>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_Write_clicked();
void on_Quit_clicked();
void on_read_clicked();
private:
Ui::MainWindow *ui;
QAxObject *excel;
QAxObject *workbooks;
QAxObject *workbook;
QAxObject *worksheets;
QAxObject *worksheet;
QAxObject *range;
QAxObject *cell;
QList<QVariant> allRowData;
};
#endif // MAINWINDOW_H
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
QString path = "E:/test.xlsx";
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//连接excel
excel = new QAxObject("Excel.Application");
//是否可视化excel
excel->dynamicCall("SetVisible(bool Visible)", true);
//是否弹出警告窗口
excel->setProperty("DisplayAlerts", false);
//获取工作簿集合
workbooks = excel->querySubObject("WorkBooks");
//新建一个工作簿
workbooks->dynamicCall("Add");
//获取当前工作簿
workbook = excel->querySubObject("ActiveWorkBook");
//获取工作表格集合
worksheets = workbook->querySubObject("Sheets");
//获取当前工作表格1,即sheet1
worksheet = worksheets->querySubObject("Item(int)", 1);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_Write_clicked()
{
//产生数据
for(int row = 1; row <=1000; row++) {
QList<QVariant> aRowData;
for(int column = 1; column <= 2; column++) {
aRowData.append(QVariant(row*column));
}
allRowData.append(QVariant(aRowData));
}
//选取范围
range = worksheet->querySubObject("Range(const QString)", "A1:B1000");
//批量写入
range->dynamicCall("SetValue(const QVariant&", QVariant(allRowData));
//设置字体大小
range->querySubObject("Font")->setProperty("Size", 30);
//获取单元格
cell = worksheet->querySubObject("Cells(int, int", 1, 1);
//储存一个字符串数据至表格
cell->dynamicCall("setValue(const QVariant&", QVariant("abc"));
//读取单元格数据
QString str = cell->dynamicCall("Value2()").toString();
qDebug()<<"The value of cell is "<< str <<endl;
//调整行高
worksheet->querySubObject("Range(const QString&", "1:1")->setProperty("RowHeight", 60);
//保存至文件注意一定要用QDir::toNativeSeparators将路径中的"/"转换为"\",不然一定保存不了。
workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(path));
workbook->dynamicCall("Close()");
}
void MainWindow::on_Quit_clicked()
{
excel->dynamicCall("Quit()");
}
void MainWindow::on_read_clicked()
{
//获取工作簿集合
workbooks = excel->querySubObject("WorkBooks");
//打开一个工作簿
workbooks->dynamicCall("Open(const QString&)", QDir::toNativeSeparators(path));
//获取当前工作簿
workbook = excel->querySubObject("ActiveWorkBook");
//获取工作表格集合
worksheets = workbook->querySubObject("Sheets");
//获取当前工作表格1,即sheet1
worksheet = worksheets->querySubObject("Item(int)", 1);
QVariant var;
//读取当前工作表所有数据
QAxObject *usedRange = worksheet->querySubObject("UsedRange");
var = usedRange->dynamicCall("Value");
QVariantList varRows = var.toList();
const int rowCount = varRows.size();
QVariantList rowData;
for(int i = 0; i<rowCount; ++i) {
rowData = varRows[i].toList();
qDebug()<< rowData.at(1);
}
workbook->dynamicCall("Close()");
}
使用函数
QAxObject* querySubObject(const char *name, QList<QVariant> &vars);
的童鞋请注意,虽然获取的子对象是由父对象统一管理,但他们是在父对象被析构时进行销毁的,所以如果操作单元格时,频繁获取单元格对象,需要手动del 一下,上面的代码是一个简单的demo,写法并不严谨,所以仅供参考。
原本是想将此封装成一个类,再分享给大家,不过此方法是需要安装 office 或者 WPS 之类的办公软件才能使用,对于用户来说,甚是麻烦,所以现在被弃用了。网上有第三方库 QtXlsx,不用安装office, 也比较好用,大家可以试一下,下面是链接。
参考资料:
- https://blog.csdn.net/czyt1988/article/details/52121360
- https://blog.csdn.net/qq_35057840/article/details/54318443
- https://www.cnblogs.com/woxinfeixiang2015/p/7677295.html
感谢网上提供参考资料的大神们!