2012-08-12 56 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

相關問題