使用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)
//新建一個工作簿
pWorkbooks->dynamicCall("Add");
//獲取當前工作簿
m_pWorkbook = m_pExcel->querySubObject("ActiveWorkBook");
if (!m_pWorkbook)
return true;
}
QAxObject* GTJRuleContrastExportExcel::setWorkBook(QString strSheetName)
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 *first_sheet = worksheets->querySubObject("Item(int)", 1);
first_sheet->dynamicCall("Select()");//選中 sheet
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)
//以下開始亂燉
//以下有些指標沒有判空,一定要養成指標判空的好習慣
//處理寫入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
使用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