38.QT-QAxObject快速寫入EXCEL示例

来源:https://www.cnblogs.com/lifexy/archive/2019/04/20/10743316.html
-Advertisement-
Play Games

參考鏈接: https://blog.csdn.net/czyt1988/article/details/52121360 http://blog.sina.com.cn/s/blog_a6fb6cc90101gv2p.html 1. QAxObject介紹 在QT中,有個自帶的QAxObject類 ...


參考鏈接: https://blog.csdn.net/czyt1988/article/details/52121360

http://blog.sina.com.cn/s/blog_a6fb6cc90101gv2p.html

 

1. QAxObject介紹

在QT中,有個自帶的QAxObject類,可以直接操作EXCEL

除此之外,當我們操作某個文件夾下的EXCEL的時候,都會在該文件夾下出現一個隱藏文件~$XX.xlsx,如下圖所示:

此時,如果我們再用QAxObject去操作這個文件時,該文件是只讀的,無法保存成功的,所以我們使用QAxObject時,需要提前判斷一次.

 

2.示例

首先在項目下創建一個模板templatePath.xlsx文件

 

3.效果如下

4.寫代碼

#include <QApplication>
#include "widget.h"
#include <QtGui>
#include <QAxObject>
#include <QStandardPaths>
#include <QFileDialog>
#include <QFileDialog>

 
/*excel操作*/
enum EXcel_ColumnType{
    ColumnA = 1,
    ColumnB = 2,
    ColumnC = 3,
    ColumnD = 4,
    ColumnE = 5,
    ColumnF = 6,
    ColumnG = 7,
    ColumnH = 8,
    ColumnI = 9
};

 
QString saveas()
{
    QString file;
    QString filter;
 

    //如果版本低於QT5,則需要將:
    //  QStandardPaths::writableLocation(QStandardPaths::DesktopLocation),
    //改為:QDesktopServices::storageLocation(QDesktopServices::DesktopLocation),
    file = QFileDialog::getSaveFileName (
     NULL,                               //父組件
    "另存為",                              //標題
     QStandardPaths::writableLocation(QStandardPaths::DesktopLocation),                 //設置路徑, .表示當前路徑,./表示更目錄
     "Excel(*.xlsx)",     //過濾器
     &filter  );

    return file;
}

//設置EXCEL中單個內容的數據
void  Excel_SetCell(QAxObject *worksheet,EXcel_ColumnType column,int row,QColor color,QString text)
{
  QAxObject *cell = worksheet->querySubObject("Cells(int,int)", row, column);
  cell->setProperty("Value", text);
  QAxObject *font = cell->querySubObject("Font");
  font->setProperty("Color", color);
}


//把QVariant轉為QList<QList<QVariant> >,用於快速讀出的
void castVariant2ListListVariant(const QVariant &var, QList<QList<QVariant> > &res)
{
    QVariantList varRows = var.toList();
    if(varRows.isEmpty())
    {
        return;
    }

    const int rowCount = varRows.size();
    QVariantList rowData;

    for(int i=0;i<rowCount;++i)
    {
        rowData = varRows[i].toList();
        res.push_back(rowData);
    }
}

