当前位置: 首页 > news >正文

基于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工程)
    23

7

  • 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!

  • 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
    18

相关文章:

  • traefik k3s配置
  • MongoDB基础知识
  • 页游(弹弹堂)刷怪脚本教程(一)---大漠插件制作颜色变化的字体字库(按键精灵)
  • Java项目之基于ssm的个性化旅游攻略定制系统(源码+文档)
  • http://noi.openjudge.cn/_2.5基本算法之搜索_1804:小游戏
  • 实验室预约|实验室预约小程序|基于Java+vue微信小程序的实验室预约管理系统设计与实现(源码+数据库+文档)
  • JMeter接口性能测试从入门到精通
  • FreeCAD傻瓜教程-钣金工作台SheetMetal的安装和简单使用
  • AIP-214 资源过期
  • Green Coding规范:从循环语句到数据库查询的节能写法
  • 如何在idea中新建一个项目
  • strings.Cut 使用详解
  • 【Csharp】Winform客户端与服务器,局域网加密字符串与文件通信
  • 使用SymPy求解矩阵微分方程
  • DeepSeek本地部署(Ollama)
  • 【代码随想录 字符串3.替换数字】
  • C++中为什么要使用nullptr而不是null
  • 数字电子技术基础(三十九)——显示译码器
  • 基于CAPL语法实现对程控电源的控制(通用DLL版,支持TCP协议,RS232协议,SCPI指令)
  • 对解释器模式的理解
  • 潍坊哪家网站制作公司好/好口碑的关键词优化
  • 百度网站提交入口/优化公司排名
  • 网站监控的软件怎么做/一站式网络推广服务
  • 做框架模板的网站/上海优化公司有哪些
  • vs2015是网站开发/真正永久免费网站建设
  • 池州专业网站建设公司/谷歌浏览器app下载安装