Qt5對Excel表格簡單、高效處理方法
阿新 • • 發佈:2019-02-14
由於經常用Qt對Excel中的一些資料進行處理,最終綜合出一套簡單好用的讀、寫資料方案。
主要程式碼如下(完整測試專案地址見本文最下方):
bool ExcelManger::Test(QString &path)
{
QAxObject *excel = NULL; //本例中,excel設定為Excel檔案的操作物件
QAxObject *workbooks = NULL;
QAxObject *workbook = NULL; //Excel操作物件
excel = new QAxObject("Excel.Application");
excel-> dynamicCall("SetVisible(bool)", true); //true 表示操作檔案時可見,false表示為不可見
workbooks = excel->querySubObject("WorkBooks");
//————————————————按檔案路徑開啟檔案————————————————————
workbook = workbooks->querySubObject("Open(QString&)", path);
// 獲取開啟的excel檔案中所有的工作sheet
QAxObject * worksheets = workbook->querySubObject("WorkSheets");
//—————————————————Excel檔案中表的個數:——————————————————
int iWorkSheet = worksheets->property("Count").toInt();
qDebug() << QString("Excel檔案中表的個數: %1").arg(QString::number(iWorkSheet));
// ————————————————獲取第n個工作表 querySubObject("Item(int)", n);——————————
QAxObject * worksheet = worksheets->querySubObject("Item(int)", 1);//本例獲取第一個,最後引數填1
//—————————獲取該sheet的資料範圍(可以理解為有資料的矩形區域)————
QAxObject * usedrange = worksheet->querySubObject("UsedRange");
//———————————————————獲取行數———————————————
QAxObject * rows = usedrange->querySubObject("Rows");
int iRows = rows->property("Count").toInt();
qDebug() << QString("行數為: %1").arg(QString::number(iRows));
//————————————獲取列數—————————
QAxObject * columns = usedrange->querySubObject("Columns");
int iColumns = columns->property("Count").toInt();
qDebug() << QString("列數為: %1").arg(QString::number(iColumns));
//————————資料的起始行———
int iStartRow = rows->property("Row").toInt();
qDebug() << QString("起始行為: %1").arg(QString::number(iStartRow));
//————————資料的起始列————————————
int iColumn = columns->property("Column").toInt();
qDebug() << QString("起始列為: %1").arg(QString::number(iColumn));
//——————————————讀出資料—————————————
//獲取第i行第j列的資料
//假如是第6行,第6列 對應表中F列6行,即F6
QAxObject *range1 = worksheet->querySubObject("Range(QString)", "F6");
QString strRow6Col6 = "";
strRow6Col6 = range1->property("Value").toString();
qDebug() << "第6行,第6列的資料為:" + strRow6Col6;
//列的轉換函式如下地址,第6列轉為F列,第29列轉為AC列
http://blog.csdn.net/y396397735/article/details/78312124
//—————————————寫入資料—————————————
//獲取F6的位置
QAxObject *range2 = worksheet->querySubObject("Range(QString)", "F6");
//寫入資料, 第6行,第6列
range2->setProperty("Value", "中共十九大");
QString newStr = "";
newStr = range2->property("Value").toString();
qDebug() << "寫入資料後,第6行,第6列的資料為:" + newStr;
//!!!!!!!一定要記得close,不然系統程序裡會出現n個EXCEL.EXE程序
workbook->dynamicCall("Close()");
excel->dynamicCall("Quit()");
if (excel)
{
delete excel;
excel = NULL;
}
return true;
}
根據自己的操作實踐結果:
處理前:
處理後:
應用程式輸出:
"Excel檔案中表的個數: 3"
"行數為: 9"
"列數為: 5"
"起始行為: 5"
"起始列為: 2"
"第6行,第6列的資料為:66666"
"寫入資料後,第6行,第6列的資料為:中共十九大"