我必须在我的应用程序中填写一个 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,
...
...
...
}
}
然后,像这样从 C# 生成
File.WriteAllBytes(ReviewTemplate.name + DateTime.Now.ToString("_dd_MM_yyyy_HH_mm_ss") + ".xls", ReviewTemplate.rawData);
除了所有数组文件 (*.cs) 都有 15MB 并且当我双击 C# 中的任何函数名称进行重构或其他操作时,.NET 会挂起几分钟。
所以最大的问题是,我怎样才能以某种方式预编译这个 array.cs 文件,以便 .NET 按原样使用?也许把所有的都放在一些dll中?在 C 中,我使用 *.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 );
关于c# 预编译大数组或其他解决方案以将大数据嵌入可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43616791/