2012-08-12 125 views
5

我有一个Excel模板与各种表格,我倾销从SQL Server使用OpenXML,C#检索数据。 在完成数据转储后,我需要根据条件隐藏一些表单。我找不到任何代码来隐藏使用C#OpenXML的特定工作表。如何使用OpenXML C#在Excel中隐藏工作表?

我试过以下,但工作表没有隐藏起来。在这个

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(); 
} 
} 

请求帮助。

谢谢。

回答

8

你必须 的WorkbookView类的ActiveTab属性设置为这是从你 想隐藏工作表的索引不同的索引。

因此,例如,如果您想在Excel文件中隐藏第一张工作表(索引为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."); 
} 
+0

非常感谢。这工作。 :-) – Raghu 2012-08-16 14:11:50

+1

我试了相同的代码,通过调试每一行,一切都很好。但执行代码后。当我打开Excel文件表没有隐藏。你可以帮我吗? – 2015-12-11 07:27:48

+0

@NarendraKumar:如果不知道你的excel文档的确切结构和excel表格的名字,很难提供帮助。你有几张床单? – Hans 2015-12-11 07:50:44

相关问题