(資料圖片僅供參考)
首先在.pro文件中添加以下代碼:
CONFIG += \qaxcontainer #.接下來就是Excel代碼:cpp文件:#include ""#include "qt_"QExcelEngine::QExcelEngine(){pExcel = NULL;pWorkbooks = NULL;pWorkbook = NULL;pWorksheet = NULL;sXlsFile = "";nRowCount = 0;nColumnCount = 0;nStartRow = 0;nStartColumn = 0;bIsOpen = false;bIsValid = false;bIsANewFile = false;bIsSaveAlready = false;HRESULT r = OleInitialize(0);if (r != S_OK && r != S_FALSE){qDebug("Qt: Could not initialize OLE (error %x)", (unsigned int)r);}}QExcelEngine::QExcelEngine(QString xlsFile){pExcel = NULL;pWorkbooks = NULL;pWorkbook = NULL;pWorksheet = NULL;sXlsFile = xlsFile;nRowCount = 0;nColumnCount = 0;nStartRow = 0;nStartColumn = 0;bIsOpen = false;bIsValid = false;bIsANewFile = false;bIsSaveAlready = false;HRESULT r = OleInitialize(0);if (r != S_OK && r != S_FALSE){qDebug("Qt: Could not initialize OLE (error %x)", (unsigned int)r);}}QExcelEngine::~QExcelEngine(){if ( bIsOpen ){//析構(gòu)前,先保存數(shù)據(jù),然后關(guān)閉workbookClose();}OleUninitialize();}/***@brief 打開sXlsFile指定的excel報(bào)表*@return true : 打開成功* false: 打開失敗*/bool QExcelEngine::Open(int nSheet, bool visible){if ( bIsOpen ){Close();}nCurrSheet = nSheet;bIsVisible = visible;if ( NULL == pExcel ){pExcel = new QAxObject(""); //連接Excel控件if ( pExcel ){bIsValid = true;}else{bIsValid = false;bIsOpen = false;return bIsOpen;}pExcel->dynamicCall("SetVisible(bool)", bIsVisible); //bIsVisible 是否顯示窗體pExcel->setProperty("DisplayAlerts", false); //不顯示任何警告信息pWorkbooks = pExcel->querySubObject("WorkBooks"); //獲取工作簿}if ( !bIsValid ){bIsOpen = false;return bIsOpen;}if ( () ){bIsOpen = false;return bIsOpen;}//如果指向的文件不存在,則需要新建一個(gè)QFile f(sXlsFile);if (!()){bIsANewFile = true;}else{bIsANewFile = false;}if (!bIsANewFile){pWorkbook = pWorkbooks->querySubObject("Open(QString, QVariant)", sXlsFile, QVariant(0)); //打開xls對應(yīng)的工作簿}else{pWorkbooks->dynamicCall("Add"); //添加一個(gè)新的工作薄pWorkbook = pExcel->querySubObject("ActiveWorkBook"); //新建一個(gè)xls}pWorksheet = pWorkbook->querySubObject("WorkSheets(int)", nCurrSheet);//打開第一個(gè)sheet//至此已打開,開始獲取相應(yīng)屬性QAxObject *usedrange = pWorksheet->querySubObject("UsedRange");//獲取該sheet的使用范圍對象QAxObject *rows = usedrange->querySubObject("Rows");QAxObject *columns = usedrange->querySubObject("Columns");//因?yàn)閑xcel可以從任意行列填數(shù)據(jù)而不一定是從0,0開始,因此要獲取首行列下標(biāo)nStartRow = usedrange->property("Row").toInt(); //第一行的起始位置nStartColumn = usedrange->property("Column").toInt(); //第一列的起始位置nRowCount = rows->property("Count").toInt(); //獲取行數(shù)nColumnCount = columns->property("Count").toInt(); //獲取列數(shù)bIsOpen = true;return bIsOpen;}/***@brief Open()的重載函數(shù)*/bool QExcelEngine::Open(QString xlsFile, int nSheet, bool visible){sXlsFile = xlsFile;nCurrSheet = nSheet;bIsVisible = visible;return Open(nCurrSheet,bIsVisible);}/***@brief 保存表格數(shù)據(jù),把數(shù)據(jù)寫入文件*/void QExcelEngine::Save(){if ( pWorkbook ){if (bIsSaveAlready){return ;}if (!bIsANewFile){pWorkbook->dynamicCall("Save()");}else /*如果該文檔是新建出來的,則使用另存為COM接口*/{// pWorkbook->dynamicCall("SaveAs (const QString&,int,const QString&,const QString&,bool,bool)",// sXlsFile,56,QString(""),QString(""),false,false);pWorkbook->dynamicCall("SaveAs(const QString&)", sXlsFile);}bIsSaveAlready = true;}}/***@brief 關(guān)閉前先保存數(shù)據(jù),然后關(guān)閉當(dāng)前Excel COM對象,并釋放內(nèi)存*/void QExcelEngine::Close(){//關(guān)閉前先保存數(shù)據(jù)// Save();if ( pExcel && pWorkbook ){pWorkbook->dynamicCall("Close(bool)", true);pExcel->dynamicCall("Quit()");delete pExcel;pExcel = NULL;bIsOpen = false;bIsValid = false;bIsANewFile = false;bIsSaveAlready = true;}}/***@brief 把tableWidget中的數(shù)據(jù)保存到excel中*@param tableWidget : 指向GUI中的tablewidget指針*@return 保存成功與否 true : 成功* false: 失敗*/bool QExcelEngine::SaveDataFrTable(QTableWidget *tableWidget){if ( NULL == tableWidget ){return false;}if ( !bIsOpen ){return false;}int tableR = tableWidget->rowCount();int tableC = tableWidget->columnCount();//獲取表頭寫做第一行for (int i=0; ihorizontalHeaderItem(i) != NULL ){this->SetCellData(1, i+1, tableWidget->horizontalHeaderItem(i)->text());}}//寫數(shù)據(jù)for (int i=0; iitem(i,j) != NULL ){this->SetCellData(i+2, j+1, tableWidget->item(i,j)->text());}}}//保存Save();return true;}/***@brief 從指定的xls文件中把數(shù)據(jù)導(dǎo)入到tableWidget中*@param tableWidget : 執(zhí)行要導(dǎo)入到的tablewidget指針*@return 導(dǎo)入成功與否 true : 成功* false: 失敗*/bool QExcelEngine::ReadDataToTable(QTableWidget *tableWidget){if ( NULL == tableWidget ){return false;}//先把table的內(nèi)容清空int tableColumn = tableWidget->columnCount();tableWidget->clear();for (int n=0; nremoveColumn(0);}int rowcnt = nStartRow + nRowCount;int columncnt = nStartColumn + nColumnCount;//獲取excel中的第一行數(shù)據(jù)作為表頭QStringList headerList;for (int n = nStartColumn; nquerySubObject("Cells(int,int)", nStartRow, n);if ( cell ){headerList << cell->dynamicCall("Value2()").toString();}}//重新創(chuàng)建表頭tableWidget->setColumnCount(nColumnCount);tableWidget->setHorizontalHeaderLabels(headerList);//插入新數(shù)據(jù)for (int i = nStartRow + 1, r = 0; i < rowcnt; i++, r++ ) //行{tableWidget->insertRow(r); //插入新行for (int j = nStartColumn, c = 0; j < columncnt; j++, c++ ) //列{QAxObject * cell = pWorksheet->querySubObject("Cells(int,int)", i, j );//獲取單元格//在r新行中添加子項(xiàng)數(shù)據(jù)if ( cell ){tableWidget->setItem(r,c,new QTableWidgetItem(cell->dynamicCall("Value2()").toString()));tableWidget->item(r, c)->setTextAlignment(Qt::AlignCenter);}}}return true;}/***@brief 獲取指定單元格的數(shù)據(jù)*@param row : 單元格的行號*@param column : 單元格的列號*@return [row,column]單元格對應(yīng)的數(shù)據(jù)*/QVariant QExcelEngine::GetCellData(int row, int column){QVariant data;QAxObject *cell = pWorksheet->querySubObject("Cells(int,int)",row,column);//獲取單元格對象if ( cell ){data = cell->dynamicCall("Value2()");}return data;}/***@brief 修改指定單元格的數(shù)據(jù)*@param row : 單元格的行號*@param column : 單元格指定的列號*@param data : 單元格要修改為的新數(shù)據(jù)*@return 修改是否成功 true : 成功* false: 失敗*/bool QExcelEngine::SetCellData(int row, int column, QVariant data){bool op = false;QAxObject *cell = pWorksheet->querySubObject("Cells(int,int)",row,column);//獲取單元格對象if ( cell ){QString strData = (); //excel 居然只能插入字符串和整型,浮點(diǎn)型無法插入cell->dynamicCall("SetValue(const QVariant&)",strData); //修改單元格的數(shù)據(jù)op = true;}else{op = false;}return op;}/*** @brief 清空整個(gè)Excel表格*/void QExcelEngine::ClearAllData(QString strData){for (int i=0; iSetCellData(i, j, strData);}}//保存Save();}/***@brief 清空除報(bào)表之外的數(shù)據(jù)*/void QExcelEngine::Clear(){sXlsFile = "";nRowCount = 0;nColumnCount = 0;nStartRow = 0;nStartColumn = 0;}/***@brief 判斷excel是否已被打開*@return true : 已打開* false: 未打開*/bool QExcelEngine::IsOpen(){return bIsOpen;}/***@brief 判斷excel COM對象是否調(diào)用成功,excel是否可用*@return true : 可用* false: 不可用*/bool QExcelEngine::IsValid(){return bIsValid;}/***@brief 獲取excel的行數(shù)*/int QExcelEngine::GetRowCount() const{return nRowCount;}/***@brief 獲取excel的列數(shù)*/int QExcelEngine::GetColumnCount() const{return nColumnCount;}
.h文件:
#include #include #include #include #include #include class QExcelEngine{public:QExcelEngine();QExcelEngine(QString xlsFile);~QExcelEngine();public:bool Open(int nSheet, bool visible);bool Open(QString xlsFile, int nSheet, bool visible);void Save();void Close();bool SaveDataFrTable(QTableWidget *tableWidget);bool ReadDataToTable(QTableWidget *tableWidget);QVariant GetCellData(int row, int column);bool SetCellData(int row, int column, QVariant data);void ClearAllData(QString strData);void Clear();bool IsOpen();bool IsValid();int GetRowCount() const;int GetColumnCount() const;private:QAxObject *pExcel;QAxObject *pWorkbooks;QAxObject *pWorkbook;QAxObject *pWorksheet;QString sXlsFile;int nRowCount;int nColumnCount;int nStartRow;int nStartColumn;int nCurrSheet;bool bIsVisible;bool bIsOpen;bool bIsValid;bool bIsANewFile;bool bIsSaveAlready;};
接下來就是調(diào)用了,首先從Excel表格導(dǎo)入到tableWeight,我這里是點(diǎn)擊按鈕實(shí)現(xiàn),代碼如下:
void QEnteringWidget::slotExcelInto(){QMessageBox::StandardButton rb = QMessageBox::information(this, "warning", "從excel文件中導(dǎo)入數(shù)據(jù)將會覆蓋之前所有內(nèi)容,
確定導(dǎo)入嗎?",QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);if(rb == QMessageBox::Yes){//從Excel中將表格導(dǎo)入到TableWidgetexcelEngine = new QExcelEngine;m_fileName = QFileDialog::getOpenFileName(this, tr("select file"), "../datafile/", tr("*.xls *.xlsx"));if(m_())return;();bool b = excelEngine->Open(m_fileName, 1, false); //flase為不顯示窗體if(b == false){QMessageBox::information(this, "excel提示", "文件打開失敗");return;}excelEngine->ReadDataToTable(tableWidget);excelEngine->Close();();}}
調(diào)用tableweight導(dǎo)入到Excel表格,代碼如下:
void QDemandWidget::slotIntoExcel(){excelEngine = new QExcelEngine;filename = QFileDialog::getSaveFileName(this, tr("Save as..."), "../datafile", tr("EXCEL files (*.xls *.xlsx);;HTML-Files (*.txt);;"));if(())return;();bool b = excelEngine->Open(filename, 1, false); //flase為不顯示窗體if(b == false){QMessageBox::information(this, "excel提示", "文件打開失敗");return;}//清空表格之前的所有內(nèi)容excelEngine->ClearAllData(" ");excelEngine->Close();//打開數(shù)據(jù)庫,并保存數(shù)據(jù)// excelEngine->Open(filename, 1, false);// excelEngine->SaveDataFrTable(tableWidget);// excelEngine->Close();();QMessageBox::information(this, "excel提示", "導(dǎo)入成功");}
【領(lǐng) QT開發(fā)教程 學(xué)習(xí)資料, 點(diǎn)擊下方鏈接莬費(fèi)領(lǐng)取↓↓ ,先碼住不迷路~】
點(diǎn)擊這里:
標(biāo)簽:
要文