2012-08-12 25 views
5

Mam szablonu programu Excel z różnych arkuszy, do których jestem dumpingu danych pobranych z SQL Server przy użyciu OpenXML, C#. Po skończeniu zrzucaniem danych, muszę ukryć niektóre arkusze w zależności od warunków. Nie mogłem znaleźć żadnego kawałka kodu, aby ukryć konkretny arkusz za pomocą C# OpenXML.Jak ukryć arkusz w programie Excel przy użyciu języka OpenXML C#?

Próbowałem następujących czynności, ale arkusze nie zostały ukryte.

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

Poproś o pomoc w tej sprawie.

Dzięki.

Odpowiedz

8

Musisz ustawić właściwość klasy WorkbookViewActiveTab do indeksu, który różni się od indeksu arkusza ty chcieliby ukryć.

Na przykład, jeśli chcesz ukryć pierwszy arkusz roboczy (arkusz z indeksem 0) w pliku excel, ustaw właściwość ActiveTab na następny widoczny indeks arkusza roboczego.

Oto mały przykład kodu (na podstawie kodu podany):

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

dzięki. To zadziałało. :-) – Raghu

+1

Próbowałem tego samego kodu, Przeminęło przez debugowanie każdej linii, wszystko działa dobrze. Ale po wykonaniu kodu. Po otwarciu arkusza pliku Excel nie ukrywał. Możesz mi pomóc? –

+0

@NarendraKumar: Bardzo trudno jest uzyskać pomoc, nie znając dokładnej struktury dokumentu Excel i nazw arkuszy programu Excel. Ile masz arkuszy? – Hans