我必须在我的应用程序中填写一个 excel 文件,打开、写入和关闭。
问题是文件包含很多格式和宏(是公司模板),我意识到从 C# 重新生成将非常困难,最重要的是,要维护。
所以我用十六进制编辑器打开了excel模板,将所有字节作为数组
namespace myapp
{
public static class ReviewTemplate // exported with HXD
{
public static string name = "AS-04522-EN";
public static byte[] rawData = {
0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3E, 0x00, 0x03, 0x00, 0xFE, 0xFF, 0x09, 0x00, 0x06, 0x00, 0x00, 0x00,
...
...
...
}
}
Run Code Online (Sandbox Code Playgroud)
然后,像这样从 C# 生成
File.WriteAllBytes(ReviewTemplate.name + DateTime.Now.ToString("_dd_MM_yyyy_HH_mm_ss") + ".xls", ReviewTemplate.rawData);
Run Code Online (Sandbox Code Playgroud)
除了所有数组文件 (*.cs) 都有 15MB 外,它工作得很好,当我双击 C# 中的任何函数名称进行重构或其他操作时,.NET 会挂起几分钟。
所以最大的问题是,我如何以某种方式预编译这个 array.cs 文件,以便 .NET 使用它?也许把所有的都放在某个 dll 中?在 CI 中使用 *.obj 文件。
已编辑
更清楚的是,在生成所需的 excel(无论如何都有 2.5MB)后,我使用互操作打开、写入然后关闭。
是否可以嵌入所有这些数据并以某种方式写入内存,然后最终保存为磁盘上的 excel 文件?
谢谢,
如果您希望模板在您的 .exe/dll 中,请将 .xls 添加到您的 C# 项目中,右键单击,属性,将构建操作设置为“嵌入式资源”。
当您需要填充它时,调用Assembly.GetManifestResourceStream以打开该嵌入资源的流,然后使用CopyTo而不是 WriteAllBytes。
更新:示例(未经测试)
Stream source = Assembly.GetExecutingAssembly().GetManifestResourceStream( ... );
string destName = "AS-04522-EN" + DateTime.Now.ToString("_dd_MM_yyyy_HH_mm_ss") + ".xls";
using( Stream dest = File.Create( destName ) )
source.CopyTo( dest );
Run Code Online (Sandbox Code Playgroud)