You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

196 lines
6.9 KiB

#include "xexcel.h"
#include <QAxObject>
#include <QDebug>
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<QList<QVariant> > XExcel::readExcel(QString fileName)
{
QList<QList<QVariant> > 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<QList<QVariant> > 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<QString> 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<QList<QVariant> > 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)");
}