Qt Tablewidget表格数据的导出和导入
前期准备:
pro文件加入
QT += axcontainer
在头文件加入#include
网上还有写#include
版本不同,可能代码写法不同,自己测试。
我们右击导入按钮,转到槽,添加被点击后的代码
QString strData;
void MainWindow::on_pushButton_17_clicked()
{
//首先我们需要创建一个文件选择对话框
QString curPash =QDir::currentPath(); //获取当前路径
QString dlgTitle="选择表格文件";
//xls和xlsx格式的文件都可以,xlsx兼容xls,注意每一种类型后面要加两个分号
QString filter="表格文件(*.xls *.xlsx);;xls文件(*.xls);;xlsx文件(*.xlsx);;所有文件(*.*)";
//创建文件选择对话框
QStringList fileList = QFileDialog::getOpenFileNames(this,dlgTitle,curPash,filter);
if(fileList.count()<1)
return;
for(int i = 0;i<fileList.count();i++)
{
//保存文件地址
strData = fileList.at(i);
}
//连接Excel控件
QAxObject excel("Excel.Application");
//不显示任何警告信息
excel.setProperty("Visible",false);
//获取工作簿集合
QAxObject *workbooks = excel.querySubObject("WorkBooks");
workbooks->dynamicCall("Open (const QString&)",str);
//获取活动工作簿
QAxObject *workbook = excel.querySubObject("ActiveWorkBook");
//获取工作表集合的工作表1,即sheet1
QAxObject *worksheet = workbook->querySubObject("Sheets(int)",1);
QAxObject *range; //获取cell的值
QString strVal="hull";
QStringList header;
//设置初始表格行列都为0
ui->tableWidget->setRowCount(0); //设置行数为0
ui->tableWidget->setColumnCount(0); //设置列数为0
int count =0;
for(int i = 1;i<row;i++)
{
//注意setRowCount里面的函数不是追加,而是总数,很多人最开始都把这个函数以为是总数,造成程序经常崩溃
ui->tableWidget->setRowCount(ui->tableWidget->rowCount()+1);
for(int j = 1;j<column;j++)
{
if(i == 1)
{
ui->tableWidget->setColumnCount(ui->tableWidget->columnCount()+1);
range = worksheet->querySubObject("Cells(int,int)",i,j); //获取cell的值
strVal = range->dynamicCall("Value2()").toString();
header<<strVal;
//设置表格头
}
else
{
probar->setValue(++count);
range = worksheet->querySubObject("Cells(int,int)",i,j); //获取cell的值
strVal = range->dynamicCall("Value2()").toString();
ui->tableWidget->setItem(i-2,j-1,new QTableWidgetItem(strVal));
}
}
if(i == 1)
{
ui->tableWidget->setHorizontalHeaderLabels(header);
}
}
ui->tableWidget->setRowCount(ui->tableWidget->rowCount()-1);
}
}
我们右击导入按钮,转到槽,添加被点击后的代码
void MainWindow::on_pushButton_23_clicked()
{
//获取保存路径
QString filepath=QFileDialog::getSaveFileName(this,tr("Save"),".",tr(" (*.xlsx)"));
if(!filepath.isEmpty()){
QAxObject *excel = new QAxObject(this);
//连接Excel控件
excel->setControl("Excel.Application");
//不显示窗体
excel->dynamicCall("SetVisible (bool Visible)","false");
//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示
excel->setProperty("DisplayAlerts", false);
//获取工作簿集合
QAxObject *workbooks = excel->querySubObject("WorkBooks");
//新建一个工作簿
workbooks->dynamicCall("Add");
//获取当前工作簿
QAxObject *workbook = excel->querySubObject("ActiveWorkBook");
//获取工作表集合
QAxObject *worksheets = workbook->querySubObject("Sheets");
//获取工作表集合的工作表1,即sheet1
QAxObject *worksheet = worksheets->querySubObject("Item(int)",1);
//设置表头值
for(int i=1;i<ui->tableWidget->columnCount()+1;i++)
{
//设置设置某行某列
QAxObject *Range = worksheet->querySubObject("Cells(int,int)", 1, i);
Range->dynamicCall("SetValue(const QString &)",ui->tableWidget->horizontalHeaderItem(i-1)->text());
}
//设置表格数据
for(int i = 1;i<ui->tableWidget->rowCount()+1;i++)
{
for(int j = 1;j<ui->tableWidget->columnCount()+1;j++)
{
QAxObject *Range = worksheet->querySubObject("Cells(int,int)", i+1, j);
Range->dynamicCall("SetValue(const QString &)",ui->tableWidget->item(i-1,j-1)->data(Qt::DisplayRole).toString());
}
}
workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(filepath));//保存至filepath
workbook->dynamicCall("Close()");//关闭工作簿
excel->dynamicCall("Quit()");//关闭excel
delete excel;
excel=NULL;
qDebug() << "\n导出成功啦!!!";
}
}
csv文件是逗号分隔值(Comma-Separated Values,CSV)文件的缩写,其文件以纯文本形式存储表格数据(数字和文本),各个字段用逗号进行分割,采用回车进行换行。由于采用纯文本记录,csv文件可以很方便的被文本处理工具、excel等工具识别。
在Qt中打开与保存csv文件十分方便,直接按照普通文本的形式操作,用QTextStream进行标准化的读写,还是很简单。
#include
#include
#include
//显示所选表所有内容
void MainWindow::on_pushButton_clicked()
{
/
初始化:最好放在 构造函数中执行?
for(int row = 0; row < 4; row++)
{
for(int col = 0; col < 3; col++)
{
if(ui->tableWidget->item(row,col)==nullptr || ui->tableWidget->item(row,col)->text().isEmpty())
{
ui->tableWidget->setItem(row,col,new QTableWidgetItem);
//...
}
}
}
/
方法1:获取创建的csv文件名
QString fileName = QFileDialog::getSaveFileName(this, tr("Excel file"), qApp->applicationDirPath (),
tr("Files (*.csv)"));
if (fileName.isEmpty())
return;
//打开.csv文件
QFile file(fileName);
if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
std::cerr << "Cannot open file for writing: "
<< qPrintable(file.errorString()) << std::endl;
return;
}
QTextStream out(&file);
/
// 方法2: 打开指定的 .csv文件
// QFile file("200000.csv");
// if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
// {
// qDebug()<<"Cannot open file for writing";
// return;
// }
// QTextStream out(&file);
创建表头
out << tr("信息,") << tr("数字,") <<"\n";
QString string;
//写入内容
for(int i = 0; i < 4; i++)
{
// QString string = ui->tableWidget->item(i, col)->text();
// out << "test" << "," << i << "\n";
for(int col = 0; col < 3; col++)
{
string ="";
string = ui->tableWidget->item(i, col)->text();
下面语句,可以直接访问,不需要执行ui->tableWidget->setItem(row,col,new QTableWidgetItem);
/// 但还不知道是否有其他的副作用。
//string = ui->tableWidget->model()->index(i, col).data().toString();
out << string << ","; // 写入文件
//out << "\n";
}
out << "\n";
}
//关闭文件
file.close();
}
#include
#include
#include
void MainWindow::on_pushButton_clicked()
{
//1.选择导出的csv文件保存路径
QString csvFile = QFileDialog::getExistingDirectory(this);
if(csvFile.isEmpty())
return;
//2.文件名采用系统时间戳生成唯一的文件
QDateTime current_date_time =QDateTime::currentDateTime();
QString current_date =current_date_time.toString("yyyy_MM_dd_hh_mm_ss");
//csvFile += tr("/%1_DTUConfigInfo_export_%2.csv").arg(username).arg(current_date);
csvFile += tr("/DTUConfigInfo_export_%2.csv").arg(current_date);
//3.用QFile打开.csv文件 如果不存在则会自动新建一个新的文件
QFile file(csvFile);
if ( file.exists())
{
//如果文件存在执行的操作,此处为空,因为文件不可能存在
}
file.open( QIODevice::ReadWrite | QIODevice::Text );
statusBar()->showMessage(tr("正在导出数据。。。。。。"));
QTextStream out(&file);
//4.获取数据 创建第一行
out<<tr("UID,")<<tr("sysID,")<<tr("UsrID,")<<tr("MeterNum,")<<tr("CMD,\n");//表头
//其他数据可按照这种方式进行添加即可
//5.写完数据需要关闭文件
file.close();
}
Qt中csv文件的导入与导出
CSV
1.简介:
全称:Comma Separated Values。
是“逗号分隔值”的英文缩写,通常是纯文本文件,一般用wordWPS或是记事本打开。
2.规则:
(1)开头不留空,以行为单位。
(2)可含或不含列名,含列名则居文件第一行。
(3)一行数据部跨行,无空行。
(4)以半角逗号作分隔符,列为空也要表达其存在。
(5)列内容如存在半角逗号(即,)则用半角引号(即"“)将该字段值包含起来。内容如存在半角逗号(即,)则用半角引号(即”")将该字段值包含起来。
(6)列内容如存在半角引号(即")则应替换成半角双引号(“”)转义,并用半角引号(即"")将该字段值包含起来。
(7)文件读写时引号,逗号操作规则互逆。
(8)内码格式不限,可为 ASCII、Unicode 或者其他。
(9)不支持特殊字符