如何在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;