如何在ClosedXML中将货币格式化为数字
我们使用ClosedXML将数据对象转换为Excel电子表格,以便呈现给用户。 DataTable对象是通过将所有的db值(从NHibernate)分配给string来构build的,然后像下面那样格式化它们:
//formatting EstimatedCost = Currency.SafeToString(Currency.Create(n.EstimatedCost)),
然后我们将列types设置为属性types,即所有情况下的string。
在输出的Excel工作表中会发生什么情况,因为该列是为货币设置的,但是具有作为文本警告的编号,则无法正确sorting。
我的问题是,因为我们将所有的数据构build到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;
你可以这样格式化你的货币值:
worksheet.Cell(rowIndex, columnIndex).Style.NumberFormat.Format = "$0.00"; worksheet.Cell(rowIndex, columnIndex).DataType = XLCellValues.Number;