[Open XML] From IEnumerable<T> to Spreadsheet document
If you want to dump an IEnumerable<T> instance into an Excel spreadsheet document (using the latest Open XML SDK v2 CTP), here’s the code (also available in the zip in attachment) :
static class OpenXMLExtensions
{
public static void ToSpreadsheetML<T>(this IEnumerable<T> items, String path) where T : class
{
ToSpreadsheetML<T>(items, new FileStream(path, FileMode.OpenOrCreate));
}
public static void ToSpreadsheetML<T>(this IEnumerable<T> items, Stream stream) where T : class
{
List<String> headers = (from PropertyInfo p in typeof(T).GetProperties() select p.Name).ToList<String>();
List<List<String>> values = new List<List<String>>(items.Count());
foreach (T item in items)
{
List<String> valCols = new List<string>();
object obj = null;
foreach (PropertyInfo property in typeof(T).GetProperties())
{
obj = property.GetValue(item, null);
if (obj == null)
valCols.Add("");
else
valCols.Add(obj.ToString());
}
values.Add(valCols);
}
using (SpreadsheetDocument package =
SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook))
{
package.PackageProperties.Creator = "Julien Chable - Wygwam (www.wygwam.com)";
var workbookPart = package.AddWorkbookPart();
GenerateWorkbookPart().Save(workbookPart);
var worksheetPart = workbookPart.AddNewPart<WorksheetPart>("rId1");
GenerateWorksheetPart(headers, values).Save(worksheetPart);
}
}
#region Private methods
private static Workbook GenerateWorkbookPart()
{
var element =
new Workbook(
new BookViews(
new WorkbookView() { XWindow = 120, YWindow = 150, WindowWidth = (UInt32Value)19095U, WindowHeight = (UInt32Value)8415U }),
new Sheets(
new Sheet() { Name = "IEnumerableDemo", SheetId = (UInt32Value)1U, Id = "rId1" }));
return element;
}
private static Worksheet GenerateWorksheetPart(List<String> headers, List<List<String>> values)
{
var element =
new Worksheet(
new SheetViews(
new SheetView() { TabSelected = true, WorkbookViewId = (UInt32Value)0U }),
new SheetFormatProperties() { DefaultRowHeight = 15D },
PopulateData(headers, values));
return element;
}
private static SheetData PopulateData(List<String> headers, List<List<String>> values)
{
Row headerRow = new Row();
SheetData data = new SheetData(headerRow);
foreach (String h in headers)
headerRow.Append(new Cell(new CellValue(h)) { DataType = CellValues.String });
foreach (List<String> vals in values)
{
Row valsRow = new Row();
foreach (String val in vals)
valsRow.Append(new Cell(new CellValue(val)) { DataType = CellValues.String });
data.AppendChild(valsRow);
}
return data;
}
#endregion
}
The previous code add each object property with its value convert into a string (with ToString()) and then use the new Open XML SDK v2 to generate a document from scratch.
Here’s the example with a List<Person>:
List<Person> people = new List<Person>();
people.Add(new Person() { Name = "Julien",
Blog = "http://blogs.developpeur.org/neodante/" });
people.Add(new Person() { Name = "Aurélien",
Blog = "http://blogs.developpeur.org/aurelien/" });
people.ToSpreadsheetML("demo.xlsx");
Enjoy (thanks to Aurélien to have Linquify the code a bit)
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :