基于OpenXLSX库创建的CAPL中可用的解析xlsx文件的DLL
- 🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用
- 🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】
- 🍅 玩转CANoe,博客目录大全,点击跳转👉
目录
- 📙 OpenXLSX库简介
- 📙 DLL中的函数解读
- 📙 读取表格指定表单的行列数
- 📙 读/写单元格数据
- 📙 读/写 行数据
- 📙 读/写 列数据
- 📙 保存与关闭
- 📙 源码获取
🍅 背景:CAPL语言的简陋,同学们是有目共睹的,本身不支持解析xlsx表格文件的,奈何工程应用中,输入文件经常是xlsx格式,绕个弯的解决办法是,将xlsx文件转为csv文件,然后用capl解析csv文件,但是这种方法有点麻烦,这篇文件将基于C++公开库OpenXLSX库,封装一个可以在CAPL脚本中使用的DLL。
📙 OpenXLSX库简介
以下简介来自百度百科,OpenXLSX 是一个开源的 C++ 库,用于读取、创建和修改 Excel 文件(.xlsx 格式)。该库基于现代 C++ 标准(C++17),旨在提供一个简单、直观且高效的接口,使开发者能够轻松地在 C++ 项目中处理 Excel 文件。
主要特性:
- 跨平台支持:OpenXLSX 支持在 Windows、Linux 和 macOS 平台上运行,确保了广泛的适用性。
- 轻量级:该库设计简洁,依赖性少,适合嵌入到各种 C++ 项目中。
- 高效:OpenXLSX 通过优化的内存管理和文件操作,提供了高效的 Excel 文件处理能力。
- 易用性:提供了直观的 API,使开发者能够快速上手并实现复杂的 Excel 操作。
功能:
- 读取和写入单元格数据:支持读取和写入字符串、数字、布尔值等多种数据类型。
- 工作表管理:支持添加、删除和重命名工作表。
- 单元格格式:支持设置单元格的格式,如字体、颜色、对齐方式等。
- 文件保存和加载:支持将修改后的 Excel 文件保存到磁盘,以及从磁盘加载现有的 Excel 文件。
📙 DLL中的函数解读
open_xlsx_demo_win64.dll文件中有如下图中的函数,实现对xlsx文件的读写
这里注意CANoe的内核版本选择,如果是64bit RT Kernel ,则CAPL中只能使用X64版本的DLL,否则使用X86版本的DLL
📙 读取表格指定表单的行列数
-
dll_Excel_Open(const char* filename, const char* sheetName, char* error_info) :打开表格,函数执行成功,返回值为1,否则为0。该函数的返回值如果为0则表示打开失败,否则表示打开成功。
- filename : 文件路径。
- sheetName:表单的名称
- error_info:如果表格打开失败,通过该参数返回错误日志信息
-
dll_Excel_Get_Sheet_Dimensions(long* rowCount, long* colCount):该函数返回表单的行数和列数,执行成功返回值为1,否则为0
- rowCount : 表格行数。
- colCount: 表格列数。
-
注意:
- const MAX_SIZE = 2000; //必须为2000,和dll中定义的MAX_SIZE保持一致
- char Data[1000][MAX_SIZE];:读取表格整行或者整列数据时,要保证传入的数组大小比实际的行列数要大,否则会产生访问越界等错误导致的DLL崩溃。
/*@!Encoding:65001*/
includes
{
#if X64
#pragma library("..\..\OpenXLSX_Demo_Win64\x64\Debug\open_xlsx_demo_win64.dll")
#else
#pragma library("..\..\OpenXLSX_Demo_Win32\Debug\open_xlsx_demo_win32.dll")
#endif
}
on key '1'
{
const MAX_SIZE = 2000; //必须为2000,和dll中定义的MAX_SIZE保持一致。
char cell_data[MAX_SIZE];
char Data[1000][MAX_SIZE];
char err_infor[MAX_SIZE];
long i,j,ret;
long rowCount,colCount;
ret = dll_Excel_Open("D:\\Project\\Excel\\CANoe_Demo\\node\\CANUDS2.xlsx","诊断",err_infor);
if(ret == 0)
{
write("打开表格失败:%s",err_infor);
return ;
}
if(1)
{
write("********** 获取行列数 **********");
dll_Excel_Get_Sheet_Dimensions(rowCount,colCount);
write("表格行数rowCount = %d ; 表格列数colCount = %d",rowCount,colCount);
}
}
输出结果:
Program / Model ********** 获取行列数 **********
Program / Model 表格行数rowCount = 235 ; 表格列数colCount = 7
表格的大致内容如下:
- 说明:这个表格中是由中英文字符组成的,本DLL是支持中文字符的。
📙 读/写单元格数据
- dll_Excel_Get_Cell_Data (char* Cel_Pos, char* cellData, long maxSize):该函数通过单元格定位读取单元格数据,如果函数执行成功,返回返回值为单元格的字节大小,否则返回-1。
- Cel_Pos :单元格的定位,比如“B2”等
- cellData:返回数据的一维字符数组,(表格中的所有类型数据统一转为字符串返回,注意日期类型的单元格暂未处理,可能返回值为一串数值)
- maxSize:指定的最大返回的单元格字符数
- dll_Excel_Set_Cell_Data(char* Cel_Pos, const char* cellData: 该函数通过单元格定位写入单元格数据,返回值如果为0则表示失败,否则表示成功。
- Cel_Pos :单元格的定位,比如“B2”等
-
- cellData:设置的单元格数据
on key '1'
{
//...省略代码
if(1)
{
write("********** 设置单元格数据测试 **********");
strncpy(cell_data, "测试数据5678", MAX_SIZE);
ret = dll_Excel_Set_Cell_Data("B8", cell_data);
write("ret = %d; Data[B8] = %s ",ret,cell_data);
}
if(1)
{
write("********** 读取单元格数据测试 **********");
ret = dll_Excel_Get_Cell_Data("B8", cell_data,MAX_SIZE);
write("ret = %d; Data[B8] = %s ",ret,cell_data);
}
//...省略代码
输出结果:
Program / Model ********** 获取行列数 **********
Program / Model 表格行数rowCount = 235 ; 表格列数colCount = 7
Program / Model ********** 设置单元格数据测试 **********
Program / Model ret = 16; Data[B8] = 测试数据5678
Program / Model ********** 读取单元格数据测试 **********
Program / Model ret = 16; Data[B8] = 测试数据5678
📙 读/写 行数据
- dll_Excel_Set_Row_Data(long row, long start_col,long length, char rowData[][MAX_SIZE]) :该函数向表格中某一行写入数据,如果写入成功,则函数返回表单的列数,否则返回小于0的值。
- row : 指定的行数,1表示第一行,不可从0索引。
- start_col:从哪一列开始写入,1表示第一列,不可从0索引。
- length:写入的单元格个数。
- rowData:写入的二维数组,(注意:所有数据以字符串方式写入)
- dll_Excel_Get_Row_Data(long row, char rowData[][MAX_SIZE]): 该函数读取指定行数的表格数据,如果数据返回成功,则函数返回表单的列数,否则返回小于0的值。
on key '1'
{
//...省略代码
if(1)
{
char setData[5][MAX_SIZE] = { "设置行 11", "设置行 22" , "设置行 33", "设置行 44", "设置行 55" };
write("********** 设置第5行,从第1列开始填充5个数据 **********");
colCount = dll_Excel_Set_Row_Data(5, 1, 5,setData);
write("colCount = %d",colCount);
ret = dll_Excel_Save();
write("保存表格 = %d;",ret);
}
if(1)
{
write("********** 读取行数据测试 **********");
colCount = dll_Excel_Get_Row_Data(5, Data);
write("colCount = %d",colCount);
for(i = 0;i<colCount;i++)
{
write("行数据 Data[%d] = %s",i,Data[i]);
}
}
//...省略代码
输出结果:
Program / Model ********** 获取行列数 **********
Program / Model 表格行数rowCount = 235 ; 表格列数colCount = 7
Program / Model ********** 设置第5行,从第1列开始填充5个数据 **********
Program / Model colCount = 7
Program / Model 保存表格 = 1;
Program / Model ********** 读取行数据测试 **********
Program / Model colCount = 7
Program / Model 行数据 Data[0] = 设置行 11
Program / Model 行数据 Data[1] = 设置行 22
Program / Model 行数据 Data[2] = 设置行 33
Program / Model 行数据 Data[3] = 设置行 44
Program / Model 行数据 Data[4] = 设置行 55
Program / Model 行数据 Data[5] = WriteTest4
Program / Model 行数据 Data[6] = WriteTest5
表格的大致内容如下:
📙 读/写 列数据
- dll_Excel_Set_Col_Data(long col, long start_row,long length, char rowData[][MAX_SIZE]) :该函数向表格中某一列写入数据,如果写入成功,则函数返回表单的行数,否则返回小于0的值。
- col : 指定的列数,1表示第一列,不可从0索引。
- start_row:从哪一行开始写入,1表示第一列,不可从0索引。
- length:写入的单元格个数。
- rowData:写入的二维数组,(注意:所有数据以字符串方式写入)
- dll_Excel_Get_Col_Data(long col, char colData[][MAX_SIZE]): 该函数读取指定列数的表格数据,如果数据返回成功,则函数返回表单的行数,否则返回小于0的值。
//...省略代码
if(1)
{
char setData[5][MAX_SIZE] = { "设置列 11", "设置列 22" , "设置列 33", "设置列 44", "设置列 55" };
write("********** 设置第1列,从第6行开始填充5个数据 **********");
rowCount = dll_Excel_Set_Col_Data(1, 6,5,setData);//设置第1列,从第6行开始,填充5个数据
write("rowCount = %d",rowCount);
}
if(1)
{
write("********** 读取列数据测试 **********");
rowCount = dll_Excel_Get_Col_Data(1, Data);
for(i = 0;i<rowCount;i++)
{
write("列数据Data[%d] = %s",i,Data[i]);
}
}
if(1)
{
ret = dll_Excel_Save();
write("保存表格 = %d;",ret);
dll_Excel_Close();
}
}
//...省略代码
输出结果:
Program / Model ********** 获取行列数 **********
Program / Model 表格行数rowCount = 235 ; 表格列数colCount = 7
Program / Model ********** 设置第1列,从第6行开始填充5个数据 **********
Program / Model rowCount = 235
Program / Model ********** 读取列数据测试 **********
Program / Model 列数据Data[0] = WriteTest1
Program / Model 列数据Data[1] = WriteTest2
Program / Model 列数据Data[2] = WriteTest3
Program / Model 列数据Data[3] = WriteTest4
Program / Model 列数据Data[4] = 设置行 11
Program / Model 列数据Data[5] = 设置列 11
Program / Model 列数据Data[6] = 设置列 22
Program / Model 列数据Data[7] = 设置列 33
Program / Model 列数据Data[8] = 设置列 44
Program / Model 列数据Data[9] = 设置列 55
Program / Model 列数据Data[10] = 00WriteTest44
Program / Model 列数据Data[11] = 00WriteTest55
Program / Model 列数据Data[12] = DIA_PRO_10_PHY_09
Program / Model 列数据Data[13] = DIA_PRO_10_PHY_10
Program / Model 列数据Data[14] =
.。。。。
表格的大致内容如下:
📙 保存与关闭
- dll_Excel_Save():保存表格,有对表格写操作时,必须调用该函数保存表格才能生效,注意调用改函数时要保证操作的表格处于关闭状态,否则也很会保存失败
- dll_Excel_Close():关闭表格。
📙 源码获取
-
博主花了很长的时间和精力做了这个,希望对您有帮助!
-
基于CAPL语法生成的解析xlsx文件的DLL文件(DLL以及CANoe Demo工程)
-
基于CAPL语法生成的解析xlsx文件的DLL文件(C++源码以及CANoe Demo工程)
- 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
- 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。