C#如何临时提取加载项目内嵌入的Excel资源文件进行操作
C#提取嵌入Excel资源供Interop调用的实现方案
核心逻辑:Excel Interop仅支持打开本地磁盘的实体文件,无法直接读取程序集内的嵌入流,只需要先将嵌入的Excel资源从程序集读取后写入本地临时目录,拿到文件路径后即可传入你已写好的Interop代码执行操作。
步骤1:确认嵌入资源的完整名称
嵌入资源的命名规则为[项目默认命名空间].[项目内相对路径(文件夹用.分隔)].[带后缀的文件名],比如项目默认命名空间为DemoApp,Excel文件直接放在项目根目录、文件名为数据模板.xlsx,对应资源全名就是DemoApp.数据模板.xlsx。
可以先运行以下代码遍历程序集内所有嵌入资源,定位到你需要的Excel对应的准确资源名,避免硬猜出错:
// 调试时执行,在输出窗口查看所有嵌入资源名称 string[] resourceList = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames(); foreach (string res in resourceList) { System.Diagnostics.Debug.WriteLine(res); }
步骤2:提取嵌入资源生成本地临时文件
拿到准确的资源名后,用以下代码将嵌入的Excel流写入系统临时目录,生成可被Interop识别的本地文件:
using System.IO; using System.Reflection; // 替换为上一步查到的Excel资源全名 string targetResName = "你的项目命名空间.你的Excel文件.xlsx"; // 生成临时路径,保持文件后缀和原Excel一致,避免Interop格式识别错误 string tempFilePath = Path.Combine(Path.GetTempPath(), $"{Path.GetRandomFileName()}.xlsx"); // 读取资源流写入临时文件 using (Stream resStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(targetResName)) { if (resStream == null) { throw new FileNotFoundException($"未找到指定嵌入Excel资源,请检查资源名配置:{targetResName}"); } using (FileStream fileStream = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write)) { resStream.CopyTo(fileStream); } }
步骤3:传入路径调用原有Interop逻辑
将你原有代码中Workbooks.Open方法的第一个参数替换为上一步生成的tempFilePath即可,其余逻辑无需修改:
Excel.Application objExcel = new Excel.Application(); objExcel.Visible = true; objExcel.WindowState = Excel.XlWindowState.xlNormal; Excel.Workbook excelWorkbook = objExcel.Workbooks.Open(tempFilePath, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
注意事项
- 如果Excel文件存放在项目的子文件夹中,资源名需要拼接文件夹路径,比如文件放在项目的
Resources文件夹下,对应资源名格式为项目命名空间.Resources.文件名.xlsx,优先用步骤1的遍历方法确认名称,不要手动拼接避免出错。 - 临时文件默认存储在系统Temp目录,若需要程序退出后自动清理,可以在关闭Excel相关进程后调用
File.Delete(tempFilePath)删除文件,未关闭Excel时删除会触发文件占用报错。 - 提前确认文件属性中的「生成操作」已设置为「嵌入的资源」,否则无法通过
GetManifestResourceStream读取到对应流。
内容的提问来源于stack exchange,提问作者Splexxer
相关产品推荐
相关产品推荐

