LinqToExcel - 从 *.xlsx 文件中读取小数
LinqToExcel - Reading a decimal from an *.xlsx file
我已经摆弄这个几个小时了,我有点在原地打转。我错过了一些东西。
我正在尝试使用 Linq to Excel 读取 excel sheet。除了 sheet 中的小数点外,一切都按顺序进行。我尝试了几种不同的方法,none 似乎有效。
我要阅读的栏目是货币栏目。我的模型是十进制的。当我在 excel 中保留货币格式的列时,我从 linq 查询中得到 0。
当我将列设置为数字时,我得到的值没有小数点分隔符。
我创建的测试文件有一个名为 DecimalSheet 的 sheet。该列称为 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。
- 将完整的作品sheet设置为文本格式并处理为
string
如上。它显示为“4,58761e+016”而不是“4587,61”
- 读取值为`Float。这没有什么区别。
- 我尝试使用文化设置,就像将文化设置为
nl-NL
在创建工厂之前在线程中硬编码并且
完成后将其设置回原始文化。这使得不
差异。
我注意到了:
- 当Excel文档保持打开状态时,上面的读数
代码是完美的。我不希望 Excel 因为批处理而保持打开状态
处理 Excel 个文档(在服务器上,无用户交互)。
- 当我 运行 上面的测试代码在不同的服务器上时(荷兰语 Windows,
荷兰语 Excel、荷兰语语言环境
nl-NL
) 它工作正常。它在
英文服务器 'en-US' 语言环境不起作用。让我觉得
这与本地化或文化有关?
任何人都可以指出正确的方向吗?我如何配置 excel/change 代码以使其读取正确的小数?
在尝试了几个其他选项后,我还访问了此 nuGet 包的 github 项目页面,并在那里发布了一个问题 (https://github.com/paulyoder/LinqToExcel/issues/143)。
解决方法很简单;在 windows 日期设置中更改我的语言环境。这对我来说很有意义,因为所有文件都是荷兰语。只有 windows 是英文的。
这是通过控制面板 -> 区域完成的
我已经摆弄这个几个小时了,我有点在原地打转。我错过了一些东西。
我正在尝试使用 Linq to Excel 读取 excel sheet。除了 sheet 中的小数点外,一切都按顺序进行。我尝试了几种不同的方法,none 似乎有效。
我要阅读的栏目是货币栏目。我的模型是十进制的。当我在 excel 中保留货币格式的列时,我从 linq 查询中得到 0。
当我将列设置为数字时,我得到的值没有小数点分隔符。
我创建的测试文件有一个名为 DecimalSheet 的 sheet。该列称为 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。 - 将完整的作品sheet设置为文本格式并处理为
string
如上。它显示为“4,58761e+016”而不是“4587,61” - 读取值为`Float。这没有什么区别。
- 我尝试使用文化设置,就像将文化设置为
nl-NL
在创建工厂之前在线程中硬编码并且 完成后将其设置回原始文化。这使得不 差异。
我注意到了:
- 当Excel文档保持打开状态时,上面的读数 代码是完美的。我不希望 Excel 因为批处理而保持打开状态 处理 Excel 个文档(在服务器上,无用户交互)。
- 当我 运行 上面的测试代码在不同的服务器上时(荷兰语 Windows,
荷兰语 Excel、荷兰语语言环境
nl-NL
) 它工作正常。它在 英文服务器 'en-US' 语言环境不起作用。让我觉得 这与本地化或文化有关?
任何人都可以指出正确的方向吗?我如何配置 excel/change 代码以使其读取正确的小数?
在尝试了几个其他选项后,我还访问了此 nuGet 包的 github 项目页面,并在那里发布了一个问题 (https://github.com/paulyoder/LinqToExcel/issues/143)。
解决方法很简单;在 windows 日期设置中更改我的语言环境。这对我来说很有意义,因为所有文件都是荷兰语。只有 windows 是英文的。
这是通过控制面板 -> 区域完成的