VS+QT——读、改Excel文件
这篇文章主要是收集、整理一下个人觉得好的读、改Excel文件的博客。
- Windows下开发,使用QAxObject第三方库:《https://blog.csdn.net/qq_35040828/article/details/70143692》。该库,只能在Windows使用,因为它调用微软的COM组件。
- Windows下开发,使用QAxObject第三方库:《https://blog.csdn.net/x85371169/article/details/79268258》。这篇博客是在上篇博客的基础上进行改进,由于第二篇博客未给全代码,我总结两篇博客重新实现了一下,代码如下文。
- Windows下开发,但是支持QT所有支持的平台,包括Linux,使用QTxlsx第三方库:《https://blog.csdn.net/weixin_38294178/article/details/80735763》
《下面代码是 1 2 两篇博客 总结出来的》
//头文件
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_TestForReadExcel.h"
#include <QAxObject>
#include <QDebug>
#include <QMessageBox>
#include <QFileDialog>
#include <QElapsedTimer>
#include <QElapsedTimer>
class TestForReadExcel : public QMainWindow
{
Q_OBJECT
public:
TestForReadExcel(QWidget *parent = Q_NULLPTR);
~TestForReadExcel();
private:
Ui::TestForReadExcelClass ui;
QAxObject *excel = NULL;
public:
//读取内容
//void readExcel();
QVariant readAll();
void castVariant2ListListVariant(const QVariant &var, QList<QList<QVariant> > &res);
//写入内容
};
//.cpp文件
#include "TestForReadExcel.h"
TestForReadExcel::TestForReadExcel(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
excel = new QAxObject("Excel.Application");//1800ms
excel->dynamicCall("SetVisible(bool)", false);
QList<QList<QVariant>> m_datas;
QVariant var = readAll();
castVariant2ListListVariant(var, m_datas);
for (int i = 0; i < m_datas.size(); i++)
{
qDebug() << m_datas[i];
}
}
TestForReadExcel::~TestForReadExcel()
{
if (excel != nullptr)
{
delete excel;
}
excel = nullptr;
}
QVariant TestForReadExcel::readAll()
{
QAxObject *workbooks = NULL;
QAxObject *workbook = NULL;
workbooks = excel->querySubObject("WorkBooks");
workbook = workbooks->querySubObject("Open(QString, QVariant)", QString(tr("d:\\ExcelTest.xlsx")));
QAxObject * worksheet = workbook->querySubObject("WorkSheets(int)", 1);//打开第一个sheet
QVariant var;
if (worksheet != NULL && !worksheet->isNull())
{
QAxObject *usedRange = worksheet->querySubObject("UsedRange");
if (NULL == usedRange || usedRange->isNull())
{
return var;
}
var = usedRange->dynamicCall("Value");
delete usedRange;
}
return var;
}
/***************************************
*函数功能:把QVariant转换为QList<QList<QVariant> >
*输入:
* var:原QVariant
* res:新的QList<QList<QVariant> >
*输出:
* void
*作者:JZQ
*时间版本:2019-05-28-V1.0
***************************************/
void TestForReadExcel::castVariant2ListListVariant(const QVariant &var, QList<QList<QVariant> > &res)
{
QVariantList varRows = var.toList();
if (varRows.isEmpty())
{
return;
}
const int rowCount = varRows.size();
QVariantList rowData;
for (int i = 0; i < rowCount; ++i)
{
rowData = varRows[i].toList();
res.push_back(rowData);
}
}