使用Excel Interop C#读取数据时的小数精度异常与日期格式识别错误问题
使用Excel Interop C#读取数据时的小数精度异常与日期格式识别错误问题
问题描述
我正在使用Excel Interop C#库从Excel提取数据并生成.PX文件,但遇到了两个棘手的问题:
- 读取小数时出现多余的小数位,比如Excel单元格中显示的
1127.17,读取后变成了1127.17000001013 - 日期值和美元金额都被错误地当成日期进行转换,而且我无法通过固定单元格格式的方式来处理,希望找到一种方法既能正确识别日期并转换为
MM/dd/yyyy格式,又能按Excel显示的小数位数读取数值数据。
原始代码
object[,] data = worksheet.get_Range("F3:IK3").Cells.Value2; for (int j = 1; j <= data.Length; j++) { string strTagValue = string.Empty; if (data[1, j] is double oaDate) { DateTime dt = DateTime.FromOADate(oaDate); // 这里不仅日期,美元金额也被转换成了日期值 strTagValue = dt.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture); } else { strTagValue = Convert.ToString(data[1, j]); } }
问题示例
日期格式识别错误


单元格使用的公式

小数精度异常


更新后的尝试代码
Excel.Range range = ws1065.get_Range($"F{i}:IK{i}"); object[,] data = new object[range.Rows.Count, range.Columns.Count]; for (int k = 1; k <= range.Rows.Count; k++) { for (int l = 1; l <= range.Columns.Count; l++) { if (range.Cells[k, l].Value != null) { string strDataType = range.Cells[k, l].Value.GetType().Name; double dlTagValue; bool isDouble = double.TryParse(Convert.ToString(range.Cells[k, l].Value), out dlTagValue); if (strDataType.ToUpper() == "STRING" && !string.IsNullOrEmpty(range.Cells[k, l].Value) && isDouble && DateTime.TryParseExact(Convert.ToString(DateTime.FromOADate(range.Cells[k, l].Value)), formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out startDate)) { isDate = true; } else { isDate = false; } } if (isDate) { DateTime dtTagValue = DateTime.FromOADate(Convert.ToDouble(range.Cells[k, l].Value)); data[k - 1, l - 1] = dtTagValue.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture); } else { decimal dTagValue; bool isDecimal = decimal.TryParse(Convert.ToString(range.Cells[k, l].Value), out dTagValue); if (isDecimal) { bool isLong = dTagValue == (long)dTagValue; if (isLong) { data[k - 1, l - 1] = range.Cells[k, l].Value; } else { data[k - 1, l - 1] = string.Format("{0:F2}", dTagValue); } } else { data[k - 1, l - 1] = range.Cells[k, l].Value; } } } }
额外问题:Zip Code格式

备注:内容来源于stack exchange,提问作者RGS
相关产品推荐
相关产品推荐

