简单介绍
最近在写一个小工具涉及到了Excel操作,顺便学习记录一下。文章内使用的是Windows系统的ActiveX对象(QAxObject)操作Excel。
其他库
Qt操作Excel的库还有很多,可以参考Qt君写的链接: Qt处理Excel的一些库.
基础操作
添加模块
在Qt Creator中使用QAxObject需要先在pro中添加:
QT += axcontainer
在VS中使用的话需要在建工程或者,是项目右键的Qt Moudules中勾选ActiveQt container
包含头文件ActiveQt/QAxObject
include<ActiveQt/QAxObject>
相关代码
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <ActiveQt/QAxObject>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void OpenExcel();
void AddNewExcel();
void SaveAndClose();
int GetRowsCount();
QString GetCell(int row, int column);
QString GetCell(QString numer);
void SetCell(int row, int column, QString value);
void SetCell(QString number, QString value);
void SetCellColor(int row, int column, QColor color);
private:
Ui::Widget *ui;
QAxObject *m_pExcel;
QAxObject *m_pWorkBooks;
QAxObject *m_pWorkBook;
QAxObject *m_pWorkSheets;
QAxObject *m_pWorkSheet;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QDir>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
, m_pExcel(nullptr)
, m_pWorkBooks(nullptr)
, m_pWorkBook(nullptr)
, m_pWorkSheets(nullptr)
, m_pWorkSheet(nullptr)
{
ui->setupUi(this);
// 连接excel 控件
m_pExcel = new QAxObject("Excel.Application");
// m_pExcel->setControl("Excel.Applicatio");
// 设置操作excel时不打开excel窗体
m_pExcel->dynamicCall("SetVisible(bool Visible)",false);
// 设置不显示任何警告信息
m_pExcel->setProperty("DisplayAlert",false);
}
// 打开已有的excel
void Widget::OpenExcel()
{
QString strExcelPath = "C:\\Users\\Qcx\\Desktop\\test.xlsx";
// 获取当前工作簿
m_pWorkBooks = m_pExcel->querySubObject("WorkBooks");
// 打开指定工作簿
m_pWorkBook = m_pWorkBooks->querySubObject("Open(const QString&)",strExcelPath);
if(m_pWorkBook)
{
qDebug()<<"Open Excel Success!";
}
// 获取sheets
m_pWorkSheets = m_pWorkBook->querySubObject("Sheets");
// 获取某个sheet
m_pWorkSheet = m_pWorkSheets->querySubObject("Item(int)",1);
}
// 创建新的Excel
void Widget::AddNewExcel()
{
// 获取当前工作簿
m_pWorkBooks = m_pExcel->querySubObject("WorkBooks");
m_pWorkBooks->dynamicCall("Add");
m_pWorkBook = m_pExcel->querySubObject("ActiveWorkBook");
m_pWorkSheets = m_pWorkBook->querySubObject("Sheets");
m_pWorkSheet = m_pWorkSheets->querySubObject("Item(int)",1);
}
// 保存并关闭Excel
void Widget::SaveAndClose()
{
QString strSavePath = "C:\\Users\\Qcx\\Desktop\\temp.xlsx";
// 保存文件,一定要将路径中的'/'转为'\\',前者只能被Qt识别
m_pWorkBook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(strSavePath));
// 关闭文件
m_pWorkBook->dynamicCall("Close()");
// 关闭excel
m_pExcel->dynamicCall("Quit()");
delete m_pExcel;
m_pExcel = nullptr;
}
// 获取行数
int Widget::GetRowsCount()
{
int iRows = 0;
QAxObject *pRows = m_pWorkSheet->querySubObject("Rows");
iRows = pRows->property("Count").toInt();
return iRows;
}
// 获取单元格内容,行号+列号
QString Widget::GetCell(int row, int column)
{
QAxObject *pCell = m_pWorkSheet->querySubObject("Range(int, int)", row, column);
return pCell->property("Value").toString();
}
// 获取单元格内容,单元格标号如: A1,C5
QString Widget::GetCell(QString number)
{
QAxObject *pCell = m_pWorkSheet->querySubObject("Range(QString)", number);
return pCell->property("Value").toString();
}
// 设置单元格内容,行号+列号
void Widget::SetCell(int row, int column, QString value)
{
QAxObject *pCell = m_pWorkSheet->querySubObject("Range(int, int)", row, column);
pCell->setProperty("Value", value);
}
// 设置单元格内容,单元格标号如: A1,C5
void Widget::SetCell(QString number, QString value)
{
QAxObject *pCell = m_pWorkSheet->querySubObject("Range(QString)", number);
pCell->setProperty("Value", value);
}
// 设置单元格颜色的方式与设置值的方式一样,都是先获取到单元格,再设置属性
void Widget::SetCellColor(int row, int column, QColor color)
{
QAxObject *pCell = m_pWorkSheet->querySubObject("Range(int, int)", row, column);
QAxObject *pInterior = pCell->querySubObject("Interior");
pInterior->setProperty("Color", color);
}
Widget::~Widget()
{
delete ui;
}
其他更多操作可参考该文章: Qt之操作Excel.
遇到的坑
在进行关闭操作时,明明执行没有任何错误,指针也没有异常,但就是Excel进程没有被杀死,我遇到的情况是电脑安装了福昕阅读器,会占用Excel的com接口。有两种解决方案:
1、暴力简单,直接卸载福昕阅读器;
2、打开Excel --> 选项 --> 加载项 --> 最下方的管理 --> 选中COM加载项 --> 转到 --> 取消FoxitReader PDF Creator COM Add-in。