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