#include <QAxObject> vs2017中使用qt5读取xlsx文件。

本文介绍了如何在C++中使用Qt的QAxObject库来操作Excel,包括快速打开工作簿、读取数据并转化为二维数组,以及与Python和MATLAB的对比。重点讲解了快速打开与慢速读取的区别,适合实习期间从MATLAB转到C++的需求。
摘要由CSDN通过智能技术生成


前言

为什么c++没有内置的读取excle的函数啊,之前都用Python和MATLAB习惯了。才发现c++没有。但是实习需要MATLAB转c。拖了两天还是不得不做了。


一、QAxObject相关函数

该部分内容采用了如下网址的介绍
lQt中使用QAxObject操作Excel
如果只是想使用QAxobject打开excle文件。一下函数足够了

_excelObject =new QAxObject("Excel.Application");
1) 显示当前窗口:
excel.setProperty("Visible",true);
2) 更改 Excel 标题栏:
excel.setProperty("Caption","Invoke Microsoft Excel");
3) 添加新工作簿:
QAxObject *workbooks = excel.querySubObject("WorkBooks");
workbooks->dynamicCall("Add");
4) 打开已存在的工作簿:
workbooks->dynamicCall("Open(const QString&)", QString("X.xls"));
5) 获取活动工作簿:
QAxObject *workbook = excel.querySubObject("ActiveWorkBook");
6) 获取所有的工作表:
QAxObject *worksheets = workbook->querySubObject("WorkSheets");
7) 获取工作表数量:
int intCount =worksheets->property("Count").toInt();
8) 获取第一个工作表:
QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);
9) 获取cell的值:
QAxObject *range = worksheet->querySubObject("Cells(int,int)", 1, 1 );

二、打开excle

1.关于快速打开和慢速打开的区别。

看了好多打开excle文件的操作。其主要的区别还是读取量上的区别,慢速打开利用cell读数据。快速呢,直接获取有数据的矩形区域的数据并赋值给QVariant类型的变量

值得一提的是,我读出来的数据并不想在qt界面中在进行操作。因此读取函数进行结束后会返回一个二维数组,用来存放数据。
部分代码参考了以下链接
QT5+VS2017 绘制曲线(QCustomPlot) 及 EXCEL的快速读取和写入(QAxObject)教程

2.上代码。

vsqt.h(QT文件的头函数)

#include <QAxObject>
#include <QDir>

using namespace std;


class Vsqt : public QWidget
{
	Q_OBJECT

public:
	//read_xlsx
	void  qtexcel();
	void Cqtexcel();
	QVector<QVector<double>> Vsqt::READxlsx (QVector<double> x, QVector<double> y);
	QVector<QVector<double>> Vsqt::castVariant2ListListVariant(QVariant &var, QVector<double> x, QVector<double> y);

	//Qt5之前的语法
	//信号函数
signals:
	void ViewSig();

	//槽函数
public slots:

private:
	Ui::VsqtClass ui;
	QAxObject * excel;
	QAxObject * workbooks;
	QAxObject * workbook;
	QAxObject * worksheets;
	QAxObject * worksheet;
	QAxObject * usedrange_Read;//读取数据矩形区域
	QAxObject * usedrange_Write;//写入数据矩形区域
	QAxObject * rows;//行数
	QAxObject * columns;//列数
	int WorkSheetCount;//Excel文件中表的个数
	int RowsCount;//行总数
	int ColumnsCount;//列总数
	int StartRow;//数据的起始行
	int StartColumn;//数据的起始列
	QVariant var;

};

read_xlsx.cpp

#include "vsqt.h"
void Vsqt::qtexcel()//在执行READxlsx函数之前必须执行该操作。
{
	excel = new QAxObject("Excel.Application");//加载Excel驱动
	excel->setProperty("Visible", false); //不显示Excel界面,如果为true会看到启动的Excel界面
	workbooks = excel->querySubObject("WorkBooks");
}

void Vsqt::Cqtexcel()
{
	delete excel;
	excel = NULL;
}

/*因为我要读文件是固定的,所以我直接放在函数里面了。对于想读其他文件,可以参考这样写,并做些许修改
void qtexcel::readExcelFast(QString fileName, QVector<double> x, QVector<double> y)
*/
QVector<QVector<double>> Vsqt::READxlsx( QVector<double> x, QVector<double> y)
{
	QVector<QVector<double>> a;
	workbooks->dynamicCall("Open(const QString&)", QString("E:/1jiaxing_W/data/cxz.xlsx"));//按文件路径打开已存在的工作簿
	workbook = excel->querySubObject("ActiveWorkBook");// 获取活动工作簿     
	worksheets = workbook->querySubObject("WorkSheets");// 获取打开的excel文件中所有的工作sheet
	WorkSheetCount = worksheets->property("Count").toInt();//Excel文件中表的个数:
	worksheet = worksheets->querySubObject("Item(int)", 1);//获取第一个工作表,最后参数填1
	usedrange_Read = worksheet->querySubObject("UsedRange");//获取该sheet的数据范围(可以理解为有数据的矩形区域)
	//获取行数
	rows = usedrange_Read->querySubObject("Rows");
	RowsCount = rows->property("Count").toInt();
	//获取列数
	columns = usedrange_Read->querySubObject("Columns");
	ColumnsCount = columns->property("Count").toInt();
	//数据的起始行
	StartRow = rows->property("Row").toInt();
	//数据的起始列
	StartColumn = columns->property("Column").toInt();

	if (worksheet != NULL && !worksheet->isNull())
	{
		if (NULL == usedrange_Read || usedrange_Read->isNull())
		{
			cout << "no file" << endl;
			/*原网址中为return,因为我改成了有输出,所以直接用了cout替代了*/
		}
		var = usedrange_Read->dynamicCall("Value");
		a=castVariant2ListListVariant(var, x, y); // 此函数将var转换成我们需要的格式
	}
	//一定要记得close,不然系统进程里会出现n个EXCEL.EXE进程
	workbook->dynamicCall("Close(bool)", false);  //关闭文件
	excel->dynamicCall("Quit()");
	return a;
}
//将整块文件拆分为2维的数组
QVector<QVector<double>> Vsqt::castVariant2ListListVariant(QVariant &var, QVector<double> x, QVector<double> y)
{
	QVector<QVector<double>>x_y;
	QVariantList varRows;
	varRows = var.toList();
	if (varRows.isEmpty())
	{
		cout << "no file" << endl;
	}
	const int rowCount = varRows.size();
	QVariantList rowData;
	for (int i = 0; i < rowCount; ++i)
	{
		rowData = varRows[i].toList();
		x.push_back(rowData.value(1).toDouble());
		y.push_back(rowData.value(2).toDouble());
	}
	x_y.push_back(x);
	x_y.push_back(y);

	return x_y;
}

执行的代码段为:

void Vsqt::add_deltTP()
{
	
	QString program_dir;
	program_dir = "E:/1jiaxing_W/";


	//路径名称
	QString pathname1 = program_dir + "中频采样数据/";
	QString pathname2 = program_dir + "轨迹生成/";
	//天线阵坐标

	QVector<QVector<double>> data;
	QVector<double>x, y;
	QString fileName = "E:/1jiaxing_W/data/cxz.xlsx";
	qtexcel();
	data = READxlsx(x, y);
	
	Cqtexcel();
}

main.cpp
为QT的main.cpp 几乎不动的那个。、


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值