在vs2015上面用qt對excel進行操作


1、首先給Qt添加axcontainer模塊,添加步驟如下:

 

 

 

2、添加頭文件

#include<QAxObject>

 

3、對EXCEL的操作,下面代碼來源於

https://blog.csdn.net/A18373279153/article/details/78557209

bool adminFinancial::exportToExcel() { QString filepath=QFileDialog::getSaveFileName(this,tr("Save orbit"),".",tr("Microsoft Office 2007 (*.xlsx)"));//獲取保存路徑
        if(!filepath.isEmpty()){ QAxObject *excel = new QAxObject(this); excel->setControl("Excel.Application");//連接Excel控件
            excel->dynamicCall("SetVisible (bool Visible)","false");//不顯示窗體
            excel->setProperty("DisplayAlerts", false);//不顯示任何警告信息。如果為true那么在關閉是會出現類似“文件已修改,是否保存”的提示
 QAxObject *workbooks = excel->querySubObject("WorkBooks");//獲取工作簿集合
            workbooks->dynamicCall("Add");//新建一個工作簿
            QAxObject *workbook = excel->querySubObject("ActiveWorkBook");//獲取當前工作簿
            QAxObject *worksheets = workbook->querySubObject("Sheets");//獲取工作表集合
            QAxObject *worksheet = worksheets->querySubObject("Item(int)",1);//獲取工作表集合的工作表1,即sheet1
 QAxObject *cellA,*cellB,*cellC,*cellD; //設置標題
            int cellrow=1; QString A="A"+QString::number(cellrow);//設置要操作的單元格,如A1
            QString B="B"+QString::number(cellrow); QString C="C"+QString::number(cellrow); QString D="D"+QString::number(cellrow); cellA = worksheet->querySubObject("Range(QVariant, QVariant)",A);//獲取單元格
            cellB = worksheet->querySubObject("Range(QVariant, QVariant)",B); cellC=worksheet->querySubObject("Range(QVariant, QVariant)",C); cellD=worksheet->querySubObject("Range(QVariant, QVariant)",D); cellA->dynamicCall("SetValue(const QVariant&)",QVariant("流水號"));//設置單元格的值
            cellB->dynamicCall("SetValue(const QVariant&)",QVariant("用戶名")); cellC->dynamicCall("SetValue(const QVariant&)",QVariant("金額")); cellD->dynamicCall("SetValue(const QVariant&)",QVariant("日期")); cellrow++; int rows=this->model->rowCount(); for(int i=0;i<rows;i++){ QString A="A"+QString::number(cellrow);//設置要操作的單元格,如A1
                QString B="B"+QString::number(cellrow); QString C="C"+QString::number(cellrow); QString D="D"+QString::number(cellrow); cellA = worksheet->querySubObject("Range(QVariant, QVariant)",A);//獲取單元格
                cellB = worksheet->querySubObject("Range(QVariant, QVariant)",B); cellC=worksheet->querySubObject("Range(QVariant, QVariant)",C); cellD=worksheet->querySubObject("Range(QVariant, QVariant)",D); cellA->dynamicCall("SetValue(const QVariant&)",QVariant(this->model->item(i,0)->data(Qt::DisplayRole).toString()));//設置單元格的值
                cellB->dynamicCall("SetValue(const QVariant&)",QVariant(this->model->item(i,1)->data(Qt::DisplayRole).toString())); cellC->dynamicCall("SetValue(const QVariant&)",QVariant(this->model->item(i,2)->data(Qt::DisplayRole).toString())); cellD->dynamicCall("SetValue(const QVariant&)",QVariant(this->model->item(i,3)->data(Qt::DisplayRole).toString cellrow++; } workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(filepath));//保存至filepath,注意一定要用QDir::toNativeSeparators將路徑中的"/"轉換為"\",不然一定保存不了。
            workbook->dynamicCall("Close()");//關閉工作簿
            excel->dynamicCall("Quit()");//關閉excel
            delete excel; excel=NULL; } return true; }

 

4、QAxObject的一些常用函數,函數整理來源於:

https://blog.csdn.net/houxiaoliwang/article/details/104559919

<1>讀取內容:

  • 標題
  • 工作表數目
  • 工作表名稱
  • 起始行
  • 起始列
  • 行數
  • 列數
  • 單元格內容
QAxObject excel("Excel.Application"); excel.setProperty("Visible", true); QAxObject *work_books = excel.querySubObject("WorkBooks"); work_books->dynamicCall("Open (const QString&)", QString("E:/test.xlsx")); QVariant title_value = excel.property("Caption");  //獲取標題
qDebug()<<QString("excel title : ")<<title_value; QAxObject *work_book = excel.querySubObject("ActiveWorkBook"); QAxObject *work_sheets = work_book->querySubObject("Sheets");  //Sheets也可換用WorkSheets

int sheet_count = work_sheets->property("Count").toInt();  //獲取工作表數目
qDebug()<<QString("sheet count : ")<<sheet_count; for(int i=1; i<=sheet_count; i++) { QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", i);  //Sheets(int)也可換用Worksheets(int)
    QString work_sheet_name = work_sheet->property("Name").toString();  //獲取工作表名稱
    QString message = QString("sheet ")+QString::number(i, 10)+ QString(" name"); qDebug()<<message<<work_sheet_name; } if(sheet_count > 0) { QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", 1); QAxObject *used_range = work_sheet->querySubObject("UsedRange"); QAxObject *rows = used_range->querySubObject("Rows"); QAxObject *columns = used_range->querySubObject("Columns"); int row_start = used_range->property("Row").toInt();  //獲取起始行
    int column_start = used_range->property("Column").toInt();  //獲取起始列
    int row_count = rows->property("Count").toInt();  //獲取行數
    int column_count = columns->property("Count").toInt();  //獲取列數
    for(int i=row_start; i { for(int j=column_start; j { QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", i, j); QVariant cell_value = cell->property("Value");  //獲取單元格內容
            QString message = QString("row-")+QString::number(i, 10)+QString("-column-")+QString::number(j, 10)+QString(":"); qDebug()<<message<<cell_value; } } }

 

<2>Excel增、刪、改

  • 設置標題
  • 插入工作表(至最后一行)
  • 設置工作表名稱
  • 刪除工作表
  • 設置單元格內容
  • 設置單元格字體(類型、大小、加粗、斜體、下划線、顏色等)
  • 設置單元格對齊方式
  • 設置單元格高度、寬度
  • 設置單元格背景色、邊框色
  • 合並/拆分單元格
  • 清空單元格
QAxObject excel("Excel.Application"); excel.setProperty("Visible", true); QAxObject *work_books = excel.querySubObject("WorkBooks"); work_books->dynamicCall("Open(const QString&)", "E:\\test.xlsx"); excel.setProperty("Caption", "Qt Excel"); QAxObject *work_book = excel.querySubObject("ActiveWorkBook"); QAxObject *work_sheets = work_book->querySubObject("Sheets");  //Sheets也可換用WorkSheets //刪除工作表(刪除第一個)
QAxObject *first_sheet = work_sheets->querySubObject("Item(int)", 1); first_sheet->dynamicCall("delete"); //插入工作表(插入至最后一行)
int sheet_count = work_sheets->property("Count").toInt();  //獲取工作表數目
QAxObject *last_sheet = work_sheets->querySubObject("Item(int)", sheet_count); QAxObject *work_sheet = work_sheets->querySubObject("Add(QVariant)", last_sheet->asVariant()); last_sheet->dynamicCall("Move(QVariant)", work_sheet->asVariant()); work_sheet->setProperty("Name", "Qt Sheet");  //設置工作表名稱 //操作單元格(第2行第2列)
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", 2, 2); cell->setProperty("Value", "Java C++ C# PHP Perl Python Delphi Ruby");  //設置單元格值
cell->setProperty("RowHeight", 50);  //設置單元格行高
cell->setProperty("ColumnWidth", 30);  //設置單元格列寬
cell->setProperty("HorizontalAlignment", -4108); //左對齊(xlLeft):-4131 居中(xlCenter):-4108 右對齊(xlRight):-4152
cell->setProperty("VerticalAlignment", -4108);  //上對齊(xlTop)-4160 居中(xlCenter):-4108 下對齊(xlBottom):-4107
cell->setProperty("WrapText", true);  //內容過多,自動換行 //cell->dynamicCall("ClearContents()"); //清空單元格內容
 QAxObject* interior = cell->querySubObject("Interior"); interior->setProperty("Color", QColor(0, 255, 0));   //設置單元格背景色(綠色)
 QAxObject* border = cell->querySubObject("Borders"); border->setProperty("Color", QColor(0, 0, 255));   //設置單元格邊框色(藍色)
 QAxObject *font = cell->querySubObject("Font");  //獲取單元格字體
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));  //設置單元格字體顏色(紅色) //設置單元格內容,並合並單元格(第5行第3列-第8行第5列)
QAxObject *cell_5_6 = work_sheet->querySubObject("Cells(int,int)", 5, 3); cell_5_6->setProperty("Value", "Java");  //設置單元格值
QAxObject *cell_8_5 = work_sheet->querySubObject("Cells(int,int)", 8, 5); cell_8_5->setProperty("Value", "C++"); QString merge_cell; merge_cell.append(QChar(3 - 1 + 'A'));  //初始列
merge_cell.append(QString::number(5));  //初始行
merge_cell.append(":"); merge_cell.append(QChar(5 - 1 + 'A'));  //終止列
merge_cell.append(QString::number(8));  //終止行
QAxObject *merge_range = work_sheet->querySubObject("Range(const QString&)", merge_cell); merge_range->setProperty("HorizontalAlignment", -4108); merge_range->setProperty("VerticalAlignment", -4108); merge_range->setProperty("WrapText", true); merge_range->setProperty("MergeCells", true);  //合並單元格 //merge_range->setProperty("MergeCells", false); //拆分單元格 //work_book->dynamicCall("Save()"); //保存文件(為了對比test與下面的test2文件,這里不做保存操作) work_book->dynamicCall("SaveAs(const QString&)", "E:\\test2.xlsx"); //另存為另一個文件 
work_book->dynamicCall("Close(Boolean)", false);  //關閉文件
excel.dynamicCall("Quit(void)");  //退出
說明:在打開excel文件時需要使用絕對路徑,使用相對路徑會報錯
           可用實例:"D:/qtProject/QtOpExcel/test.xlsx"
           在另存為時,注意在路徑中不能使用/,而要使用\\
           可用實例:"D:\\qtProject\\QtOpExcel\\test2.xlsx"

 


免責聲明!

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



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