赞
踩
最近有个需求,需要按照填入的参数动态地生成对应word文件。excel文件我还有办法,word文件我是真没办法。我去.NET上面搜了一下C#支持的word编辑库,发现好像就NPOI支持word文件修改。我没办法网上所了好久,终于找到了对应的博客通过反射和泛型去解决模板化的文件填充。然后领导又给了我一个需求。
现在是能够用占位符去替换了,内容是动态的,现在个数也要动态的。比如我一个报表,有A,B,C三项内容,现在能把ABC三项填进去了。现在的需求是有多个ABC,1,5,10,20个。就是只有一个模板但是能自我复制。自己造轮子太麻烦了。
我后来看到python处理这些特别简单,后来我决定,C#去调用python,不重复造轮子。
Tips:我最后在ChatGPT上面找到方法了,国内C#相关的博客也太少了
Tips:我后来发现nuget上面有minWord和minExcel,专门用于模版文件导入导出,我到时候看一下
这个是自己纯手撸了一个代码
C# 生成word文档(NPOI.XWPF)
这个是我网上逛github逛到的
C# MiniWord Gtihub官网
这个是这个作者另一个快速Excel文件,我感觉这个好像很好使
C# MiniExcel Gtihub官网
python的方法
Python docxtpl 操作 Word 模板文档
如果我们要调用python代码或者文件,我们至少要做的一下几步:
主要要求
保证了这个我们就能勉强使用
次要要求
太蠢了,我就直接写了
使用Pythonnet库:
Pythonnet是一个开源项目,可以直接在C#中调用Python。首先,需要在C#项目中安装Pythonnet库。可以使用NuGet包管理器或手动安装。
using System; using Python.Runtime; class Program { static void Main() { using (Py.GIL()) // 获取全局解释器锁 { dynamic py = Py.Import("module_name"); // 导入Python模块 // 调用Python函数或访问Python对象 dynamic result = py.FunctionName(param1, param2, ...); Console.WriteLine(result); } } }
这个要安装Nuget第三方库。
这个只能说勉强能用,凑合。因为他限定死了python的版本是3.4。你pip装的第三方库都要是能支持python3.4的。而且你的编译环境要和别的python环境隔离。
但是我们知道python所有版本都是有有效期的,好像是5~10年吧,过了有效期就不支持了。现在最新版的python已经是3.11了。
这个我网上搜半天没找到,最后在chatGPT上面解决了。
using System; using System.Diagnostics; class Program { static void Main() { // 创建一个新的ProcessStartInfo对象 ProcessStartInfo start = new ProcessStartInfo(); // 设置Python解释器路径 start.FileName = "path_to_python_interpreter"; // 设置要执行的Python脚本路径及其参数(如果有的话) start.Arguments = "path_to_python_script.py arg1 arg2 arg3"; // 设置为重定向输入和输出 start.UseShellExecute = false; start.RedirectStandardOutput = true; start.RedirectStandardError = true; // 启动进程 using (Process process = Process.Start(start)) { // 读取标准输出和错误输出 string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); // 等待进程结束 process.WaitForExit(); // 输出结果 Console.WriteLine("Output:"); Console.WriteLine(output); Console.WriteLine("Error:"); Console.WriteLine(error); } } }
按照这个,我们可以创建一个新的文件,然后直接命名行执行,监听返回值。
import argparse import time parser = argparse.ArgumentParser(description='manual to this script') # 这个是我们输入的两个参数 parser.add_argument("--name", type=str, default="0", help='input name') parser.add_argument("--age", type=int, default=32,help='input total age') args = parser.parse_args() print(args.name) print(args.age)
主函数
using C_python.Utils; using System.Diagnostics; namespace C_python { internal class Program { static void Main(string[] args) { ProcessStartInfo start = new ProcessStartInfo(); // 设置Python解释器路径 start.FileName = "python"; // 设置要执行的Python脚本路径及其参数(如果有的话) start.Arguments = @"PythonFiles/test.py --name '哈哈哈' --age 849"; // 设置为重定向输入和输出 start.UseShellExecute = false; start.RedirectStandardOutput = true; start.RedirectStandardError = true; // 启动进程 using (Process process = Process.Start(start)) { // 读取标准输出和错误输出 string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); // 等待进程结束 process.WaitForExit(); // 输出结果 Console.WriteLine("Output:"); Console.WriteLine(output); Console.WriteLine("Error:"); Console.WriteLine(error); } Console.WriteLine("运行完毕"); Console.ReadLine(); } } }
运行结果
添加休眠
import argparse import time parser = argparse.ArgumentParser(description='manual to this script') # 这个是我们输入的两个参数 parser.add_argument("--name", type=str, default="0", help='input name') parser.add_argument("--age", type=int, default=32,help='input total age') args = parser.parse_args() print('我休眠1s') time.sleep(1) print('我再休眠1s') time.sleep(1) print(args.name) print(args.age)
Tips:我发现python文件选择始终复制不一定能每次修改都复制,还是得进debug文件里面改
我们不一定会用这么简单的参数,我们后面可能会输入上百行的复杂参数,用命令行就不一定好用了。
所有我们可以将参数写到一个文件里面,每次执行让python去读这个文件里面的数据。简单参数直接传,复杂参数存文件。自己去解析。
理论上是可以的,想调用python功能直接往端口传数据就行了,但是感觉有点大炮打蚊子,没必要。python就是个辅助工具,能用就行。
python有很多很好用的工具,如果我们编程的时候能很方便的调用python的工具帮我们做事情,可以减少很多不必要的麻烦,不用重复造轮子,快速开发,也能顺便学一下python。
当然,也可以在nuget上找对应的第三方库或者手撸一个工具。前者找起来很麻烦,要找好几天,而且尝试好不好用也很麻烦。后者更费时间,简单事情就不要重复地造轮子。我们编程序永远是需求为第一导向,能快速地解决是最好的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。