(C#)OpenXML使用正确的列数据类型将xlsx导入DataTable

时间:2017-08-30 12:55:41

标签: c# excel datatable openxml xlsx

我正在使用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中)。

所有其他行在第一列中包含ONLY Number(在excel中,整个列也包含格式为“number”)。

最后,在我的DataTable中,第一列的名称正确(“Number”),但DataType列为 STRING

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

提前致谢,

安德烈

...

3 个答案:

答案 0 :(得分:0)

好吧,您将不得不确定单元格类型,然后根据它创建列。试试看this帖子。之后,您应该能够基于单元格类型create your columns(在将其转换为.NET类型之后)。但是,如果你知道你的类型是高级的,并希望你的数据是T的列表,我建议你看看像ClassToExcel.OpenXml或类似的包装库这样的东西来节省你编写代码的麻烦。 / p>

答案 1 :(得分:0)

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

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

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

希望这有帮助。

答案 2 :(得分:0)

您必须查看以下内容,以将整个列数据类型设置为text:

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