Le moyen le plus efficace pour l'exportation DataTable Fichier Excel (.xlsx)
Je voulais savoir quel est le moyen le plus efficace pour exporter une Table ou les données d'un .fichier xlsx en termes de vitesse.
J'ai tables de 200K lignes et la boucle est inutile, donc je veux faire comme une exportation en vrac ou quelque chose comme ça.
Quelque chose de facile à mettre en œuvre répondre à ma question?
SOLUTION:
J'ai finalement utilisé OpenXml de cette manière, si quelqu'un en a besoin. Il exportations de 100k en 1 minute environ:
private void ExportDataSet(DataSet ds, string destination)
{
using (var workbook = SpreadsheetDocument.Create(destination, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook))
{
var workbookPart = workbook.AddWorkbookPart();
workbook.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook();
workbook.WorkbookPart.Workbook.Sheets = new DocumentFormat.OpenXml.Spreadsheet.Sheets();
foreach (System.Data.DataTable table in ds.Tables)
{
var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>();
var sheetData = new DocumentFormat.OpenXml.Spreadsheet.SheetData();
sheetPart.Worksheet = new DocumentFormat.OpenXml.Spreadsheet.Worksheet(sheetData);
DocumentFormat.OpenXml.Spreadsheet.Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>();
string relationshipId = workbook.WorkbookPart.GetIdOfPart(sheetPart);
uint sheetId = 1;
if (sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Count() > 0)
{
sheetId =
sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Select(s => s.SheetId.Value).Max() + 1;
}
DocumentFormat.OpenXml.Spreadsheet.Sheet sheet = new DocumentFormat.OpenXml.Spreadsheet.Sheet() { Id = relationshipId, SheetId = sheetId, Name = table.TableName };
sheets.Append(sheet);
DocumentFormat.OpenXml.Spreadsheet.Row headerRow = new DocumentFormat.OpenXml.Spreadsheet.Row();
List<String> columns = new List<string>();
foreach (System.Data.DataColumn column in table.Columns)
{
columns.Add(column.ColumnName);
DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(column.ColumnName);
headerRow.AppendChild(cell);
}
sheetData.AppendChild(headerRow);
foreach (System.Data.DataRow dsrow in table.Rows)
{
DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row();
foreach (String col in columns)
{
DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(dsrow[col].ToString()); //
newRow.AppendChild(cell);
}
sheetData.AppendChild(newRow);
}
}
}
}
- 200k lignes n'est pas que mauvais.. on dirait que vous avez supposé qu'il sera lente.
- Je veux juste savoir la méthode, pas les lignes, je sais comment le programme, mais il pourrait être plus facile de savoir de quelle manière à se concentrer. J'ai entendu parler d'OleDb, ADODB, en boucle, mais je veux juste savoir qui est le plus rapide
- L'exportation de 1k lignes avec 72 champs, en boucle, c'est très lente, environ 1 min qu'il faut dans mon pc, ce qui est assez rapide. J'ai entendu parler d'exportation en vrac de méthodes.
- je vous conseille de lire msdn.microsoft.com/en-us/library/aa338205(v=office.12).aspx
Vous devez vous connecter pour publier un commentaire.
Vous devez être en parcourant les dossiers, et c'est pourquoi il est si lent.
Essayer quelque chose comme cela.
Ou, tournez la Table de données dans un fichier Excel.
Personnellement, je préfère Syncfusion Excel de la bibliothèque juste parce que c'est assez intuitif, bien documenté et gratuit avec la communauté de licence.
Vous pouvez le télécharger ici: XlsIO Page Du Produit
Et de la documentation peut être trouvée ici: XlsIO Documentation
Il est libre d'utiliser si vous réclamez de la communauté libre de licence.
Voici un exemple de code pour écrire un DataTable à un fichier xlsx. Je ne pense pas que la taille de votre table doit être un problème du tout, mais je ne suis pas sûr à 100%, le plus grand des fichiers que j'ai écrit avec cette bibliothèque ont environ 90k lignes avec 60 colonnes et je n'ai pas de problèmes.