基于QT的XLS文件简单处理及文件打包封装
整体设计思路
本项目的设计初衷是采用QT去开发一款简单数据处理工具,能够实现读取EXCEL表格文件,并对读取的Excell文件进行数据处理,最终将处理后的数据导出为对应的C文件。
该项目的UI比较简单,主要包含工具栏的打开,保存。如下图所示。
立项之前,对整体设计内容进行一个框架搭建非常重要,这能够为后续的开发提供一个清晰的脉络走向,明确每个环节的目标所需,便于后续的工作展开。
此项目的整个开发过程如下图所示,包括以下几个部分。
1.开发环境与应用
QtCreator包含有众多的库与接口函数,支持C++与其他语言开发,强大的开发功能和可移植性,足以支持我们去开发一款适用于自身需求的工具,其下载链接如下:
https://download.qt.io/archive/qtcreator
Enigma Virtual Box实用简单快捷,能够高效快速的将QT环境下开发的应用程序,打包封装成为一个独立的EXE执行文件,链接如下:
https://pan.quark.cn/s/9014b4d4b8fe
2.QT的程序编写
2.1. 文件的读取与路径获取
点击Ui界面上的打开按钮,根据信号与槽函数的执行机制,将会执行下列代码,以此实现文件的打开,同时将获取到的文件路径存放在字符串列表中。
connect(ui->action_Open,&QAction::triggered,this,[=]
{
QString curPath = QCoreApplication::applicationDirPath();
QString dilTile = QString::fromLocal8Bit("打开文件");
QString filter = QString::fromLocal8Bit("(*.h *.cpp);;(*.txt);;(*.doc);;(*.xls);;(*.*)");
QStringList filenames = QFileDialog::getOpenFileNames(this,dilTile,curPath,filter);
ui->listWidget_Display->addItems(filenames); //显示在列表中
readExcel(filenames);//读取EXCEL文件
});
2.2. Qaxobject进行EXCEL表格的数据获取
Qaxobject是实现EXCEL文件读取的关键所在,关于这部分内容网上有许多说明与教程,这里不做赘述。
下列代码参考了部分博主有关EXCEL处理的介绍内容,在之前已经获取的文件路径的基础上,使用QAxobject去读取EXCEL的内容,并将其存放在容器中。(注:部分程序有些累赘,并没有在写法上进行优化,可能看着会觉得啰嗦。)
这里主要是获取温度,电阻和参考阻值对应的数值。
//读EXCEL文件
void readExcel(QStringList filePaths)
{
QAxObject excel("Excel.Application"); //加载Excel驱动
excel.setProperty("Visible", false);//不显示Excel界面,如果为true会看到启动的Excel界面
QAxObject *work_books = excel.querySubObject("WorkBooks");
work_books->dynamicCall("Open (const QString&)", filePaths); //打开指定文件
QAxObject *work_book = excel.querySubObject("ActiveWorkBook");
QAxObject *work_sheets = work_book->querySubObject("Sheets"); //获取工作表
QString ExcelName;
static int row_count = 0,column_count = 0; //定义行数变量和列数变量
int sheet_count = work_sheets->property("Count").toInt(); //获取工作表数目
if(sheet_count > 0)
{
QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", 1); //设置为 获取第一页 数据
QAxObject *used_range = work_sheet->querySubObject("UsedRange");
QAxObject *rows = used_range->querySubObject("Rows");
row_count = rows->property("Count").toInt(); //获取行数
// qDebug()<<row_count;//打印行数
QAxObject *column = used_range->querySubObject("Columns");
column_count = column->property("Count").toInt(); //获取列数
// qDebug()<<column_count;//打印列数
//获取第一行第一列数据
ExcelName = work_sheet->querySubObject("Cells(int,int)", 1,1)->property("Value").toString();
for (int i =2; i <= row_count; i++) //行数,从第二行开始读取
{
for (int j = 1; j <= column_count;j++) //列数,从第一列开始读取
{
int txt = work_sheet->querySubObject("Cells(int,int)", i,j)->property("Value").toUInt(); //获取单元格内容
arr.append(txt);
}
array.append(arr);
arr.clear(); //将每行数据存储到array后,清空arr,避免下次循环时数据累计;arr.appeng()是添加不是赋值
}
work_book->dynamicCall("Close(Boolean)", false); //关闭文件
excel.dynamicCall("Quit(void)"); //退出
ADC_ValueCalculate(row_count,column_count); //获取到的数据进行处理
}
}
2.3. 处理EXCEL表格数据
此部分过程是将获取到的数值做简单的运算。
以下是将表格中的电阻和参考电阻对于的数据,从之前存放的容器中取出来,并作出简单的运算,存放在新的容器中。
void ADC_ValueCalculate(int Row,int Colum) //ADC值得运算转化
{
uint8_t i=0;
int tADC_Value1; //暂时存放ADC值
int tADC_Value2;
//采用遍历去获取容器中存放的值
for(i=0;i<Row-1;i++)
{
tADC_Value1=array.at(i).at(1);
tADC_Value2=array.at(i).at(2);
tADC_Value2+=tADC_Value1;
tADC_Value1= tADC_Value1*4095/tADC_Value2;
ADC_Value.append(tADC_Value1);
qDebug()<<tADC_Value1;
}
}
2.4. 保存为C文件或其他文件
点击UI界面上的保存按键,触发以下操作,将文件保存为对应得C文件或其他格式文件。
//文件保存设置
void MainWindow::on_action_Save_triggered()
{
QString fileName = QFileDialog::getSaveFileName(this,"打开文件","E:/","All(*.*);;C files (*.c);;Text files (*.txt);;XLS files (*.xls)");
if(fileName.isNull())
{
QMessageBox::information(this,"提示","未保存选中文件");
}
//实例化一个文件对象
QFile file(fileName); //使用获取到的文件路劲,实例化一个文件对象,后期对文件的操作都是基于该对象
//打开文件
if(!file.open(QFile::ReadWrite))
{
return;
}
//读取textEdit中的内容
QString msg;
QString msg2;
msg.append("adc_value[10]={");
Vec2Str(ADC_Value,msg2);
msg+=msg2;
msg.append("};");
QByteArray ba= msg.toLatin1(); // must
char* ch;
ch=ba.data();
//将textEdit中的内容写入到文件中
file.write(ch);
//关闭文件
file.close();
}
3.UI布局
QT支持可视化设计,控件的添加布局,可以在工程文件下的设计中进行修改。如下图所示,项目文件的结构树如下,点击红框中对于的文件,即可修改该类所包含的设计师界面。
该项目的UI设计比较简单明了,主要包括菜单栏,工具栏 ,主界面的布局。
对应得控件可以从Layouts中直接拖拽出来,也可以程序编写,进行UI的布局设计。
其中与程序相关联的两个按键如打开保存。
当然,图标的添加需要开发者自己去添加QT资源文件,然后在项目中添加存放图片的文件夹。
4.文件的打包与发布
4.1QT控制台指令打包QT程序