2012-08-12 53 views
5

Tengo una plantilla de Excel con varias hojas a las que estoy descargando datos recuperados de SQL Server usando OpenXML, C#. Después de terminar con los datos, necesito ocultar algunas de las hojas según las condiciones. No pude encontrar ningún fragmento de código para ocultar una hoja en particular usando C# OpenXML.¿Cómo ocultar una hoja en Excel usando OpenXML C#?

Intenté lo siguiente, pero las hojas no se ocultaron.

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

Solicite ayuda sobre esto.

Gracias.

Respuesta

8

usted tiene que establecer la propiedad ActiveTab de la clase WorkbookView a un índice que es diferente del índice de la hoja de trabajo que desea ocultar.

Por lo tanto, por ejemplo, si desea ocultar la primera hoja de cálculo (hoja de cálculo con índice 0) en su archivo Excel, establezca la propiedad ActiveTab en el siguiente índice de hoja de cálculo visible.

Aquí es un pequeño ejemplo de código (basado en el código que ya ha proporcionado):

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

muchas gracias. Esto funcionó. :-) – Raghu

+1

Intenté el mismo código, Pasé por la depuración de cada línea, todo funciona bien. Pero después de la ejecución del código. Cuando abro la hoja de archivo de Excel no se escondió. ¿Me puedes ayudar? –

+0

@NarendraKumar: Es muy difícil ayudar sin conocer la estructura exacta de su documento de Excel y los nombres de sus hojas de Excel. ¿Cuántas hojas tienes? – Hans

Cuestiones relacionadas