NPOI不会在副本上保留宏

时间:2017-06-30 07:30:10

标签: c# excel-vba npoi vba excel

我知道使用NPOI创建新的宏是不可能的,但根据该文档,已经存在的宏应该保留在副本上:

  

无法创建宏。目前没有计划支持宏。但是,读取和重写包含宏的文件将安全地保留宏。最新版本的Apache POI支持通过VBAMacroExtractor和VBAMacroReader提取宏数据

但是,当我尝试使用NPOI复制xlsm文件时,遇到了以下问题:

  • 在我的xlsm文件中,我有一个带有名为“CopyDetails_Click”的onclick函数的按钮。
  • 当我复制该文件时,新文件中的所有其他宏仍然按预期工作,但在我的按钮的宏注册菜单中,onclick功能的名称将更改为一个看似随机的值,例如“Button1_Click”。
  • 因此,按钮不再起作用,我必须手动将onclick函数名称更改回“CopyDetails_Click”。这似乎是我唯一的问题,所有其他宏功能都按预期工作。

这是Apache POI的错误还是NPOI的错误,如何在复制xlsm文件时保留正确的onclick函数名称?

我正在使用.Net Framework 4.6.2,NPOI 2.3.0并尝试复制Excel 2013文件。

更新1 :我发现只有直接放在工作表上的按钮才会受到此错误的影响。如果我将我的按钮放在一个表单中,那么它的宏名称将在复制后保留,并且它们将按预期工作。

1 个答案:

答案 0 :(得分:0)

请根据我的方法尝试。我不确定它是否适合你。根据我的要求,我已经阅读了.xltm(xlsx模板)文件,并在操作后将其写回.xltm文件。

try
{
    Response.Clear();    
    Response.ContentType = "application/vnd.ms-excel.template.macroEnabled.12";
    Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", @"Excel_Template_" + DateTime.Now.ToString("yyyy-dd-M-HH-mm") + ".xltm"));

    Response.BinaryWrite(System.IO.File.ReadAllBytes(HostingEnvironment.MapPath("~/Template/manipulated_Excel_Template.xltm")));
    Response.End();
}
catch (Exception Ex)
{
    ...
}

对于不同类型的文件格式/扩展程序,您可以找到MS here支持的各种MIME类型。