2012-02-02 24 views
8

Estoy agregando varias hojas a un libro de Excel. Quiero tener una fila en una hoja y la otra fila en la otra hoja. Este código coloca ambas filas en ambas hojas. ¿Alguna idea sobre cómo solucionar este problema?Múltiples hojas de OpenXML

 SpreadsheetDocument ssDoc = SpreadsheetDocument.Create(saveFile, SpreadsheetDocumentType.Workbook); 

     // Add a WorkbookPart to the document 
     WorkbookPart workbookPart = ssDoc.AddWorkbookPart(); 
     workbookPart.Workbook = new Workbook(); 
     // Add a WorksheetPart to theWorkbookPart 
     WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>(); 
     worksheetPart.Worksheet = new Worksheet(new SheetData()); 

     Sheets sheets = ssDoc.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets()); 

     Sheet sheet1 = new Sheet() 
     { Id = ssDoc.WorkbookPart.GetIdOfPart(worksheetPart), 
      SheetId = 1, Name = "Sheet1" 
     }; 

     Sheet sheet2 = new Sheet() 
     { 
      Id = ssDoc.WorkbookPart.GetIdOfPart(worksheetPart), 
      SheetId = 2, Name = "Sheet2" 
     }; 

     sheets.Append(sheet1); 
     sheets.Append(sheet2); 
     Worksheet worksheet = new Worksheet(); 
     SheetData sheetData = new SheetData(); 

     Row headerRow = new Row(); 
     Cell emptyCell = CreateTextCell(cellHeader, index, ""); 
     headerRow.Append(emptyCell); 

     Row newRow = new Row(); 
     Cell mycell = CreateTextCell(cellHeader, index, "data"); 
     newRow.Append(mycell); 

     sheetData.Append(headerRow); 
     sheetData.Append(newRow); 

     worksheet.Append(sheetData);    
     worksheetPart.Worksheet = worksheet; 

     ssDoc.Close(); 

Respuesta

0

Parece que está saliendo de algunos código aquí, pero creo que debería estar realizando adiciones de las sábanas, no los otros (valores que no están en el código)

sheet1.Append(headerRow); 
sheet2.Append(newRow); 

Algo como esto parece más apropiado.

Parece que esta es la razón por la cual se están efectuando ambas páginas.

worksheet.Append(sheetData);    
worksheetPart.Worksheet = worksheet; 

o hay que hacer hacer otra sheetData (no se ha creado en este bloque de código) para enviar a la otra hoja de cálculo o probar un método, como he mencionado anteriormente.

+0

Traté de agregar las filas a la hoja, pero esto me está dando un error. También he intentado usar múltiples sheetData pero no puedo encontrar la manera de conectarlos a hojas individuales. – Reed

+0

Bueno, dejaste eso fuera de este bloque de código. Necesitaremos más código para ayudar. – Corylulu

+0

Este es todo el código que tengo. Intenté tu sugerencia, pero eso no parece posible. Y no sé lo que estoy haciendo con los múltiples sheetData. Es por eso que vine a ustedes chicos. – Reed

25

Para cada hoja de Excel (que tiene datos separadas)

  • se necesita un WorkSheetPart objeto separado
  • se necesita un WorkSheet objeto separado
  • se necesita un SheetData objeto separado
  • una separada Sheet el objeto es necesario

Se vería así:

SpreadsheetDocument ssDoc = SpreadsheetDocument.Create(saveFile, 
    SpreadsheetDocumentType.Workbook); 

WorkbookPart workbookPart = ssDoc.AddWorkbookPart(); 
workbookPart.Workbook = new Workbook(); 

Sheets sheets = ssDoc.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets()); 

// Begin: Code block for Excel sheet 1 
WorksheetPart worksheetPart1 = workbookPart.AddNewPart<WorksheetPart>(); 
Worksheet workSheet1 = new WorkSheet(); 
SheetData sheetData1 = new SheetData(); 

// the data for sheet 1 
Row rowInSheet1 = new Row(); 
Cell emptyCell = CreateTextCell(cellHeader, index, ""); 
rowInSheet1.Append(emptyCell); 

