基于Cbrother脚本通过excel生成c代码

文章讲述了作者为简化工作中的代码对接问题,探索了VBA和Python,最终发现CBrother这门跨平台的脚本语言,其多线程特性、C类语法及易用性使Excel数据处理自动化变得高效。作者通过实例展示了如何使用CBrother打开Excel文件,提取数据并生成代码,以及如何通过.bat文件实现命令行运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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脚本确实提高了不少工作效率,顺便后面也能替表格查查错,以后有机会再深入研究研究,欢迎大家交流讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

您猜我猜不猜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值