🎀 文章作者:二土电子
🐸 期待大家一起学习交流!
前言
其实本文所实现的功能并非博主要实现的全部功能,只是全部功能中的一小部分,这里只是为了记录一下实现方法,防止后续忘记,仅供参考。
一、实现效果
目前实现的内容为,打开本地表格文件,打开后输出表格总行数和总列数,然后打印出表格全部内容。测试表格如下
目前的上位机页面如下
点击“选择文件”,选择本地的表格文件
或者直接输入文件路径也可以。然后点击打开文件,在Qt端就可以输出选中表格的总行数和总列数,并且将表格的全部内容打印出来。结果如下
二、UI设计
UI只用到了简单的两个控件,这里列一下。
- QPushButton
“选择文件”和打开文件使用了本控件。 - QLineEdit
文件路径使用了本控件。三、程序设计
3.1 选择本地表格文件
“选择文件”的槽函数为
void Widget::on_selectfile_Button_clicked()
{
QString fileName = QFileDialog::getOpenFileName(this,QStringLiteral("选择文件"),"F:",QStringLiteral("表格(*xls *xlsx *csv);"));
// 将文件路径显示到UI控件
ui->selectedfilepath_lineEdit->setText(fileName);
}
选中文件后会将文件路径显示到控件selectedfilepath_lineEdit
。
如果需要增加文件类型,可以参考下面进行修改
QString fileName = QFileDialog::getOpenFileName(this,QStringLiteral("选择文件"),"F:",QStringLiteral("表格(*xls *xlsx *csv);;图片(*jpg *png);"));
3.2 获取表格总行列数
QAxObject *excel = new QAxObject(this);
excel->setControl("Excel.Application");
excel->setProperty("Visible", false); //显示窗体看效果,选择ture将会看到excel表格被打开
excel->setProperty("DisplayAlerts", true);
QAxObject *workbooks = excel->querySubObject("WorkBooks"); //获取工作簿(excel文件)集合
QString str = ui->selectedfilepath_lineEdit->text();
//打开选定的excel
workbooks->dynamicCall("Open(const QString&)", str);
QAxObject *workbook = excel->querySubObject("ActiveWorkBook");
QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)",1);
// 获取行列数
QAxObject *usedRange = worksheet->querySubObject("UsedRange"); //获取表格中的数据范围
QAxObject *rows = usedRange->querySubObject("Rows");
getrow = rows->property("Count").toInt(); //获取行数
QAxObject *column = usedRange->querySubObject("Columns");
getcolumn = column->property("Count").toInt(); //获取列数
qDebug("行数为:%d 列数为:%d\n",getrow,getcolumn);
值得注意的是,本程序获取的是第一个工作表的总行列数,如需修改,可以修改这个函数里的参数
QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)",2);
3.3 获取并输出表格内容
QVariant var = usedRange->dynamicCall("Value"); // 将所有的数据读取到QVariant容器中保存
QList<QList<QVariant>> excel_list; // 用于将QVariant转换为Qlist的二维数组
QVariantList varRows=var.toList();
if(varRows.isEmpty())
{
return;
}
const int row_count = varRows.size();
QVariantList rowData;
for(int i=0;i<row_count;++i)
{
rowData = varRows[i].toList();
excel_list.push_back(rowData);
}
//打印excel数据
for(int i = 0; i<row_count; i++)
{
QList<QVariant> curList = excel_list.at(i);
int curRowCount = curList.size();
for(int j = 0; j < curRowCount; j++)
{
qDebug() << curList.at(j).toString();
}
}
2.4 操作单元格内容
操作表格,归根结底还要落到操作单元格上,这里会给出一个操作方法
QString ExcelName = worksheet->querySubObject("Cells(int,int)",所在行数,所在列数)->dynamicCall("Value").toString();
四、操作实例
这里的操作实例是根据博主自己需要写的,是为了找出报文ID和报文数据所在的列索引,这里贴出程序,仅供参考。
// 遍历出报文ID和数据所属列数
// 默认第一列为时间,不需要遍历
for (int i = 1;i <= getcolumn;i ++)
{
// 遍历第一行全部内容
ExcelName = worksheet->querySubObject("Cells(int,int)",1,i)->dynamicCall("Value").toString();
// 查找报文ID所在列
if (ExcelName == "MAKE_CAN_ID(HEX)")
{
qDebug("报文ID所在列为:%d",i);
messageIDColumn = i;
}
// 查找数据所在列
if (ExcelName == "DATA(HEX)")
{
qDebug("报文ID所在列为:%d",i);
dataColumn = i;
// 通常数据所在列在报文ID后面,所以遍历到数据所在列后直接跳出for循环
break;
}
}
qDebug("报文ID所在列为:%d 数据所在列为:%d\n",messageIDColumn,dataColumn);