2017-10-13 4 views
1

Je suis nouveau pour le programme DocumentFormat.J'ai effectué une recherche sur le Web et trouvé l'exemple pour exporter un ensemble de données à Excel en utilisant OpenXML. Après le code, le fichier Excel est généré. Cependant, lorsque le fichier est ouvert, il y a un problème que l'Excel a indiqué "un problème avec certains contenus dans le rapport. Voulez-vous que nous essayions de récupérer autant que possible?" Lorsque l'utilisateur cliquait sur oui, les données c'est bien. J'ai cherché sur le site Web et ressembler au type de colonne de chaîne en utilisant InlineString est ok. Ai-je tort? Je n'ai aucune idée quel code cause le problème. Est-ce que quelqu'un pourrait me le dire? Merci d'avance.Le fichier Excel est créé à l'aide de DocumentFormat.OpenXML mais doit être réparé lors de l'ouverture d'Excel

Il y a le code que je trouve dans le web:

namespace ExcelObject 
{ 
public class ExcelStream 
{ 
    SpreadsheetDocument document = null; 

    public MemoryStream GetExcelStream(DataSet dataset) 
    { 
     DataSet ds = dataset; 
     using (var ms = new MemoryStream()) 
     { 
      //Create workbook in memory 
      document = SpreadsheetDocument.Create(ms, SpreadsheetDocumentType.Workbook); 

      //Add workbook 
      var workbookpart = document.AddWorkbookPart(); 
      workbookpart.Workbook = new Workbook(); 

      //add worksheet to wrokbook 
      var worksheet = workbookpart.AddNewPart<WorksheetPart>(); 
      worksheet.Worksheet = new Worksheet(new SheetData()); 


      var sheets = document.WorkbookPart.Workbook.AppendChild(new Sheets()); 
      //Add a new worksheet and associte it with the workbook. 
      var mainSheet = new Sheet() 
      { 
       Id = document.WorkbookPart.GetIdOfPart(worksheet), 
       SheetId = 1, 
       Name = "TestReport" 
      }; 

      sheets.Append(mainSheet); 

      uint rowIndex = 0; 

      //Get sheet data 
      var sheetData = worksheet.Worksheet.GetFirstChild<SheetData>(); 
      var row = new Row { RowIndex = ++rowIndex }; 
      AddColumnHeaderRow(ds, row, sheetData); 
      AddDataRows(ds, rowIndex, sheetData); 
      workbookpart.Workbook.Save(); 
      document.Close(); 
      return ms; 


     } 
    } 

    private static void AddColumnHeaderRow(DataSet ds, Row row, SheetData sheetData) 
    { 
     for (var i = 0; i < ds.Tables[0].Columns.Count; i++) 
     { 
      var cell = new Cell { DataType = CellValues.InlineString, StyleIndex = 1 }; 
      var inlineCell = new InlineString(); 
      var cellText = new Text { Text = ds.Tables[0].Columns[i].ColumnName }; 
      inlineCell.AppendChild<Text>(cellText); 
      cell.AppendChild<InlineString>(inlineCell); 
      row.AppendChild<Cell>(cell); 

     } 
     sheetData.AppendChild(row); 

    } 

    private static void AddDataRows(DataSet ds, uint rowIndex, SheetData sheetData) 
    { 
     for (var r = 0; r < ds.Tables[0].Rows.Count; r++) 
     { 
      var row = new Row { RowIndex = ++rowIndex }; 
      for (var c = 0; c < ds.Tables[0].Columns.Count; c++) 
      { 

       var cell = new Cell { DataType = CellValues.InlineString }; 
       var istring = new InlineString(); 
       var t = new Text 
       { 
        Text = ds.Tables[0].Rows[r][c].ToString() 

       }; 
       istring.AppendChild<Text>(t); 
       cell.AppendChild<InlineString>(istring); 
       row.AppendChild(cell); 
      } 
      //append each data row to sheet data 
      sheetData.AppendChild<Row>(row); 
     } 
    } 
} 
} 

Il est mon code pour générer la table et obtenir le résultat:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    Dim dt As New DataTable("Test")  
    dt.Columns.Add("Code", GetType(String)) 
    dt.Columns.Add("Price", GetType(String)) 

    Dim dr As DataRow = dt.NewRow() 
    dr("Code") = "ABC" 
    dr("Price") = "12" 

    dt.Rows.Add(dr) 

    Dim dr1 As DataRow = dt.NewRow() 
    dr1("Code") = "DEF" 
    dr1("Price") = "1" 

    dt.Rows.Add(dr1) 
    Dim ds As New DataSet 
    ds.Tables.Add(dt) 

    Dim t As ExcelStreamObject.ExcelStream = New ExcelStreamObject.ExcelStream 
    Dim ms As MemoryStream = t.GetExcelStream(ds) 

    Response.Clear() 
    Response.ClearContent() 
    Response.ClearHeaders() 
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 
    Response.AppendHeader("Content-Disposition", "attachment; filename=TestReport.xlsx") 
    Response.BinaryWrite(ms.ToArray()) 
    Response.Flush() 
    Response.Close() 
    Response.End() 

End Sub 

Répondre

0

J'ai trouvé ce qui est faux de mon code. Le AddColumnHeaderRow ayant un style que je n'avais pas. J'ai donc changé le "var cell = new Cell {DataType = CellValues.InlineString, StyleIndex = 1};" être "var cell = new Cell {DataType = CellValues.InlineString};" Le message d'erreur ne s'affiche pas lors de l'ouverture du fichier.