在我刚接触这一块时,下面这篇博文给了我很大帮助,在此表示感谢。
参考博文:https://blog.csdn.net/LJianDong/article/details/84565194
.pro文件添加
QT += axcontainer
添加头文件
#include <QDesktopServices>
#include <QUrl>
1.保存为excel:
void MainWindow::on_saveDataBtn_clicked()
{
QString fileName = QFileDialog::getSaveFileName(this,tr("Excle file"),QString("./test.xls"),tr("Excel Files(*.xls)")); //设置保存的文件名
if(fileName != NULL)
{
QAxObject *excel = new QAxObject;
if(excel->setControl("Excel.Application"))
{
excel->dynamicCall("SetVisible (bool Visible)",false);
excel->setProperty("DisplayAlerts",false);
QAxObject *workbooks = excel->querySubObject("WorkBooks"); //获取工作簿集合
workbooks->dynamicCall("Add"); //新建一个工作簿
QAxObject *workbook = excel->querySubObject("ActiveWorkBook"); //获取当前工作簿
QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);
QAxObject *cell;
int rowCount = ui->tableWidget->rowCount();
int columnCount = ui->tableWidget->columnCount();
/*添加Excel表头数据*/
for(int i = 1; i <= columnCount ; i++)
{
cell = worksheet->querySubObject("Cells(int,int)", 1, i);
cell->setProperty("RowHeight", 40);
cell->dynamicCall("SetValue(const QString&)", ui->tableWidget->horizontalHeaderItem(i-1)->data(0).toString());
}
/*将form列表中的数据依此保存到Excel文件中*/
for(int j = 2; j <= rowCount + 1;j++)
{
for(int k = 1;k <= ui->tableWidget->columnCount();k++)
{
cell = worksheet->querySubObject("Cells(int,int)", j, k);
cell->dynamicCall("SetValue(const QString&)",ui->tableWidget->item(j-2,k-1)->text()+ "\t");
}
}
//以下是批量保存(当数据量较大时可以使用下面的方法,亲测4万个数据可以秒存)
/*
QList<QList<QVariant> > datas;
QVariantList vars;
for (int i = 2; i <= rowCount + 1; i++)
{
QList<QVariant> row;
for(int j = 1; j <= columnCount; j++)
{
row.append(ui->tableWidget->item(i - 2, j - 1)->text());
ui->progressBar->setValue(i);
}
datas.append(row);
}
for(int i=0 ; i<rowCount; i++)
{
vars.append(QVariant(datas[i]));
}
QAxObject* range;
QString asd = "A2:D" + QString::number(rowCount + 1); // A2:D100表示存储范围为A2到D100加1是表头占了一行
//获取范围
range = worksheet->querySubObject("Range(const QString&)", asd);
//批量写入
//range->dynamicCall("Value2", QVariant(vars));
range->setProperty("Value2", QVariant(vars)); //Value: 只支持存为office数据;Value2:支持office和WPS数据
//设置字体大小
//range->querySubObject("Font")->setProperty("Size", 30);
delete range;
*/
/*将生成的Excel文件保存到指定目录下*/
workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(fileName)); //保存至fileName
workbook->dynamicCall("Close()"); //关闭工作簿
excel->dynamicCall("Quit()"); //关闭excel
delete excel;
excel = NULL;
if (QMessageBox::question(NULL,QString::fromUtf8("完成"),QString::fromUtf8("文件已经导出,是否现在打开?"),QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes)
{
QDesktopServices::openUrl(QUrl("file:///" + QDir::toNativeSeparators(fileName)));
}
}
}
}
2.保存为txt:
2.1 这是Qt Android 版代码
QString str;
QTableWidgetItem *cellItem;
QDateTime qtimeObj = QDateTime::currentDateTime();//获取时间
QString alltext;
//创建JZJCdate文件夹
QDir *folder = new QDir;
bool exist = folder->exists("/storage/emulated/0/JZJCdate");
if(exist)
{
//QMessageBox::warning(this, tr("createDir"), tr("Dir is already existed!"));
}
else
{
//创建文件夹
bool ok = folder->mkdir("/storage/emulated/0/JZJCdate");
if(ok)
QMessageBox::warning(this, tr("CreateDir"), tr("<font size='26' color='green'>Create Dir success!</font>"));
else
QMessageBox::warning(this, tr("CreateDir"), tr("<font size='26' color='red'>Create Dir fail!</font>"));
}
//存储文件到JZJCdate文件夹内
QString fileName;
fileName = tr("/storage/emulated/0/JZJCdate/JZJC数据文件%1.txt").arg(qtimeObj.toString("yyyyMMddhhmmss"));
QFile file(fileName);
if(!file.open(QIODevice::ReadWrite | QIODevice::Text))
{
QMessageBox::warning(this,tr("错误"),tr("<font size='26' color='red'>打开文件失败,数据保存失败!</font>"));
return;
}
else
{
if(!file.isReadable())
{
QMessageBox::warning(this,tr("错误"),tr("<font size='26' color='red'>该文件不可读,数据保存失败!</font>"));
}
else
{
QTextStream out(&file);
for (int i = 0; i < ui->tableWidget->rowCount(); i++) //逐行处理
{
str = QString::asprintf("第 %d 行: ",i+1);
for (int j = 0; j<ui->tableWidget->columnCount(); j++)
{
cellItem = ui->tableWidget->item(i,j); //获取单元格的item
str += cellItem->text()+" "; //字符串连接
}
str += '\n';
file.write(str.toUtf8()); //读完一行写一次数据
}
out<<alltext<<endl<<QObject::tr("\n date end");
QMessageBox::warning(this,tr("信息"),tr("<font size='26' color='green'>信息存储成功!\n可在系统根目录文件'JZJCdate'文件夹中查看!</font>"));
}
}
file.close();
2.2 下面是windows版代码
存储为xls文件
QDateTime time;
QString temp;
time = QDateTime::currentDateTime();
temp = time.toString("yyyy-MM-dd hhmmss");
QString fileName = QFileDialog::getSaveFileName(this,tr("Excel file"), QString("./%1%2.xls").arg(temp).arg("_lxjc"), tr("Excel Files(*.xls)")); //设置保存的文件名
if(fileName != NULL)
{
QAxObject *excel = new QAxObject;
if(excel->setControl("Excel.Application"))
{
excel->dynamicCall("SetVisible (bool Visible)",false);
excel->setProperty("DisplayAlerts",false);
QAxObject *workbooks = excel->querySubObject("WorkBooks"); //获取工作簿集合
workbooks->dynamicCall("Add"); //新建一个工作簿
QAxObject *workbook = excel->querySubObject("ActiveWorkBook"); //获取当前工作簿
QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);
QAxObject *cell;
/*添加Excel表头数据*/
for(int i = 1; i <= ui->tableWidget->columnCount(); i++)
{
cell = worksheet->querySubObject("Cells(int,int)", 1, i);
cell->setProperty("RowHeight", 40);
cell->dynamicCall("SetValue(const QString&)", ui->tableWidget->horizontalHeaderItem(i-1)->data(0).toString());
}
/*将form列表中的数据依此保存到Excel文件中*/
for(int j = 2; j <= ui->tableWidget->rowCount()+1;j++)
{
for(int k = 1; k <= ui->tableWidget->columnCount();k++)
{
cell = worksheet->querySubObject("Cells(int,int)", j, k);
cell->dynamicCall("SetValue(const QString&)", ui->tableWidget->item(j-2,k-1)->text()+ "\t");
}
}
/*将生成的Excel文件保存到指定目录下*/
workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(fileName)); //保存至fileName
workbook->dynamicCall("Close()"); //关闭工作簿
excel->dynamicCall("Quit()"); //关闭excel
delete excel;
excel = NULL;
if (QMessageBox::question(NULL, QString::fromUtf8("完成"),QString::fromUtf8("文件已经导出,是否现在打开?"), QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes)
{
QDesktopServices::openUrl(QUrl("file:///" + QDir::toNativeSeparators(fileName)));
}
}
}