ClosedXML を使用して、データ テーブル オブジェクトを Excel スプレッドシートに変換し、ユーザーに表示します。DataTable オブジェクトは、すべての db 値 (NHibernate から) を文字列に割り当ててから、以下のようにフォーマットするだけで構築されます。
//formatting
EstimatedCost = Currency.SafeToString(Currency.Create(n.EstimatedCost)),
次に、列の型をプロパティの型、つまりすべての場合で String に設定します。
列が通貨に設定されているが、数値がテキスト警告として含まれているため、出力 Excel シートで何が起こるか、正しく並べ替えられません。
私の問題は、すべてのデータを DataTable に組み込むため、ClosedXML 列を正しく装飾する機会がないことです。私が考えていないこれを行う簡単な方法はありますか?
public const string ExcelDataType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml";
public static MemoryStream GenerateExcelFileFromData(IEnumerable<KeyValuePair<string, DataTable>> tabs, int colWidth = 100)
{
var workbook = new XLWorkbook { ColumnWidth = colWidth };
foreach (var enumerable in tabs)
{
workbook.Worksheets.Add(enumerable.Value, enumerable.Key);
}
...
public static DataTable ConvertToDataTable<T>(IEnumerable<T> varlist, List<string> excludedColumns, bool titleizeColumn = false)
{
var dtReturn = new DataTable();
// column names
PropertyInfo[] oProps = null;
if (varlist == null) return dtReturn;
foreach (T rec in varlist)
{
// Use reflection to get property names, to create table, Only first time, others will follow
if (oProps == null)
{
oProps = rec.GetType().GetProperties();
foreach (PropertyInfo pi in oProps)
{
if (excludedColumns.Contains(pi.Name))
{
continue;
}
var colType = pi.PropertyType;
dtReturn.Columns.Add(new DataColumn(GetColumnName(pi, titleizeColumn), colType));
}
}
DataRow dr = dtReturn.NewRow();
foreach (var pi in oProps.Where(pi => !excludedColumns.Contains(pi.Name)))
{
try
{
dr[GetColumnName(pi, titleizeColumn)] = pi.GetValue(rec, null) ?? DBNull.Value;
}
catch (ArgumentException)
{
dr[GetColumnName(pi, titleizeColumn)] = DBNull.Value;
}
}
dtReturn.Rows.Add(dr);
}
return dtReturn;