首頁>Club>
7
回覆列表
  • 1 # 靈敏風鈴9h

    使用Qt自帶的axcontainer模組中的QAxObject類操作Excel需要知道其中的方法和屬性,以下總結也是工作過程中用到過的。


    使用QAxObject不足之處:


    依賴本地Excel軟體,否則無法正常匯出。

    匯出資料量太大時,會影響效能,親測,60w條資料需要兩分鐘。

    bool ExportExcel::addWorkbook()

    {

    m_pExcel = new QAxObject();

    //連線Excel控制元件

    if (!m_pExcel->setControl("Excel.Application"))

    return false;

    //窗體顯示控制,用於除錯,此處放開,匯出excel整個過程都可以看到,想放電影一樣

    //m_pExcel->dynamicCall("SetVisible (bool Visible)", true);

    //不顯示任何警告資訊。如果為true那麼在關閉是會出現類似“檔案已修改,是否儲存”的提示

    m_pExcel->setProperty("DisplayAlerts", false);

    //獲取工作簿集合

    auto pWorkbooks = m_pExcel->querySubObject("WorkBooks");

    if (!pWorkbooks)

    return false;

    //新建一個工作簿

    pWorkbooks->dynamicCall("Add");

    //獲取當前工作簿

    m_pWorkbook = m_pExcel->querySubObject("ActiveWorkBook");

    if (!m_pWorkbook)

    return false;

    return true;

    }

    QAxObject* GTJRuleContrastExportExcel::setWorkBook(QString strSheetName)

    {

    if (!m_pWorkbook)

    {

    return nullptr;

    }


    QAxObject *worksheets = m_pWorkbook->querySubObject("Sheets");//獲取工作表集合

    int sheet_count = worksheets->property("Count").toInt(); //獲取工作表數目

    QAxObject *last_sheet = worksheets->querySubObject("Item(int)", sheet_count);

    QAxObject *work_sheet = worksheets->querySubObject("Add(QVariant)", last_sheet->asVariant());

    work_sheet->dynamicCall("Move(QVariant)", last_sheet->asVariant());

    work_sheet->setProperty("Name", strSheetName); //設定工作表Sheet名

    return work_sheet;

    }

    void ExportExcel::endExport() //在解構函式中呼叫

    {

    if (m_pWorkbook)

    {

    QAxObject *worksheets = m_pWorkbook->querySubObject("Sheets");//獲取工作表集合

    QAxObject *first_sheet = worksheets->querySubObject("Item(int)", 1);

    first_sheet->dynamicCall("Select()");//選中 sheet


    int sheet_count = worksheets->property("Count").toInt(); //獲取工作表數目

    first_sheet = worksheets->querySubObject("Item(int)", sheet_count);

    first_sheet->dynamicCall("delete");//刪除最後一個sheet頁,為:sheet1


    m_pWorkbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(m_strSavePath));//儲存至filepath,注意一定要用QDir::toNativeSeparators將路徑中的"/"轉換為"\",不然一定儲存不了。

    m_pWorkbook->dynamicCall("Close()");//關閉工作簿

    }


    if (m_pExcel)

    {

    m_pExcel->dynamicCall("Quit()");//關閉excel

    delete m_pExcel;

    m_pExcel = nullptr;

    }

    }

    void ExportExcel::startExport()

    {

    if (!addWorkbook())

    {

    return;

    }

    QAxObject *work_sheet = setWorkBook(strSheetName);

    if (!work_sheet)

    {

    return;

    }

    //以下開始亂燉

    //以下有些指標沒有判空,一定要養成指標判空的好習慣

    //處理寫入excel單元格資料

    //方式一,使用Range方法統一寫入excel表格,資料量過大時,可以提升效能

    {

    QList<QVariant> oRowdata;

    QList<QVariant> aline;

    aline.append(QVariant(QStringLiteral("哈哈")));

    aline.append(QVariant(QStringLiteral("呵呵")));

    aline.append(QVariant(QStringLiteral("嘿嘿")));

    QVariant conv(aline);

    oRowdata.append(conv);

    QVariant oData(oRowdata);

    QString strRange = "A"+ QString::number(1) + ":" + "C" + QString::number(1);//A1:C1,需寫入資料的表格範圍

    QAxObject *oRange = work_sheet->querySubObject("Range(QString)", strRange);

    if (oRange)

    {

    oRange->setProperty("Value2", oData);//設定單元格值,使用Value2 wps 和 office可以正常匯出資料

    }

    }

    //方式二,指定行列寫入資料,這種方式不僅顯得很笨拙,而且資料量很大時,慢的要死,主要是每寫入一個數據都要訪問一次表格,效能很低。

    {

    //第5行第3列

    QAxObject *cell_5_3 = work_sheet->querySubObject("Cells(int,int)", 5, 3);

    cell_5_3->setProperty("Value2", "C++");

    }

    {

    QAxObject *pCell = work_sheet->querySubObject("Range(const QString&)", "A1:C1");

    if (pCell)

    {

    //字型對齊(居中)

    pCell ->setProperty("HorizontalAlignment", -4108);//左對齊(xlLeft):-4131 居中(xlCenter):-4108 右對齊(xlRight):-4152

    pCell ->setProperty("VerticalAlignment", -4108); //上對齊(xlTop)-4160 居中(xlCenter):-4108 下對齊(xlBottom):-4107

    //設定字型

    QAxObject *font = pCell->querySubObject("Font"); //獲取單元格字型

    font->setProperty("Bold", true); //字型加粗

    font->setProperty("Name", QStringLiteral("華文彩雲")); //設定單元格字型

    font->setProperty("Bold", true); //設定單元格字型加粗

    font->setProperty("Size", 20); //設定單元格字型大小

    font->setProperty("Italic", true); //設定單元格字型斜體

    font->setProperty("Underline", 2); //設定單元格下劃線

    font->setProperty("Color", QColor(255, 0, 0)); //設定單元格字型顏色(紅色)

    //設定單元格背景色(灰色)

    QColor bkColor(125, 125, 125);

    QAxObject* interior = pCell->querySubObject("Interior");

    interior->setProperty("Color", bkColor);

    //繪製單元格邊框(黑色)

    QAxObject* border = pCell->querySubObject("Borders");

    border->setProperty("Color", QColor(0, 0, 0));

    //建立組

    QAxObject* rows = pCell->querySubObject("Rows");

    rows->querySubObject("Group");

    }


    //寬度自適應

    auto range = work_sheet->querySubObject("UsedRange");

    QAxObject * cells = range->querySubObject("Columns");

    if (cells)

    {

    cells->dynamicCall("AutoFit

  • 中秋節和大豐收的關聯?
  • 德育之星獎狀內容咋寫?