【问题标题】:(C#) OpenXML import xlsx into DataTable with correct column data type(C#) OpenXML 将 xlsx 导入具有正确列数据类型的 DataTable
【发布时间】:2018-02-08 04:57:14
【问题描述】:

我正在使用 OpenXML 库将 excelsheet(.xslx) 导入使用 C# 的 DataTable。

xlsx 的第一行包含列名,所以我开始在 DataTable 中添加列:

foreach (Cell cell in row.Descendants<Cell>())
{
    dt.Columns.Add(GetXlsxCellValue(sharedStringTableList, cell));
}

然后我循环所有其他行,并以与当前行中的任何单元格类似的方式将任何单行添加到我的 DataTable 中来填充 DataTable。

现在,假设我的 excel 有两个这样的列

excelExample

第一行包含列名,因此第一个单元格有一个 DataType = string(文本存储在 sharedStringTableList 中)。

所有其他行仅在第一列中包含数字(并且,在 excel 中,整个列的格式也为“数字”)。

最后,在我的 DataTable 中,第一列具有正确的名称(“数字”),但列 DataType 是 STRING

问题:如何在开始时使用 xlsx 中设置的正确列 DataType 创建我的 DataTable? 方法“Columns.Add()”允许您指定列数据类型,但在第一行所有单元格都有 DataType = string,所以我需要以其他方式检查列数据类型。

提前致谢,

安德烈亚

...

【问题讨论】:

  • 您使用 OpenXML 的动机是什么?为什么不直接使用旧的 Microsoft.Jet.OLEDB 提供程序?
  • 嗨 Kostya,我的动机是规范项目 :) 可能我需要使用 OpenXML 来导入数据,而无需在每台机器上安装 excel
  • 其实你不需要安装 MS Office 或 Excel 就可以使用前面提到的 OLEDB 提供程序。
  • 你确定 Kostya 吗?我刚刚在我的电脑上进行了尝试(未安装 excel)并收到此错误消息:“'Microsoft.ACE.OLEDB.12.0' 提供程序未在本地计算机上注册。”
  • 您仍然需要安装 OLDB 驱动程序,但我记得不需要 Excel。 microsoft.com/en-us/download/details.aspx?id=54920

标签: c# excel datatable openxml xlsx


【解决方案1】:

有一个名为 ClosedXML 的库,它是 OpenXML 的友好包装器,我发现它比直接的 OpenXML 更易于使用。有一个 Enum (XLCellValues) 可以告诉您 excel 数据类型是什么。这可用于帮助您构建正确的数据列类型。

Here 是一个示例,说明如何使用封闭的 xml 将行和列导航并解析为一个简单的类,与您的示例非常相似(但用于类而不是数据表)。该链接/示例中还有一种方法可以将 C# 尖锐类型映射到可以反向使用的 excel 列类型(XLCellValues 枚举)。如果您不信任给定的 excel 数据类型,它会变得更加复杂。

如果你有一个简单的目标类,你试图从 excel 中提取这个nuget 可以开箱即用,但我认为你想要一个 DataTable 输出。

希望这会有所帮助。

【讨论】:

  • 嗯,ClosedXML 用于从 .net 类型创建 excel,因此它减少了类型。这篇文章要问的是从少数 Open XML Enum(仅少数如 Number 涵盖所有数字类型)到 .net 类型,如 int、double 等。
【解决方案2】:

您必须查看以下内容才能将整列数据类型设置为文本:

Worksheet.Column(9).Style.NumberFormat.Format = "@";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    相关资源
    最近更新 更多