2012-02-02 2 views
8

J'ajoute plusieurs feuilles à un classeur Excel. Je veux avoir une rangée sur une feuille et l'autre rangée sur l'autre feuille. Ce code place les deux lignes sur les deux feuilles. Des idées pour résoudre le problème?OpenXML Multiple Sheets

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

Répondre

0

Il semble que vous quittez certains code ici, mais je pense que vous devriez Concaténer les feuilles, pas les autres (les valeurs ne sont pas dans ce code)

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

Quelque chose comme cela semble plus approprié.

Cela semble être la raison pour laquelle les deux pages sont effectuées.

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

Vous avez besoin soit de faire un autre sheetData (pas créé dans ce bloc de code) pour envoyer à l'autre feuille de calcul, ou d'essayer une méthode comme je l'ai mentionné ci-dessus.

+0

J'ai essayé d'ajouter les lignes à la feuille, mais cela me donne une erreur. J'ai également essayé d'utiliser plusieurs sheetData mais je n'arrive pas à comprendre comment les connecter à des feuilles individuelles. – Reed

+0

Eh bien, vous avez laissé ces choses hors de ce bloc de code. Nous aurons besoin de plus de code pour aider. – Corylulu

+0

C'est tout le code que j'ai. J'ai essayé votre suggestion, mais cela ne semble pas possible. Et je ne sais pas ce que je fais avec les multiples sheetData. Voilà pourquoi je suis venu à vous les gars. – Reed

25

Pour chaque feuille Excel (qui contient des données séparées)

  • un objet WorkSheetPart séparé est nécessaire
  • un objet WorkSheet séparé est nécessaire
  • un objet SheetData séparé est nécessaire
  • un Sheet séparé objet est nécessaire

Il ressemblerait à ceci:

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

Je ne sais pas pourquoi il doit être si compliqué. Je viens de le trouver en parcourant quelques articles de blog et de forum aléatoires et beaucoup d'essais et d'erreurs.

+0

Solution très élégante et beaucoup plus facile à utiliser que d'autres solutions. Juste une note, quiconque cherche le code à CreateTextCell peut le trouver ici: https://msdn.microsoft.com/en-us/library/dd452407(v=office.12).aspx#code-snippet-5 –

1

J'espère que mon code ci-dessous peut vous aider.

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++; 
      }         
     } 
    } 

Faites-moi savoir si vous avez des problèmes.