Qt excel 操作使用說明


轉載來自:https://www.cnblogs.com/ybqjymy/p/13864716.html

學習背景:

    適合熟悉些qt開發,但是不是深入了解的開發者學習。具體實現(qt 5.1版本),office2007 Excel做驗證,Win 7(64位),如有講解有誤,歡迎斧正!

一.簡單介紹

    QAxObject是Qt提供的包裝COM組件的類,通過COM通過COM操作使用QAxObject類,使用此類,需要在pro文件中添加

QT  +=  axcontainer

二.與excel com連接的方法

#include <ActiveQt/QAxObject>
QAxObject *excel = new QAxObject("Excel.Application"); //!建立excel操作對象,並連接Excel控件
excel->dynamicCall("SetVisible (bool Visible)", "false"); //! 設置為不顯示窗體
excel->setProperty("DisplayAlerts", false); //! 不顯示任何警告信息, 如關閉時的是否保存提示
excel->dynamicCall("Quit(void)"); //! 關閉excel程序,操作完后記着關閉,由於是隱藏在后台進程中,不關閉進程會有很多excel.exe。
workbook->dynamicCall("Close(Boolean)", false); //! 關閉exce程序先關閉.xls文件

三.Excel基本操作

  只介紹簡單的讀寫操作,需要修改單元格格式等操作,請"Excel VBA參考手冊.chm"

  3.1  excel文件操作

   獲取當前工作簿的集合

QAxObject *workbooks =  excel->querySubObject("Workbooks"); //! 獲取工作簿(excel文件)集合

  新建一個工作簿

workbooks->synamicCall("Add"); //新建一個工作簿
QAxObject *workbook = excel->querySubObject("ActiveWorkBook"); //! 獲取當前工作簿

  打開一個已有的工作簿

QString filename = "e:/123.xlsx";
QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", filename);

  保存工作簿

workbook->dynamicCall("Save()");   //!保存文件
workbook->dynamicCall("Close(Boolean)", false);  //! 關閉文件 
excel->dynamicCall("Quit()"); //! 關閉excel

  另存為工作簿

QDir::toNativeSeparators,將路徑中的"/"轉換為"\",否則無法保存,"/"只是qt中可以識別
workbook->dynamiCall("SaveAs(const QString&)",  QDit::toNativeSeparators(filename));
workbook->synamicCall("Close(Boolean)", false); //! 關閉文件
excel->dynamicCall("Quit()"); //! 關閉excel

  3.2 Sheet工作表操作

  獲取所有工作表

QAxObject *worksheets = workbook->querySubObject("Sheets"):

  根據序號獲取某個工作表,序號順序就是excel 打開后下方的排序

QAxObject *worksheet = worksheets->querySubObejct("Item(int)", 1);

  獲取表中的行數列數 

QAxObject* usedrange = worksheet->querySubObject("UsedRange"); //! sheet 范圍
int intRowStart = usedrange->property("Row").toInt(); //! 起始行數
int intColStart = usedrange->property("Column").toInt(); //! 起始列數
QAxObject *rows, *columns;
rows = usedrange->querySubObject("Rows"): //! 行
columns = usedrange->querySubObject("Columns"); //! 列
int intRow = rows->property("Count").toInt(); //! 行數
int intCol = columns->property("Count").toInt(); //! 列數

  3.3 內容操作

  數據內容操作--獲取單元格--基於坐標

QAxObject *cell = worksheet->querySubObject("Cells(int, int)", i,  j);

  數據內容操作--獲取單元格--基於行列名稱

QAxObject *cell = worksheet->querySubObject("Range(QVariant, QVariant)", "A1");

  數據內容操作--讀單元格內容

QVariant cell_value = cell->property("Value");

  數據內容操作-- 寫單元格內容

cell->setProperty("Value",  "內容");

4.其他(沒有實踐操作)

  4.1  大數據量讀取

    讀取所有單元格內容-數據量大,只需要進行一次操作即可讀取所有內容,避免重復對每個單元格進行QAxObect操作

QVariant var;
QAxObject * usedRange = sheet->querySubObject("UseRange"); //! 獲取用戶區域范圍
if(NULL == usedRange || usedRange->isNull())
{
    return var;
}
var = usedRange->dynamicCall("Value"); // 讀取區域內所有值
delete usedRange;

 

  此時結果以QVariant保存,需要自行轉化為QList<QList<QVariant>>

QList<QList<QVariant>> excel_list;
auto rows = var.toList();

for(auto row:rows)
{
  excel_list.append(row.toList());
}

 

  4.2 大數據寫入

  以QList<QList<QVariant>>存儲,需要限定范圍

QAxObject *user_rang = this->sheet->querySubObject("Rang(const QString&)", "A1:D100");

   寫入數據

rang->setProperty("Value", var); 

  4.3 簡單的范例

//  HRESULT r = OleInitialize(0);
   // if(r != S_OK && r != S_FALSE)
   // {
        //qWaring("Qt:初始化Ole 失敗(error %x)", (unsigned int)r);
    //}
    QString filename = "e:/123.xlsx"; //具體路徑
    QFile  file(filename);
    bool isExit = file.exists();
    if(!isExit)
        return false;
    qDebug()<<"isExit"<<isExit;
    qDebug()<<filename;
    QAxObject *excel = new QAxObject("Excel.Application");
    excel->dynamicCall("SetVisible(bool Visble)", "false");
    excel->setProperty("DisplayAlerts", false);
    QAxObject *workbooks = excel->querySubObject("WorkBooks");
    QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", filename);
    QAxObject *worksheets = workbook->querySubObject("Sheets");
    QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1);

    //寫入到指定位置
    QAxObject *workrang = worksheet->querySubObject("Cells(int, int)", 5, 1);
    //不能這么存
    workrang->dynamicCall("SetValue(const QString&)", QString("1ssssssfffssssssssssssssssssssssssssssss10987654321"));


    //讀取出來並打印
    QAxObject *workrang1 = worksheet->querySubObject("Cells(int,int)", 3, 5);

    QVariant var = workrang1->dynamicCall("Value");
    qDebug()<<var;
    qDebug()<<var.toDouble();

    //另存保存
    //workbook->dynamicCall("SaveAs(const QString&)",
             //             QDir::toNativeSeparators(filename));

    workbook->dynamicCall("Save()", true);
    //關閉文件
    workbook->dynamicCall("Close(Boolean)", true);
    excel->dynamicCall("Quit()");
    delete excel;
    excel = NULL;
   // OleUninitialize();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM