OpenXmlReader 获取 Excel 单元格中的某些值错误
OpenXmlReader gets certain values in Excel cells wrong
我在 C# 程序中使用 OpenXmlReader 来读取 excel 文件。出于我的目的(比较值),我需要精确的单元格值,无需任何修改。
但是,OpenXmlReader 以一种令人恼火的方式解释某些 Excel 单元格值类型(具体来说,百分比、日期和时间),我似乎无法控制。
假设这是一个 Excel 行(我希望阅读的内容):
BNK | BNK_DC | GROUP | GROUP | 8 | 0,12% | 0,14% | 0,15% | 0,17% | 0,18%
这是我的调试控制台上显示的行:
BNK | BNK_DC | GROUP | GROUP | 8 | 1.1561E-3 | 1.3554245994127801E-3 | 1.5389154190192354E-3 | 1.7010741265663695E-3 |1.8389123386463213E-3
基本上,字符串被正确读取,简单整数也是如此。但是,百分比被转换成我无法掌握或使用的东西。
当我尝试读取日期或时间时会发生类似情况。
excel 文件行:
04.04.2018 | Adam Smith | 09:30 | 17:30 | 8,0 | Apr | Q2
什么 OpenXmlReader returns:
43194 | Adam Smith | 0.39583333333333331 | 0.72916666666666663 | 8 | Apr | Q2
如你所见,日期和时间已经变成了我不明白的东西。
我想这可能与 Excel 内部存储百分比、时间和日期的某种方式有关。如果是这样,我如何将这些值转换回可读格式?
这是我使用 OpenXmlReader class 读取 Excel 文件并将它们显示到我的调试控制台的确切代码:
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.Diagnostics;
public void ExcelReader(SpreadsheetDocument document)
{
var wbp = document.WorkbookPart;
var wsp = wbp.WorksheetParts.First();
OpenXmlReader reader = OpenXmlReader.Create(wsp);
string text;
while (reader.Read())
{
if (reader.ElementType == typeof(Row))
{
reader.ReadFirstChild();
do
{
if (reader.ElementType == typeof(Cell))
{
Cell c = (Cell)reader.LoadCurrentElement();
string cellValue;
if (c.DataType != null && c.DataType == CellValues.SharedString)
{
SharedStringItem ssi = wbp.SharedStringTablePart.SharedStringTable.Elements<SharedStringItem>().ElementAt(int.Parse(c.CellValue.InnerText));
cellValue = ssi.Text.Text;
}
else
{
cellValue = c.CellValue?.InnerText;
}
Debug.Write($"{cellValue} | ");
}
} while (reader.ReadNextSibling());
Debug.Write("\n");
}
}
document.Close();
}
我主要从以下线程的第一个答案中获取这段代码:
Using OpenXmlReader
那么,如何从 Excel 获取我的实际百分比、日期、时间而不是这些奇怪的值?
提前谢谢你。
日期
日期存储在 1900 年 1 月 1 日之后的天数
时间
时间存储在24h *数字所以24h*0.395833=9,5 => 09:30
百分比
如果你使用 Convert.ToSingle(number)
1.1561E-3
将变为 0.0011561
即 0.115%
我在 C# 程序中使用 OpenXmlReader 来读取 excel 文件。出于我的目的(比较值),我需要精确的单元格值,无需任何修改。
但是,OpenXmlReader 以一种令人恼火的方式解释某些 Excel 单元格值类型(具体来说,百分比、日期和时间),我似乎无法控制。
假设这是一个 Excel 行(我希望阅读的内容):
BNK | BNK_DC | GROUP | GROUP | 8 | 0,12% | 0,14% | 0,15% | 0,17% | 0,18%
这是我的调试控制台上显示的行:
BNK | BNK_DC | GROUP | GROUP | 8 | 1.1561E-3 | 1.3554245994127801E-3 | 1.5389154190192354E-3 | 1.7010741265663695E-3 |1.8389123386463213E-3
基本上,字符串被正确读取,简单整数也是如此。但是,百分比被转换成我无法掌握或使用的东西。
当我尝试读取日期或时间时会发生类似情况。
excel 文件行:
04.04.2018 | Adam Smith | 09:30 | 17:30 | 8,0 | Apr | Q2
什么 OpenXmlReader returns:
43194 | Adam Smith | 0.39583333333333331 | 0.72916666666666663 | 8 | Apr | Q2
如你所见,日期和时间已经变成了我不明白的东西。
我想这可能与 Excel 内部存储百分比、时间和日期的某种方式有关。如果是这样,我如何将这些值转换回可读格式?
这是我使用 OpenXmlReader class 读取 Excel 文件并将它们显示到我的调试控制台的确切代码:
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.Diagnostics;
public void ExcelReader(SpreadsheetDocument document)
{
var wbp = document.WorkbookPart;
var wsp = wbp.WorksheetParts.First();
OpenXmlReader reader = OpenXmlReader.Create(wsp);
string text;
while (reader.Read())
{
if (reader.ElementType == typeof(Row))
{
reader.ReadFirstChild();
do
{
if (reader.ElementType == typeof(Cell))
{
Cell c = (Cell)reader.LoadCurrentElement();
string cellValue;
if (c.DataType != null && c.DataType == CellValues.SharedString)
{
SharedStringItem ssi = wbp.SharedStringTablePart.SharedStringTable.Elements<SharedStringItem>().ElementAt(int.Parse(c.CellValue.InnerText));
cellValue = ssi.Text.Text;
}
else
{
cellValue = c.CellValue?.InnerText;
}
Debug.Write($"{cellValue} | ");
}
} while (reader.ReadNextSibling());
Debug.Write("\n");
}
}
document.Close();
}
我主要从以下线程的第一个答案中获取这段代码: Using OpenXmlReader
那么,如何从 Excel 获取我的实际百分比、日期、时间而不是这些奇怪的值? 提前谢谢你。
日期
日期存储在 1900 年 1 月 1 日之后的天数
时间
时间存储在24h *数字所以24h*0.395833=9,5 => 09:30
百分比
如果你使用 Convert.ToSingle(number)
1.1561E-3
将变为 0.0011561
即 0.115%