qt txt快速转excel

这个是 多个txt,一个txt4万个数据,转为excel1秒不到。

这个是 转换好的excel

下面是代码解析

 第一步 获取txt的数据

    这个网上比较多,推荐QT 读取txt文件的几种方法

     先获取所有的txt文件的名称:

   QString path1 = QDir::currentPath();
		QDir dir(path1);
		QStringList nameFilters;
		nameFilters << "*.txt" << "*.png";
        //获取名字
		QStringList files = dir.entryList(nameFilters, QDir::Files | QDir::Readable, QDir::Name);
		qDebug() << files;

对每一个txt 读取数据

for each (QString name in files)
		{
         //   打开txt文件
			QString path = path1 + "/" + name;
			qDebug() << path;
			QFile f(path);
			if (!f.open(QIODevice::ReadOnly | QIODevice::Text))
			{
				/*	cout << "Open failed." << endl;
				return -1;*/
			}
//读取txt 流
			QTextStream txtInput(&f);

		/*	QString astr = "";
			QStringList alldata;*/

			int numK = 0;
			QList<QVariant> allRowData;
			while (!txtInput.atEnd())
			{
//读取每一行的数据
				numK++;
				QString lineStr;
				QStringList linedata;
				lineStr = txtInput.readLine();
			//	astr.append(lineStr);
//根据空格来分成多个数据
				linedata = lineStr.split(" ");
				
			/*	while (!linedata.isEmpty())
				{
					aRowData.append((linedata.front()));
					linedata.pop_front();
				}*/
//将多个数据转为QVariant类型(这个是qt的任意类型)
				allRowData.append(QVariant(linedata));
			}

这样就获取到了txt的所有数据

 

2  打开并创建excel

   首先添加头文件,参考了

#include<ActiveQt\qaxobject.h>
#include<ActiveQt/qaxwidget.h>

接着打开连接office excel

            //一定要是QAxWidget 
            QAxWidget *excel = NULL;    
           //本例中,excel设定为Excel文件的操作对象
			QAxObject *workbooks = NULL;
			QAxObject *workbook = NULL;  //Excel操作对象
			excel = new QAxWidget("Excel.Application");
			excel->dynamicCall("SetVisible(bool)", false); //true 表示操作文件时可见,false表示为不可见
			excel->setProperty("DisplayAlerts", false);//excel的对话弹窗关闭
			workbooks = excel->querySubObject("WorkBooks");

创建excel或者打开excel'文件

	QString fileName = QDir::currentPath() + "/" + name.remove(".txt") + ".xlsx";
			fileName.replace("/", "\\");

			workbooks->dynamicCall("Add");
			workbook = excel->querySubObject("ActiveWorkBook");
            //如果有excel 就不用这一步创建了
            //51是xlsx,csv是6;56表示创建的文件格式为xls
			workbook->dynamicCall("SaveAs (const QString&,int,const QString&,const QString&,bool,bool)",
				fileName, 51, QString(""), QString(""), false, false);

			workbook = workbooks->querySubObject("Open(const QString &)", fileName);

打开具体某个sheet

// 获取打开的excel文件中所有的工作sheet
			QAxObject * worksheets = workbook->querySubObject("WorkSheets");


			//—————————————————Excel文件中表的个数:——————————————————
			int iWorkSheet = worksheets->property("Count").toInt();


			// ————————————————获取第n个工作表 querySubObject("Item(int)", n);——————————
			QAxObject * worksheet = worksheets->querySubObject("Item(int)", 1);//本例获取第一个,最后参数填1

数据  写入excel

这里很重要:一般的是对每一个单元格操作,但是对大批量的数据时需要消耗太多时间

  //获取单元格
    cell = worksheet->querySubObject("Cells(int, int", 1, 1);
    //储存一个字符串数据至表格
    cell->dynamicCall("setValue(const QVariant&", QVariant("abc"));

 所以是先将数据保存为一个有序的状态,一步就完成输入,不用多次命令

	QAxObject* range;
			QString asd = "A1:E" + QString::number(numK);
            //获取范围 
			range = worksheet->querySubObject("Range(const QString)", asd);
			//批量写入
			range->dynamicCall("SetValue(const QVariant&", QVariant(allRowData));
			//设置字体大小
			//range->querySubObject("Font")->setProperty("Size", 30);
			//range->setProperty("Value", allRowData);
			delete range;

最后 保存数据关闭excel。

	workbook->dynamicCall("Save()");
			workbook->dynamicCall("Close()");
			excel->dynamicCall("Quit()");
			if (excel)
			{
				delete excel;
				excel = NULL;
			}

			
		}
	

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值