c# - 如何使用 C# 和 ADO.NET 从 Excel 中读取小数点和日期
问题描述
我正在尝试使用以下代码(ADO.NET)在我的 ASP.NET 应用程序中读取 Excel 文件:
// Create OleDbCommand object and select data from worksheet Sheet1
String query = String.Format("Select * From [{0}$]", sheetName);
OleDbCommand cmd = new OleDbCommand(query, oledbConn);
// Create new OleDbDataAdapter
OleDbDataAdapter oleda = new OleDbDataAdapter();
oleda.SelectCommand = cmd;
//Fills Data to DataTable
oleda.Fill(dt);
问题是数据表中的值表示
1)对于带逗号 (3,14) 或带点 (3.14) 的小数
2)对于格式为“DD/MM/YYYY”或“MM/DD/YYYY”的日期
对于相同的 Excel 文件,取决于服务器的区域设置。
有什么方法可以读取特定语言环境中的数据以便从 Excel 文件中获取正确的值?
解决方案
对于带有小数的列,请使用以下内容对其进行解析: ( Decimal.Parse
)
string decimal1 = "3,14";
string decimal2 = "3.14";
decimal d1 = decimal.Parse(decimal1, new NumberFormatInfo { NumberDecimalSeparator = "," });
decimal d2 = decimal.Parse(decimal2);
请注意,,
您需要使用自定义NumberFormatInfo
来正确解析它。
然后为您的DateTime
专栏:
string date1 = "14/03/2018";
string date2 = "03/14/2018";
DateTime dt1 = DateTime.ParseExact(date1, "dd/MM/yyyy", CultureInfo.InvariantCulture);
DateTime dt2 = DateTime.ParseExact(date2, "MM/dd/yyyy", CultureInfo.InvariantCulture);
在这里,您需要为您的日期指定不同的格式。
编辑:
为了更一般地解析未知格式,如果您知道可能有多个DateTime
格式,您可以尝试遍历您的CultureInfo
或多个格式的所有格式。CultureInfo
下面是如何执行此操作的示例:
string dateTimeString = @"03/14/2018";
string[] possibleStandardFormats = new CultureInfo("en-US")
.DateTimeFormat.GetAllDateTimePatterns();
DateTime? result = null;
foreach (string format in possibleStandardFormats) {
if (DateTime.TryParse(dateTimeString, out DateTime dateTime)) {
// this format could work
result = dateTime;
break;
}
}
if (result == null) {
// no luck with any format
// try one last parse
if (DateTime.TryParse(dateTimeString, out DateTime dateTime)) {
// finally worked
result = dateTime;
}
else {
// no luck
}
}
在这里,首先尝试通用DateTime.TryParse
(显示在本示例的末尾)可能更有效,因为它可以节省您通过其他格式的迭代。由您决定如何处理这个问题,但这个例子应该处理大多数情况。
编辑2:
为了获得标准DateTime
格式,您可以使用CurrentCulture
这将有助于您的日期。在我之前的编辑中,我对 进行了硬编码new CultureInfo("en-US")
,但下面的内容更笼统一些。
string[] possibleStandardFormats = new CultureInfo(CultureInfo.CurrentCulture.Name)
.DateTimeFormat.GetAllDateTimePatterns();
编辑3: 要详细说明前面的小数解析,首先检查字符串是否有逗号,然后根据我上面列出的方法进行解析。
string decimal1 = "3,14";
if (decimal1.Contains(",")) {
decimal d1 = decimal.Parse(decimal1, new NumberFormatInfo { NumberDecimalSeparator = "," });
}
else {
decimal d1 = decimal.Parse(decimal1);
}
编辑4:
要将文化融入解析小数,您可以尝试该Convert.ToDecimal
方法。它的参数之一是CultureInfo
您可以将当前文化作为CultureInfo.CurrentCulture
. 例如下面,我使用de-de
(德语),因为这是一种有效的文化1.234,14
string decimal1 = "1.234,14";
string decimal2 = "1,234.14";
decimal d1 = Convert.ToDecimal(decimal1, new CultureInfo("de-de"));
decimal d2 = Convert.ToDecimal(decimal2, CultureInfo.CurrentCulture);
推荐阅读
- sharepoint - SharePoint 获取项目未返回所有列
- amazon-dynamodb - 从停止的地方恢复并行扫描
- rust - 解码存储在数据库中的数据
- python - 使用竹子时重新标记后,Git 标签链接到旧提交
- objective-c - 沙盒子进程:为什么脚本与应用程序不同?
- c - 使用 Clang 和 MinGW 获取错误“未定义对‘strsep’的引用”
- c++ - 如何比较二维数组中的列元素?
- c# - “委托组合”模式之前的“委托删除”是什么?
- spring - 如何使用在多个 applicationContext.xml 文件中定义的同一个 bean?
- amazon-web-services - AWS Kinesis Firehose Lambda 数据转换,在节点中进行加密