如何将 ClosedXML 中的货币格式化为数字
How to format currency in ClosedXML as numeric
我们正在使用 ClosedXML 将数据表对象转换为 Excel spreadsheets 以呈现给用户。 DataTable 对象的构建只需将所有 db 值(来自 NHibernate)分配给字符串,然后将它们格式化如下:
//formatting
EstimatedCost = Currency.SafeToString(Currency.Create(n.EstimatedCost)),
然后我们将列类型设置为 属性 类型,即在所有情况下均为字符串。
输出 Excel sheet 中发生了什么,因为该列设置为货币,但数字作为文本警告,因此无法正确排序。
我的问题是,由于我们将所有数据构建到 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 = "[=10=].00";
worksheet.Cell(rowIndex, columnIndex).DataType = XLCellValues.Number; // Use XLDataType.Number in 2018 and after
ws.Cell(ro, co).Style.NumberFormat.Format = "[$$-en-US] #,##0.00";
ws.Cell(ro, co).DataType = XLDataType.Number;
您可以获得所有您知道是货币的列并设置 NumberFormat.Format。以下是如何完成的示例。美元货币的正确格式是 "[$$-en-US]#,##0.00_);[Red]([$$-en-US]#,##0.00)"
。使用此格式时,如果您在 Excel 中打开电子表格并转到单元格格式,您将看到它设置为货币。
// Assume all columns that have "price" in the heading are currency types and format as currency.
var priceColumns = table.Columns(c => c.FirstCell().Value.ToString().Contains("price", StringComparison.InvariantCultureIgnoreCase));
foreach (var priceColumn in priceColumns)
{
try
{
// Get all the cells in this column, except for the header row
var cells = priceColumn.Cells(2, rowCount);
cells.Style.NumberFormat.Format = @"[$$-en-US]#,##0.00_);[Red]([$$-en-US]#,##0.00)";
}
catch { } // Exception here means not all of the cells have a numeric value.
}
我们正在使用 ClosedXML 将数据表对象转换为 Excel spreadsheets 以呈现给用户。 DataTable 对象的构建只需将所有 db 值(来自 NHibernate)分配给字符串,然后将它们格式化如下:
//formatting
EstimatedCost = Currency.SafeToString(Currency.Create(n.EstimatedCost)),
然后我们将列类型设置为 属性 类型,即在所有情况下均为字符串。
输出 Excel sheet 中发生了什么,因为该列设置为货币,但数字作为文本警告,因此无法正确排序。
我的问题是,由于我们将所有数据构建到 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 = "[=10=].00";
worksheet.Cell(rowIndex, columnIndex).DataType = XLCellValues.Number; // Use XLDataType.Number in 2018 and after
ws.Cell(ro, co).Style.NumberFormat.Format = "[$$-en-US] #,##0.00";
ws.Cell(ro, co).DataType = XLDataType.Number;
您可以获得所有您知道是货币的列并设置 NumberFormat.Format。以下是如何完成的示例。美元货币的正确格式是 "[$$-en-US]#,##0.00_);[Red]([$$-en-US]#,##0.00)"
。使用此格式时,如果您在 Excel 中打开电子表格并转到单元格格式,您将看到它设置为货币。
// Assume all columns that have "price" in the heading are currency types and format as currency.
var priceColumns = table.Columns(c => c.FirstCell().Value.ToString().Contains("price", StringComparison.InvariantCultureIgnoreCase));
foreach (var priceColumn in priceColumns)
{
try
{
// Get all the cells in this column, except for the header row
var cells = priceColumn.Cells(2, rowCount);
cells.Style.NumberFormat.Format = @"[$$-en-US]#,##0.00_);[Red]([$$-en-US]#,##0.00)";
}
catch { } // Exception here means not all of the cells have a numeric value.
}