这个是 多个txt,一个txt4万个数据,转为excel1秒不到。
这个是 转换好的excel
下面是代码解析
这个网上比较多,推荐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 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的所有数据
首先添加头文件,参考了
#include
#include
接着打开连接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;
}
}