我必须在我的应用中填写一个excel文件,打开,写入和关闭。
问题是该文件包含大量格式和宏(是公司模板),我意识到从C#重新生成将非常困难,最重要的是要维护。
所以我用hexeditor打开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文件。
EDITED
更清楚一点,在我生成所需的excel(无论如何有2.5MB)后,我使用interop打开,然后写入然后关闭。
是否可以嵌入所有这些数据并以某种方式写入内存,然后最终保存为磁盘上的excel文件?
谢谢,
答案 0 :(得分:4)
如果您希望模板位于.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 );