Qt Excel操作

Qt Excel操作

  • 简单介绍
  • 其他库
  • 基础操作
    • 添加模块
    • 相关代码
  • 遇到的坑

简单介绍

最近在写一个小工具涉及到了Excel操作,顺便学习记录一下。文章内使用的是Windows系统的ActiveX对象(QAxObject)操作Excel。

其他库

Qt操作Excel的库还有很多,可以参考Qt君写的链接: Qt处理Excel的一些库.

基础操作

添加模块

在Qt Creator中使用QAxObject需要先在pro中添加:
QT += axcontainer
在VS中使用的话需要在建工程或者,是项目右键的Qt Moudules中勾选ActiveQt containerQt Excel操作_第1张图片
包含头文件ActiveQt/QAxObject

include<ActiveQt/QAxObject>

相关代码

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 

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 
#include 

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。

你可能感兴趣的:(Qt,excel,c++,qt)