NPOI中出现“是否要恢复此工作薄的内容?如果信任此工作薄的来源。。。”的问题的解决方法

        把几个ASP.NET中制作Excel报表用NPOI改写后(原来用COM方式),立即有人反映,打开下载的Excel报表时,有提示“是否要恢复此工作薄的内容?如果信任此工作薄的来源,请单击“是”。。。“的信息,如果选“是”则打印时第二页开始没有(重复的)标题行。

        仔细检查发现,俺用Excel2000制作的报表模板文件,使用NPOI中RemoveSheetAt()函数删除表单后,在Excel2000下打开与预览没有问题,但在Excel2003/Excel2010/WPS中打开就有上述提示,并且页面设置->工作表->打印区域->顶端标题行中$1:$6的内容丢失,从而造成打印的第二页没有标题行。

        经过多次测试后发现,隐藏表单即可达到类似删除的目的,NPOI中的代码如下:

        workBook.SetSheetHidden(k, SheetState.VeryHidden);  // workBook 为 HSSFWorkbook 对象

        还需要特别注意的是,仍然需要设置一个可显示的表单,俺的解决方法是:设置第一个非隐藏的表单为可视的、选择的,NPOI的代码如下:

            for (int k = 0; k < workBook.NumberOfSheets - 1; k++)
            {
                if (workBook.IsSheetVeryHidden(k) == false)
                {
                    HSSFSheet st = (HSSFSheet)workBook.GetSheetAt(k);
                    workBook.SetSheetOrder(st.SheetName, 0);  // 调整到第一个
                    workBook.FirstVisibleTab = 0;
                    WorkBook.SetSelectedTab(0);
                      break;
                }
            }

      上述方法和代码在XP/Win7、Office2000/2003/2010和NPOI2.0.5.0下测试通过。

       后记:

  • RemoveSheet()等方法只造成该文件打开时给出提示信息,丢失标题行重复(Sheet的RepeatingRows属性对象)的根本原因是,NPOI使用表单序号位置确定该表单的标题重复行信息,使用RemoveSheet()或SetSheetOrder()等函数时,将导致表单重复行信息改变。
  • 同样,WookBook.CloneSheet()方法只拷贝表单结构,不复制表单标题重复行。



你可能感兴趣的:(NPOI中出现“是否要恢复此工作薄的内容?如果信任此工作薄的来源。。。”的问题的解决方法)