//把QList<QList<QVariant> > 轉為QVariant,用於快速寫入的
void castListListVariant2Variant(const QList<QList<QVariant> > &cells, QVariant &res)
{
    QVariantList vars;
    const int rows = cells.size();
    for(int i=0;i<rows;++i)
    {
        vars.append(QVariant(cells[i]));
    }
    res = QVariant(vars);
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QString templatePath = "./template.xlsx";
    QFileInfo info(templatePath);

    if(!info.exists())
    {
            qDebug()<<"template.xlsx is NULL";
            return 0;
    }

    templatePath = info.absoluteFilePath();                   //獲取模板的絕地路徑
    templatePath = QDir::toNativeSeparators(templatePath);   //轉換一下路徑,讓windows能夠識別

    QString ExcelFile = QDir::toNativeSeparators(saveas());  //打開文件保存對話框,找到要保存的位置

    if(ExcelFile=="")
            return  0;

    QFile::copy(templatePath, ExcelFile);                   //將模板文件複製到要保存的位置去

    info.setFile(ExcelFile);
    info.setFile(info.dir().path()+"/~$"+info.fileName());

    if(info.exists())          //判斷一下,有沒有"~$XXX.xlsx"文件存在,是不是為只讀
    {
        qDebug()<<"報表屬性為只讀,請檢查文件是否已打開!";
         return   0;
    }

 
    QAxObject *excel = new QAxObject();//建立excel操作對象
    excel->setControl("Excel.Application");//連接Excel控制項
    excel->setProperty("Visible", true);//顯示窗體看效果
    excel->setProperty("DisplayAlerts", false);//顯示警告看效果
    QAxObject *workbooks = excel->querySubObject("WorkBooks");

    QAxObject* workbook = workbooks->querySubObject("Open(const QString&)",QDir::toNativeSeparators(ExcelFile) ); //打開

    excel->setProperty("Caption", "Qt Excel");      //標題為Qt Excel
    QAxObject *work_book = excel->querySubObject("ActiveWorkBook");

    QAxObject *worksheet = work_book->querySubObject("Sheets(int)",1);     //獲取表單1

    Excel_SetCell(worksheet,ColumnB,2,QColor(74,51,255),"12345");     //設置B2單元格內容為12345

    Excel_SetCell(worksheet,ColumnB,3,QColor(255,255,0),"B3");     //設置B3單元格內容

    Excel_SetCell(worksheet,ColumnB,4,QColor(255,0,0),"B4");     //設置B4單元格內容

 

    /*批量一次性設置A6~I106所在內容*/
    QAxObject *user_range = worksheet->querySubObject("Range(const QString&)","A6:I106");

    QList<QList<QVariant> > datas;
    for(int i=1;i<101;i++)
    {
        QList<QVariant> rows;
        for(int j=1;j<10;j++)
        {
            rows.append(i*j);
        }
        datas.append(rows);
    }

    QVariant var;
    castListListVariant2Variant(datas,var);

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

 
    workbook->dynamicCall("Save()" );

// workbook
->dynamicCall("Close()"); //關閉文件 // excel->dynamicCall("Quit()");//關閉excel return 0; }

 

未完待續,下章學習Qtxlsx庫操作EXCEL: https://www.cnblogs.com/lifexy/p/10743352.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • AQS 概述 AQS(隊列同步器,AbstractQueuedSynchronizer),是用來構建鎖或其他同步組件的核心基礎框架(比如 ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch) AQS的底層結構是:一個整型變數st ...
  • 你是否想過生成一份屬於你的微信個人數據報告,瞭解你的微信社交歷史。現在,我們基於python對微信好友進行全方位數據分析,包括:昵稱、性別、年齡、地區、備註名、個性簽名、頭像、群聊、公眾號等。 其中,在分析好友類型方面,主要統計出你的陌生人、星標好友、不讓他看我的朋友圈的好友、不看他的朋友圈的好友... ...
  • go 調用windows dll 的方法 ,代碼如下: ...
  • 第一個自己手寫的代碼~ If 與 Elif #pass 用法 寫代碼前加的兩行首碼 第二行顯示的告訴python解釋器,用什麼編碼來執行源代碼,一般在python2使用,python3可用可不用。 ...
  • unsafe.Pointer其實就是類似C的void *,在golang中是用於各種指針相互轉換的橋梁。uintptr是golang的內置類型,是能存儲指針的整型,uintptr的底層類型是int,它和unsafe.Pointer可相互轉換。uintptr和unsafe.Pointer的區別就是:u ...
  • 時隔三個多月,我終於想起我還有個博客,其實也不是忘了我這個博客,只是平時工作繁忙沒時間去寫博客,故今晚騰出時間來記錄一下上次工作中遇到的一個問題,給園友們分享出來,以免入坑。 上個星期在工作中使用JdbcTemplate執行了一個select * from table where id in (?, ...
  • 創建進程,守護進程,進程鎖Lock,進程通信IPC,JoinableQueue模塊簡介,進程池 ...
  • A.值棧概述 值棧(ValueStack),通俗的來說就是Struts2裡面用來管理和存儲數據的東西。struts2項目部署運行後,底層會創建一個action實例,同時也會在記憶體上劃分一塊區域,這個區域就是值棧,該值棧對象會貫穿整個Action生命周期,用來存儲這個過程中的數據。 B.值棧結構 首先 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...