2012-08-12 7 views
5

Ich habe eine Excel-Vorlage mit verschiedenen Blättern, auf denen ich Daten aus SQL Server mit OpenXML, C# abladen. Nachdem ich mit dem Dumping der Daten fertig bin, muss ich einige der Blätter basierend auf den Bedingungen ausblenden. Ich konnte keinen Code finden, um ein bestimmtes Blatt mit C# OpenXML auszublenden.Wie blende ich ein Blatt in Excel mit OpenXML C#?

Ich versuchte folgendes, aber die Blätter wurden nicht versteckt.

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

Hilfe anfordern.

Danke.

Antwort

8

Sie haben die ActiveTab Eigenschaft der WorkbookView Klasse auf einen Index zu setzen, die aus dem Index des Arbeitsblatt unterscheidet Sie verstecken möchten. Wenn Sie also das erste Arbeitsblatt (Arbeitsblatt mit Index 0) in Ihrer Excel-Datei ausblenden möchten, legen Sie die Eigenschaft ActiveTab auf den nächsten sichtbaren Arbeitsblattindex fest.

Hier ist eine kleine Codebeispiel (basierend auf dem Code, den Sie zur Verfügung gestellt):

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

Vielen Dank. Das hat funktioniert. :-) – Raghu

+1

Ich habe den gleichen Code versucht, durch Debugging jeder Zeile gegangen, alles funktioniert gut. Aber nach der Ausführung des Codes. Wenn ich das Excel-Dateiblatt öffne, habe ich nicht versteckt. Kannst du mir helfen? –

+0

@NarendraKumar: Es ist sehr schwierig zu helfen, ohne die genaue Struktur Ihres Excel-Dokuments und die Namen Ihrer Excel-Tabellen zu kennen. Wie viele Blätter hast du? – Hans

Verwandte Themen