在Linux下调用EXCEL(XLSM)文件,并执行里面的VBA宏,这个看似是个伪需求;但做过办公自动化的都知道,在10几20年前,VBA宏是办公自动化里面最简单,并最不可或缺的一环,甚至现在有很多科研机构,政府机关,都还在使用着这个最原始的办公自动化和数据自动化分析的方法;

        而现在越来越多的系统,已经转向虚拟化和Linux化平台,甚至一些已经上了超融合,K8s,这时候一些ERP,MES,PLM等系统,对于原来的办公自动化流程的兼容性就显得捉襟见肘,很多单位并不希望丢弃原来的流程以及成果,特别是科研机构,很多是使用VBA来做数据分析的,里面涵盖很大量的数据分析方法,如果希望将这部分的成果延续,并放到Linux下作为模板运行输出结果,传统方案是做不到的,必须得在Windows下环境运行,或者通过虚拟机实现;但着又违背了超融合的环境依赖安全性;
        

        迫于无奈,花了些时间自研了一套基于Linux环境下能跑Office的Docker,并利用python来运行Excel里面的VBA宏,同时将得到的结果输出到原来的XLSM文件内;

        https://github.com/xeden3/docker-excel-macro-run

        这个是项目地址;

安装和使用也非常简单

这个 Docker 容器提供了一种使用 Python win32 在 Wine 和 Office 环境下运行 Excel 宏的解决方案。它支持通过 GitHub 和 Docker Hub 安装。下面是安装和使用的步骤。

GitHub 安装和构建

git clone https://github.com/xeden3/docker-excel-macro-run.git
cd docker-excel-macro-run
docker build -t docker-excel-macro-run:v1 .

Docker Hub 安装

docker pull xeden3/docker-excel-macro-run:v1

运行程序,执行example.xlsm下的宏ThisWorkbook.WriteDataToSheet1

docker run -v ./example.xlsm:/opt/wineprefix/drive_c/test.xlsm --rm docker-excel-macro-run:v1 test.xlsm ThisWorkbook.WriteDataToSheet1

如果成果,则输出json如下

{"errcode": 0, "errmsg": ""}

参数解释:

 

  • docker-excel-macro-run:v1:Docker 镜像名称和标签。
  • test.xlsm:要运行宏的 Excel 文件名。它应该与容器目录中的文件名 (/opt/wineprefix/drive_c/test.xlsm) 相匹配。
  • ThisWorkbook.WriteDataToSheet1:要执行的宏命令。

        现在项目已经用在了我们的MES产品里面,并得到了比之前虚拟机运行windows更好的效果,对于高可用和分布式负载都有更好的支持,但也不得不说wine的效率的确会比原生windows的差,因此运行效率会因为启动docker和wine环境有所损耗,但10s和12s的差别,应该不是需要考虑的问题。

        如果在使用过程中遇到什么问题,欢迎留言或者在github项目地址上做 Issues 。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