LinqToExcel - 从* .xlsx文件中读取小数

时间:2018-05-03 14:39:03

标签: c# excel decimal linq-to-excel

我现在已经花了几个小时摆弄这个,我有点走路了。我错过了什么。

我试图用Linq到Excel阅读excel表。一切都按顺序工作,除了工作表中的小数。我尝试了几种不同的方法,但似乎都没有。

我试图阅读的专栏是货币栏。我的模型是十进制的。当我使用货币格式将列保留在excel中时,我从linq查询中得到0。

当我将colum设置为number时,我得到没有小数分隔符的值。

我创建的测试文件有一个名为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

与此同时,我尝试过:

  1. 将值读作string。这给我带来了 无论什么样的,细胞中的价值的科学记数法 我使用的格式。它读取&#34; 4,58761e + 016&#34;而不是4587,61。
  2. 将完整工作表设置为文本格式并将其处理为 string如上所述。它读取&#34; 4,58761e + 016&#34;而不是&#34; 4587,61&#34;
  3. 将值读作“Float”。这没什么区别。
  4. 我尝试使用文化设置,就像设置文化一样 nl-NL在创建工厂之前在线程中进行了硬编码 在我完成之后将其恢复到原始文化。这没有 差。
  5. 我注意到了:

    1. 当Excel文档保持打开状态时,读数与上述内容一致 代码很完美。我不希望Excel因批处理而保持打开状态 处理Excel文档(在服务器上,没有用户交互)。
    2. 当我在不同的服务器上运行上述测试代码时(荷兰语Windows, Dutch Excel,Dutch Locale nl-NL)它工作正常。它就在 英语服务器&#39; en-US&#39;它不起作用的语言环境。让我思考 这与本地化或文化有关吗?
    3. 任何人都可以指出我正确的方向如何配置excel /更改代码,使其读取十进制正确吗?

1 个答案:

答案 0 :(得分:2)

在尝试了几个其他选项之后,我也去了这个nuGet包的github项目页面,并在那里发布了一个问题(https://github.com/paulyoder/LinqToExcel/issues/143)。

解决方案非常简单;在Windows日期设置中更改我的区域设置。这对我来说很有意义,因为所有文件都是荷兰语。只有窗口是英文的。

这是通过控制面板完成的 - &gt;区域

Setting the format to Dutch

Setting the system locale to Dutch