Qt Excel操作
Qt Excel操作
- 簡(jiǎn)單介紹
- 其他庫
- 基礎(chǔ)操作
- 添加模塊
- 相關(guān)代碼
- 遇到的坑
簡(jiǎn)單介紹
最近在寫一個(gè)小工具涉及到了Excel操作,順便學(xué)習(xí)記錄一下。文章內(nèi)使用的是Windows系統(tǒng)的ActiveX對(duì)象(QAxObject)操作Excel。
其他庫
Qt操作Excel的庫還有很多,可以參考Qt君寫的鏈接: Qt處理Excel的一些庫.
基礎(chǔ)操作
添加模塊
在Qt Creator中使用QAxObject需要先在pro中添加:
QT += axcontainer
在VS中使用的話需要在建工程或者,是項(xiàng)目右鍵的Qt Moudules中勾選ActiveQt container
包含頭文件ActiveQt/QAxObject
相關(guān)代碼
widget.h
#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <ActiveQt/QAxObject>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic: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_Hwidget.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");// 設(shè)置操作excel時(shí)不打開excel窗體m_pExcel->dynamicCall("SetVisible(bool Visible)",false);// 設(shè)置不顯示任何警告信息m_pExcel->setProperty("DisplayAlert",false);}// 打開已有的excel void Widget::OpenExcel() {QString strExcelPath = "C:\\Users\\Qcx\\Desktop\\test.xlsx";// 獲取當(dāng)前工作簿m_pWorkBooks = m_pExcel->querySubObject("WorkBooks");// 打開指定工作簿m_pWorkBook = m_pWorkBooks->querySubObject("Open(const QString&)",strExcelPath);if(m_pWorkBook){qDebug()<<"Open Excel Success!";}// 獲取sheetsm_pWorkSheets = m_pWorkBook->querySubObject("Sheets");// 獲取某個(gè)sheetm_pWorkSheet = m_pWorkSheets->querySubObject("Item(int)",1); }// 創(chuàng)建新的Excel void Widget::AddNewExcel() {// 獲取當(dāng)前工作簿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); }// 保存并關(guān)閉Excel void Widget::SaveAndClose() {QString strSavePath = "C:\\Users\\Qcx\\Desktop\\temp.xlsx";// 保存文件,一定要將路徑中的'/'轉(zhuǎn)為'\\',前者只能被Qt識(shí)別m_pWorkBook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(strSavePath));// 關(guān)閉文件m_pWorkBook->dynamicCall("Close()");// 關(guān)閉excelm_pExcel->dynamicCall("Quit()");delete m_pExcel;m_pExcel = nullptr; }// 獲取行數(shù) int Widget::GetRowsCount() {int iRows = 0;QAxObject *pRows = m_pWorkSheet->querySubObject("Rows");iRows = pRows->property("Count").toInt();return iRows; }// 獲取單元格內(nèi)容,行號(hào)+列號(hào) QString Widget::GetCell(int row, int column) {QAxObject *pCell = m_pWorkSheet->querySubObject("Range(int, int)", row, column);return pCell->property("Value").toString(); }// 獲取單元格內(nèi)容,單元格標(biāo)號(hào)如: A1,C5 QString Widget::GetCell(QString number) {QAxObject *pCell = m_pWorkSheet->querySubObject("Range(QString)", number);return pCell->property("Value").toString(); }// 設(shè)置單元格內(nèi)容,行號(hào)+列號(hào) void Widget::SetCell(int row, int column, QString value) {QAxObject *pCell = m_pWorkSheet->querySubObject("Range(int, int)", row, column);pCell->setProperty("Value", value); }// 設(shè)置單元格內(nèi)容,單元格標(biāo)號(hào)如: A1,C5 void Widget::SetCell(QString number, QString value) {QAxObject *pCell = m_pWorkSheet->querySubObject("Range(QString)", number);pCell->setProperty("Value", value); }// 設(shè)置單元格顏色的方式與設(shè)置值的方式一樣,都是先獲取到單元格,再設(shè)置屬性 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.
遇到的坑
在進(jìn)行關(guān)閉操作時(shí),明明執(zhí)行沒有任何錯(cuò)誤,指針也沒有異常,但就是Excel進(jìn)程沒有被殺死,我遇到的情況是電腦安裝了福昕閱讀器,會(huì)占用Excel的com接口。有兩種解決方案:
1、暴力簡(jiǎn)單,直接卸載福昕閱讀器;
2、打開Excel --> 選項(xiàng) --> 加載項(xiàng) --> 最下方的管理 --> 選中COM加載項(xiàng) --> 轉(zhuǎn)到 --> 取消FoxitReader PDF Creator COM Add-in。
總結(jié)
以上是生活随笔為你收集整理的Qt Excel操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 斯考特·杨(Scott Young)快速
- 下一篇: visibility属性