【发布时间】:2018-05-03 14:39:03
【问题描述】:
我已经在这个问题上摆弄了几个小时,而且我有点绕圈子。我错过了一些东西。
我正在尝试使用 Linq to Excel 读取 Excel 工作表。一切都按顺序工作,除了工作表中的小数。我尝试了几种不同的方法,但似乎都不起作用。
我要阅读的列是货币列。我的模型是十进制的。当我在货币格式的 excel 中保留该列时,我从 linq 查询中得到 0。
当我将列设置为数字时,我得到的值没有小数分隔符。
我创建的测试文件有一个名为 DecimalSheet 的工作表。该列称为 DecimalTest 并包含一个数字; 4587,61
我有一个这样的测试模型;
public class DecimalModel
{
[ExcelColumn("DecimalTest")]
public decimal DecimalTest { get; set; }
}
查询文件是这样实现的:
var testFile = new ExcelQueryFactory(fileLocation)
{
DatabaseEngine = LinqToExcel.Domain.DatabaseEngine.Ace,
TrimSpaces = LinqToExcel.Query.TrimSpacesType.Both,
UsePersistentConnection = false,
ReadOnly = true
};
var decimalTestModel = from tb in testFile.Worksheet<DecimalModel>("DecimalSheet")
select tb;
var lines = decimalTestModel.ToList();
读数是这样的:45876100000000000M
编辑 1
与此同时,我已经尝试过:
- 将值读取为
string。这向我展示了 单元格中值的科学记数法,无论哪种 我使用的单元格格式。它读取“4,58761e+016”而不是 4587,61。 - 将完整的工作表设置为文本格式并将其处理为
string同上。它读作“4,58761e+016”而不是“4587,61” - 将值读取为“浮点数”。这没有任何区别。
- 我尝试使用文化设置,如将文化设置为
nl-NL在创建工厂之前在线程中硬编码 完成后将其恢复为原始文化。这没有 区别。
我注意到了:
- 当 Excel 文档保持打开时,上面的读数 代码很完美。我不希望 Excel 因为批处理而保持打开状态 处理 Excel 文档(在服务器上,无需用户交互)。
- 当我在不同的服务器(荷兰语 Windows,
荷兰语 Excel,荷兰语语言环境
nl-NL) 工作正常。它在 它不起作用的英语服务器“en-US”语言环境。让我思考 这与本地化或文化有关吗?
谁能指出我如何配置 excel/更改代码以使其正确读取小数点的正确方向?
【问题讨论】:
-
当您尝试使用
float时会发生什么?另外,您是否在读数中漏掉了一个逗号或点? -
我试过
Float。但这也没有用。输出保持不变。奇怪的细节;当我打开 excel 时,它返回正确的值 4587,61。这为我指明了语言问题的方向。当我在生产服务器(荷兰语 Excel + Windows 版本)上运行此代码时,它运行良好!当我在我的开发服务器(英文 Windows + Excel)上运行它时,它不起作用。 -
有点粗略的猜测,但 excel 中的列类型是什么?一般,数字,字符串?可能是荷兰语和英语的逗号解析问题需要一个点。
-
尝试了几种不同的设置,一般、数字、货币。甚至尝试过从字符串到十进制的文本和手动解析。解决方案是在我的 decelopment 服务器的语言环境设置中(如下)
标签: c# excel decimal linq-to-excel