使用 c# 数据表将四舍五入到 8 位的十进制值写入 Excel

Writing decimal value with round to 8 places using c# datatable into Excel

提问人:Cloud9 提问时间:11/10/2023 最后编辑:marc_sCloud9 更新时间:11/10/2023 访问量:87

问:

我正在尝试使用 datatable 将四舍五入到 8 位的十进制值写入 C# 中的 Excel。

没有错误,但 Excel 中的输出不显示小数点后 8 位。

我尝试了互联网上的许多建议,但到目前为止没有任何效果。

我尝试设置数据列类型。

dt.Columns[6].DataType = typeof(decimal);

dr[6] = decimal.Round(Convert.ToDecimal(inpRow[20]), 8);

Datarow column type

Datacolumn type set to decimal

Excel中的输出,如果值为,则输出应为。124.73124.73000000

C# Excel 数据表 十进制

评论

0赞 Rand Random 11/10/2023
您想要的是调整小数的显示方式,您不想更改十进制值本身。要更改显示,您需要将用于将十进制值转换为字符串的格式 ajdust。例如。dotnetfiddle.net/Mt73hRStringFormat
0赞 Tim Schmelter 11/10/2023
这与你的excel有什么关系?您尚未演示如何将其导出到 excel 以及 excel 列是否具有格式。DataTable
0赞 Cloud9 11/10/2023
@RandRandom 我不想转换为字符串,因为输出 excel 需要有数字才能从另一个进程进行计算
0赞 Cloud9 11/10/2023
@TimSchmelter 我将此数据行添加到数据表中:dt。行.Add(dr);然后将其保存为 excel : wb。Worksheets.Add(dt, “证券交易上传”);
0赞 Rand Random 11/10/2023
I don't want to convert into string..- 我再次谈论 DISPLAY,显示的内容最终将归结为一个字符串。十进制/日期时间等,如果显示是一个字符串 - 所以每次你显示一个值时,它都会被格式化为一个字符串,例如。datetime 格式为 MM.dd.yyyy 或 MM.dddd.yy 或 ...-这是您必须进行更改的地方,您必须声明如何显示十进制值 - 在Excel单元格中,只需更改数字格式即可。

答:

0赞 Rand Random 11/10/2023 #1

OP 确实提到了以下行,excel 是如何生成的

wb.Worksheets.Add(dt, "Securities transaction upload");

这让我相信 OP 正在使用 ,请参阅他们的 github 页面中的以下示例ClosedXML

https://github.com/ClosedXML/ClosedXML/wiki/Adding-DataTable-as-Worksheet

如果正确,则可以添加以下行以设置类型为 .decimal

for (var index = 0; index < dataTable.Columns.Count; index++)
{
    var dataTableColumn = dataTable.Columns[index];
    if (dataTableColumn.DataType != typeof(decimal))
        continue;

    var rangeWithHeader = ws.Column(index + 1).AsRange().RangeUsed();
    var rangeWithoutHeader = ws.Range(rangeWithHeader.FirstCell().CellBelow(), rangeWithHeader.LastCell());
    rangeWithoutHeader.Style.NumberFormat.Format = "#0.00000000";   
}

完整样本:

static void Main(string[] args)
{
    var wb = new XLWorkbook();

    var dataTable = GetTable("Information");

    // Add a DataTable as a worksheet
    var ws = wb.Worksheets.Add(dataTable);

    for (var index = 0; index < dataTable.Columns.Count; index++)
    {
        var dataTableColumn = dataTable.Columns[index];
        if (dataTableColumn.DataType != typeof(decimal))
            continue;

        var rangeWithHeader = ws.Column(index + 1).AsRange().RangeUsed();
        var rangeWithoutHeader = ws.Range(rangeWithHeader.FirstCell().CellBelow(), rangeWithHeader.LastCell());
        rangeWithoutHeader.Style.NumberFormat.Format = "#0.00000000";   
    }

    wb.SaveAs("AddingDataTableAsWorksheet.xlsx");
}

static DataTable GetTable(String tableName)
{
    DataTable table = new DataTable();
    table.TableName = tableName;
    table.Columns.Add("Dosage", typeof(int));
    table.Columns.Add("Drug", typeof(string));
    table.Columns.Add("Patient", typeof(string));
    table.Columns.Add("Date", typeof(DateTime));
    table.Columns.Add("Dec", typeof(decimal));

    table.Rows.Add(25, "Indocin", "David", DateTime.Now, 123m);
    table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now, 123.4m);
    table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now, 123.45m);
    table.Rows.Add(21, "Combivent", "Janet", DateTime.Now, 123.456m);
    table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now, 123.4567m);
    return table;
}