sheetData1.Append(rowInSheet1); 

worksheet1.AppendChild(sheetData1); 
worksheetPart1.Worksheet = workSheet1; 

Sheet sheet1 = new Sheet() 
{ 
    Id = ssDoc.WorkbookPart.GetIdOfPart(worksheetPart1), 
    SheetId = 1, 
    Name = "Sheet1" 
}; 
sheets.Append(sheet1); 
// End: Code block for Excel sheet 1 

// Begin: Code block for Excel sheet 2 
WorksheetPart worksheetPart2 = workbookPart.AddNewPart<WorksheetPart>(); 
Worksheet workSheet2 = new WorkSheet(); 
SheetData sheetData2 = new SheetData(); 

// the data for sheet 2 
Row rowInSheet2 = new Row(); 
Cell mycell = CreateTextCell(cellHeader, index, "data"); 
rowInSheet2.Append(mycell); 

sheetData2.Append(rowInSheet2); 

worksheet2.AppendChild(sheetData2); 
worksheetPart2.Worksheet = workSheet2; 

Sheet sheet2 = new Sheet() 
{ 
    Id = ssDoc.WorkbookPart.GetIdOfPart(worksheetPart2), 
    SheetId = 2, 
    Name = "Sheet2" 
}; 
sheets.Append(sheet2); 
// End: Code block for Excel sheet 2 

ssDoc.Close(); 

No sé por qué tiene que ser tan complicado. Acabo de encontrarlo hojeando algunas publicaciones aleatorias de blogs y foros y mucho ensayo y error.

+0

Solución muy elegante y mucho más fácil de usar que otras soluciones. Solo una nota, cualquiera que busque el código para CreateTextCell puede encontrarlo aquí: https://msdn.microsoft.com/en-us/library/dd452407(v=office.12).aspx#code-snippet-5 –

1

Espero que mi código a continuación pueda ayudarlo.

private void exportDocument(string FilePath, DataTable sourceTable) 
    { 
     WorkbookPart wBookPart = null; 
     DataSet tableSet = getDataSet(sourceTable);//getDataSet is my local function which is used to split a datatable into some datatable based on limited row I've declared. 
     using (SpreadsheetDocument spreadsheetDoc = SpreadsheetDocument.Create(FilePath, SpreadsheetDocumentType.Workbook)) 
     { 
      wBookPart = spreadsheetDoc.AddWorkbookPart(); 
      wBookPart.Workbook = new Workbook(); 
      uint sheetId = 1; 
      spreadsheetDoc.WorkbookPart.Workbook.Sheets = new Sheets(); 
      Sheets sheets = spreadsheetDoc.WorkbookPart.Workbook.GetFirstChild<Sheets>(); 

      foreach (DataTable table in tableSet.Tables) 
      { 
       WorksheetPart wSheetPart = wBookPart.AddNewPart<WorksheetPart>(); 
       Sheet sheet = new Sheet() { Id = spreadsheetDoc.WorkbookPart.GetIdOfPart(wSheetPart), SheetId = sheetId, Name = "mySheet" + sheetId }; 
       sheets.Append(sheet); 

       SheetData sheetData = new SheetData(); 
       wSheetPart.Worksheet = new Worksheet(sheetData); 

       Row headerRow = new Row(); 
       foreach (DataColumn column in sourceTable.Columns) 
       { 
        Cell cell = new Cell(); 
        cell.DataType = CellValues.String; 
        cell.CellValue = new CellValue(column.ColumnName); 
        headerRow.AppendChild(cell); 
       } 
       sheetData.AppendChild(headerRow); 

       foreach (DataRow dr in table.Rows) 
       { 
        Row row = new Row(); 
        foreach (DataColumn column in table.Columns) 
        { 
         Cell cell = new Cell(); 
         cell.DataType = CellValues.String; 
         cell.CellValue = new CellValue(dr[column].ToString()); 
         row.AppendChild(cell); 
        } 
        sheetData.AppendChild(row); 
       } 
       sheetId++; 
      }         
     } 
    } 

Avísame si tienes algún problema.