#include "xexcel.h" #include #include XExcel::XExcel(QObject *parent) : QObject(parent) { m_pExcel = nullptr; m_pWorkbooks = nullptr; } //打开excel com void XExcel::openExcelCom() { if(m_pExcel == nullptr) { m_pExcel = new QAxObject(this); m_pExcel->setControl("Excel.Application");//连接Excel控件 qDebug() << "after set control."; m_pExcel->dynamicCall("SetVisible (bool Visible)","false");//不显示窗体 qDebug() << "after set SetVisible."; m_pExcel->setProperty("DisplayAlerts", false);//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示 qDebug() << "after set DisplayAlerts."; m_pWorkbooks = m_pExcel->querySubObject("WorkBooks"); } } //关闭excel com void XExcel::closeExcelCom() { if(m_pExcel) { m_pExcel->dynamicCall("Quit(void)"); m_pWorkbooks->deleteLater(); m_pExcel->deleteLater(); m_pWorkbooks = nullptr; m_pExcel = nullptr; } } QList > XExcel::readExcel(QString fileName) { QList > res; if(m_pExcel == nullptr || m_pWorkbooks == nullptr) return res; QAxObject *workbook = m_pWorkbooks->querySubObject("Open (const QString &)", fileName);//获取当前工作簿 qDebug() << "after workbook."; QAxObject *worksheet = workbook->querySubObject("Sheets(int)",1);//工作表1,即sheet1 qDebug() << "after Sheets."; QVariant var; if (worksheet != NULL && ! worksheet->isNull()) { QAxObject *usedRange = worksheet->querySubObject("UsedRange"); qDebug() << "after UsedRange."; if(NULL == usedRange || usedRange->isNull()) { qDebug() << "usedRange is null."; } var = usedRange->dynamicCall("Value"); delete usedRange; } workbook->dynamicCall("Close(Boolean)", false); // excel->dynamicCall("Quit(void)"); //转list QVariantList varRows = var.toList(); if(varRows.isEmpty()) { qDebug() << "varRows is empty."; return res; } const int rowCount = varRows.size(); qDebug() << "rows: " << rowCount; QVariantList rowData; for(int i = 0; i < rowCount; ++i) { rowData = varRows[i].toList(); res.push_back(rowData); // qDebug() << "row index: " << i << " column count: " << rowData.count(); // for(int c = 0 ; c < rowData.count() ; c++) // { // QVariant value = rowData[c]; // qDebug()<< "row : " << i << " column : " << c << " value : " << value.toString(); // } } return res; // qDebug() << " excel file : " << fileName; // QAxObject* excel = new QAxObject(this); // excel->setControl("Excel.Application");//连接Excel控件 // qDebug() << "after set control."; // excel->dynamicCall("SetVisible (bool Visible)","false");//不显示窗体 // qDebug() << "after set SetVisible."; // excel->setProperty("DisplayAlerts", false);//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示 // qDebug() << "after set DisplayAlerts."; // QAxObject *workbooks = excel->querySubObject("WorkBooks"); // qDebug() << "after WorkBooks."; // QAxObject *workbook = workbooks->querySubObject("Open (const QString &)", fileName);//获取当前工作簿 // qDebug() << "after workbook."; // QAxObject *worksheet = workbook->querySubObject("Sheets(int)",1);//工作表1,即sheet1 // qDebug() << "after Sheets."; // QVariant var; // if (worksheet != NULL && ! worksheet->isNull()) // { // QAxObject *usedRange = worksheet->querySubObject("UsedRange"); // qDebug() << "after UsedRange."; // if(NULL == usedRange || usedRange->isNull()) // { // qDebug() << "usedRange is null."; // } // var = usedRange->dynamicCall("Value"); // delete usedRange; // } // workbook->dynamicCall("Close(Boolean)", false); // excel->dynamicCall("Quit(void)"); // //转list // QList > res; // QVariantList varRows = var.toList(); // if(varRows.isEmpty()) // { // qDebug() << "varRows is empty."; // return res; // } // const int rowCount = varRows.size(); // qDebug() << "rows: " << rowCount; // QVariantList rowData; // for(int i = 0; i < rowCount; ++i) // { // rowData = varRows[i].toList(); // res.push_back(rowData); // qDebug() << "row index: " << i << " column count: " << rowData.count(); // for(int c = 0 ; c < rowData.count() ; c++) // { // QVariant value = rowData[c]; // qDebug()<< "row : " << i << " column : " << c << " value : " << value.toString(); // } // } // return res; } void XExcel::readExcels(QList fileNames) { qDebug() << " excel files : " << fileNames; QAxObject* excel = new QAxObject(this); excel->setControl("Excel.Application");//连接Excel控件 qDebug() << "after set control."; excel->dynamicCall("SetVisible (bool Visible)","false");//不显示窗体 qDebug() << "after set SetVisible."; excel->setProperty("DisplayAlerts", false);//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示 qDebug() << "after set DisplayAlerts."; QAxObject *workbooks = excel->querySubObject("WorkBooks"); qDebug() << "after WorkBooks."; int fileCount = fileNames.count(); for(int i = 0 ; i < fileCount ; i++) { QString fileName = fileNames.at(i); QAxObject *workbook = workbooks->querySubObject("Open (const QString &)", fileName);//获取当前工作簿 qDebug() << "after workbook."; QAxObject *worksheet = workbook->querySubObject("Sheets(int)",1);//工作表1,即sheet1 qDebug() << "after Sheets."; QVariant var; if (worksheet != NULL && ! worksheet->isNull()) { QAxObject *usedRange = worksheet->querySubObject("UsedRange"); qDebug() << "after UsedRange."; if(NULL == usedRange || usedRange->isNull()) { qDebug() << "usedRange is null."; } var = usedRange->dynamicCall("Value"); delete usedRange; } workbook->dynamicCall("Close(Boolean)", false); //转list QList > res; QVariantList varRows = var.toList(); if(varRows.isEmpty()) { qDebug() << "varRows is empty."; return; } const int rowCount = varRows.size(); qDebug() << "rows: " << rowCount; QVariantList rowData; for(int i = 0; i < rowCount; ++i) { rowData = varRows[i].toList(); res.push_back(rowData); qDebug() << "row index: " << i << " column count: " << rowData.count(); } } excel->dynamicCall("Quit(void)"); }