如何使用OpenXML C#在Excel中隐藏一个工作表?

8
我有一个Excel模板,其中包含各种工作表,我正在使用OpenXML和C#从SQL Server检索数据并将其转储到这些工作表中。在完成数据转储后,根据条件需要隐藏一些工作表。我找不到任何使用C# OpenXML隐藏特定工作表的代码片段。
我尝试了以下方法,但是这些工作表没有被隐藏。
byte[] byteArray = File.ReadAllBytes("D:\\rptTemplate.xlsx");
using (MemoryStream mem = new MemoryStream())
{
mem.Write(byteArray, 0, (int)byteArray.Length);
using (SpreadsheetDocument rptTemplate = SpreadsheetDocument.Open(mem, true))
{
    foreach (OpenXmlElement oxe in (rptTemplate.WorkbookPart.Workbook.Sheets).ChildElements)
    {
     if(((DocumentFormat.OpenXml.Spreadsheet.Sheet)(oxe)).Name == "ABC")
        ((DocumentFormat.OpenXml.Spreadsheet.Sheet)(oxe)).State = SheetStateValues.Hidden;
    }
    rptTemplate.WorkbookPart.Workbook.Save();
}
}

请在此请求帮助。

谢谢。

2个回答

13

你需要设置 WorkbookView 类的 ActiveTab 属性为一个与你想要隐藏的工作表不同的索引。

例如,如果你想要隐藏第一个工作表(索引为0),那么将 ActiveTab 属性设置为下一个可见工作表的索引。

以下是一个基于你提供的代码的示例:

static void Main(string[] args)
{
  byte[] byteArray = File.ReadAllBytes("D:\\rptTemplate.xlsx");

  using (MemoryStream mem = new MemoryStream())
  {
    mem.Write(byteArray, 0, (int)byteArray.Length);

    using (SpreadsheetDocument rptTemplate = SpreadsheetDocument.Open(mem, true))
    {
      foreach (OpenXmlElement oxe in (rptTemplate.WorkbookPart.Workbook.Sheets).ChildElements)
      {
        if(((DocumentFormat.OpenXml.Spreadsheet.Sheet)(oxe)).Name == "ABC")
        {
          ((DocumentFormat.OpenXml.Spreadsheet.Sheet)(oxe)).State = SheetStateValues.Hidden;

           WorkbookView wv = rptTemplate.WorkbookPart.Workbook.BookViews.ChildElements.First<WorkbookView>();

           if (wv != null)
           {
             wv.ActiveTab = GetIndexOfFirstVisibleSheet(rptTemplate.WorkbookPart.Workbook.Sheets);
           }                       
         }
      }
      rptTemplate.WorkbookPart.Workbook.Save();
    }
  }
}

private static uint GetIndexOfFirstVisibleSheet(Sheets sheets)
{
  uint index = 0;
  foreach (Sheet currentSheet in sheets.Descendants<Sheet>())
  {
    if (currentSheet.State == null || currentSheet.State.Value == SheetStateValues.Visible)
    {
      return index;
    }
    index++;
  }
  throw new Exception("No visible sheet found.");
}

1
我尝试了相同的代码,逐行调试,一切都很好。但是在执行代码后,当我打开Excel文件时,工作表没有隐藏。你能帮我吗? - Narendra Kumar
@Hans 文档包括5个工作表,名称类似于“优先级”,“任务状态”等。该文档对所有用户具有“完全控制”权限。 - Narendra Kumar
1
@NarendraKumar:在我的代码中,你改变了表格的名称吗? - Hans
@Hans 是的,我已经在代码中更改了工作表名称。我已经通过调试,确认Excel文件可读,并且可以在if条件语句中看到工作表名称,并设置了隐藏属性并保存文档。但是它没有在文档中反映出来。 - Narendra Kumar
@NarendraKumar:你能提供一份没有机密数据的简化版本文档吗?这样我就可以看一下了。 - Hans
显示剩余2条评论

0
隐藏工作表可以将“State”属性应用到所有的工作表上。默认情况下,工作表的“State”属性为空。接下来是我所做的更改,它隐藏了Sheet2。
  Sheet sheet1 = new Sheet() { Name = "Sheet1", State = SheetStateValues.Visible, SheetId = (UInt32Value)1U, Id = "rId1" };
  Sheet sheet2 = new Sheet() { Name = "Sheet2", State = SheetStateValues.Hidden, SheetId = (UInt32Value)2U, Id = "rId2" };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接