如何从Excel中读取包含超过255个字符的数据行

3
问题是当我按照下面所示设置DataSet时,默认只从电子表格单元格中读取255个字符,并将它们放入表格中。
DataSet exData = new DataSet();
string connectionString = String.Format(ConnectionString, path);
OleDbDataAdapter ex = new OleDbDataAdapter(ExcelQuery, connectionString);
ex.Fill(exData);

我正在使用Extended Properties=Excel 8.0和Microsoft.Jet.OLEDB.4.0,连接Excel表没有问题。
据我所知,这是由于Jet.OLEDB提供程序引起的,我应该使用什么呢?
而且,我可能无法更新到Jet的新提供程序,有没有任何解决方法?任何解决方法都将受到限制,不能直接修改Excel文档以包含两个或多个单元格来存储超过255个字符的数据。
谢谢。
7个回答

4

使用 ExcelDataReader 并在您的项目中添加引用。然后使用以下代码来读取超过255列的Excel表格...

FileStream stream = File.Open(strFileName, FileMode.Open, FileAccess.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
DataSet result = excelReader.AsDataSet();
excelReader.Close();
return result.Tables[0];

3

我在这里遇到了相同的问题,后来发现默认情况下,只有前8行用于设置列的类型。如果在第8行以下的任何其他行中有更长的字符串,则它将被截断。

你只需要运行 Regedit 并转到:

32位版本:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel

或者

64位版本:

HKEY_LOCAL_MACHINE\SOFTWARE\wow6432node\Microsoft\jet\4.0\Engines\Excel

在那里,将TypeGuessRows更改为0,这样Jet引擎就会使用所有行来设置数据类型。

来源:Why SSIS always gets Excel data types wrong, and how to fix it!


这个问题的解决方法可能非常有用。我们当时的解决方案是确保将最大的字符串放在前8行中,以便排序列。 - Joshua

1

这个问题在这里有描述。
你不考虑使用Excel interop的具体原因是什么?


感谢您提供有关Excel互操作性的指针!我正在尝试对现有项目进行非常少量的更改。如果可以干净地插入互操作性,那将是很好的。在此时此刻,重大修改是不可能的。 - Joshua

1

Jet 中文本列的标准最大长度为 255 个字符。我没有尝试过,但如果您创建一个 schema.ini 文件并告诉它您的列是备忘录类型,您可能可以放更多的数据。


1
这促使我寻找将该列转换为备忘录的方法。最终,我们发现可以简单地将包含问题字符串的行强制移到文件顶部。这一操作使该行被视为备忘录,并提供了所有信息。谢谢。 - Joshua

0
如果您有要处理的 schema.ini 文件,请在存储字符串长度大于 255 的列时使用 Memo 数据类型,而不是 Text

0
从以下图片中,您可以找到如何在项目中添加Excel引用库。
从Visual Studio的项目菜单中选择“添加引用”对话框。
选择COM左侧菜单中的Microsoft Excel 15.0对象库,然后单击“确定”按钮。
导入引用库后,我们必须初始化Excel应用程序对象。
使用System、System.Windows.Forms和System.Runtime.InteropServices命名空间,并使用Microsoft.Office.Interop.Excel命名空间。
创建Excel应用程序对象、工作簿对象、工作表对象和范围对象。
打开Excel文件并获取其工作表。
使用循环遍历Excel文件中的所有单元格。
关闭Excel应用程序对象和工作簿对象。

我们可以从 Excel 中读取一个超过 255 个字符的数据行。 - Papun Sahoo
这个问题涉及到 Extended Properties=Excel 8.0 和 Microsoft.Jet.OLEDB.4.0 的特定场景。 - Joshua
我知道有许多问题,很多人都已经回答了。但是我正在用不同的方式总结这些事情,以便更好地理解。 - Papun Sahoo

0

数据类型长度将被限制为255个字符,因为Interop使用前八列来设置限制。

解决这个问题的一种快捷方法是,只需将最长的列作为Excel中的第一列或前八列之一。这样,限制将被设置为最长列的长度。


这是正确的。正如@baguiar所指出的,并且在我回复他时,前8列可以强制将字段类型初始化为更长的类型。当时这是迄今最简单的解决方案。虽然如果我回想起来正确的话,新版本的Jet对模式定义有更好的支持。 - Joshua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接