1、背景简介
由于最近工作中遇到了祖传应用层代码和底层代码对接繁琐的问题,用于对接模型信号的近千行的excel表格不仅对制作人要求很高,还难以差错,同时底层对接起来也很麻烦,想着能不能写个脚本来处理一下rte层,减少从表格到代码的出错情况(非常能体会到接口化、集成化的重要性)。
第一个想到的是VBA,可以直接在excel写代码,但网上资料偏少,且手册冗长不好下手;想用python脚本吧,换个人来开发还得装一些组件和运行环境,不太方便统一打包处理,网上偶然发现有博主用cbrother处理表格生成宏定义,来了灵感看看试试行不行。
2、Cbrother
这是一个国内大神写的编程语言CBrother,官网手册对其说明如下:
CBrother是一门跨平台的脚本语言,支持真正的多线程,它抛弃了传统脚本语言的GIL全局锁技术,从而更能发挥多核CPU的强劲性能。CBrother语法继承了C类语法体系,有Java,C++,C#,JS,PHP等语言基础便可以直接上手编写代码。你可以用C++扩展它,也可以将CBrother嵌入C++语言里使用。(摘自官网手册:CBrother文档)
由于博主有过c#、c开发基础,搭配上cbrother官网提供的例程说明和手册,个人感觉非常好上手,且搭建运行环境非常简单,在官网下载个包即可,也不用配置环境变量什么的;同时,cbrother还适配了VScode编译器,直接下载个插件就可以进行仿真和运行,非常方便调试工作。
3、Excel操作
扯远了,让咱们回归正题,cbrother提供了一个Excel扩展excel文件,目前支持*.xlsx和*.csv两种格式。由于是自用就简单写了下打开表格的功能,没有做太多处理,代码如下:
import lib/excel
import CBExcel.code
function main(parm)
{
var excel = new Excel();
var path = GetRoot() + "BDU_IF.xlsx"; //从当前工作目录获取表格
if(!excel.load(path))
{
print "load err:" + path; //若未能打开则报错退出
return;
}
else
{
print "open succes:" + path; //正常打开则进行下一步
}
/* Generate Code */
var excelworksheet = excel.getWorksheet(1); //获取表格第二个sheet
var maxRows = excelworksheet.getTotalRows(); //获取第二个sheet的最大行数
var maxCols = excelworksheet.getTotalCols(); //获取第二个sheet的最大列数
var HeaderFile = new File(GetRoot() + "RTE_IO.h","wb"); //在当前工作目录创建.h文件(可读写)
/* 这里省略了一些静态的写入,不需要根据表格更改的 */
//Input
for(var i = 1 ; i <= maxRows ; i++)
{
if ((excelworksheet.getCell(i,"L").getString() == "IO") && (strget(excelworksheet.getCell(i,"S").getString(),0,3) != "opt"))
{
var rte_Name = strupper(excelworksheet.getCell(i,"A").getString());
var rte_Module = strupper(excelworksheet.getCell(i,"H").getString());
var rte_type = excelworksheet.getCell(i,"D").getString();
var rte_desc = excelworksheet.getCell(i,"I").getString();
if(strlen(rte_Name) <= 0)
{
continue;
}
HeaderFile.write(" RTE_IN_" + rte_Module + "_" + rte_Name + "," + " //Type:" + rte_type);
HeaderFile.write(" Desc:" + rte_desc + "\n");
}
}
HeaderFile.write(" RTE_IN_MAX\n}RTE_IO_IN_E;\n\n");
}
可以看到,这里我打开了表格并获取到sheet2的行列数,同时创建了待写文件.h,同时通过查找表格进行遍历筛选出合适项直接写入到目标文件内,短短几行就解决了冗长表格的机械搬砖处理。这里代码抛砖引玉,大家可以进行优化处理。
4、.bat文件
截止第三章博主还是通过vscode进行运行的,但这样并没有解决我用cbrother的初衷,在翻看官网手册后发现通过命令行运行脚本就可以实现一键启动,脱离编辑器,方便后面使用。
由于并没有过.bat开发经验,尝试过挺多次后终于实现了功能,这里也是贴一下代码,比较简陋,大佬轻喷
@echo off
setlocal enabledelayedexpansion
REM 设置文件夹路径
set "folderPath=%cd%\cb"
REM 遍历文件夹中的xlsx和xlsm文件并重命名
for %%i in ("%folderPath%\*.xlsx") do (
set "file=%%~ni"
set "extension=%%~xi"
ren "%%i" "BDU_IF.xlsx"
)
for %%i in ("%folderPath%\*.xlsm") do (
set "file=%%~ni"
set "extension=%%~xi"
ren "%%i" "BDU_IF.xlsx"
)
echo Generating... Please Wait..
set "cbrotherPath=!scriptPath!driver\cbrother.exe"
set "helloworldPath=!scriptPath!cb\main.cb"
REM 执行命令
%cbrotherPath% %helloworldPath%
echo Generate success
endlocal
pause
最终打包的文件夹如图,这里将cbrother包直接放到工程目录下的driver里了,方便.bat调取,不然还要遍历电脑磁盘查找,比较慢且不方便打包分享。
5、结语
通过cbrother脚本确实提高了不少工作效率,顺便后面也能替表格查查错,以后有机会再深入研究研究,欢迎大家交流讨论!