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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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)");
}