在C#中解析Excel文件时,单元格似乎会在255个字符处被截断...我该如何阻止这种情况发生?

17

我正在使用C#在ASP.NET中解析上传的Excel文件(xlsx)。 我使用以下简化代码:

string connString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileLocation + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES\";");
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", connString);
DataSet ds = new DataSet();
adapter.Fill(ds);
adapter.Dispose();
DataTable dt = ds.Tables[0];
var rows = from p in dt.AsEnumerable() select new { desc = p[2] };

这个方法完美运行,但是如果单元格中的字符数超过255个,它将被截断。有任何想法我做错了什么吗?谢谢。

编辑:当查看Excel表格时,显示的内容远多于255个字符,因此我不认为表格本身存在限制。

6个回答

21

解决方案!

我今天也在处理这个问题。最终,我通过修改一些注册表键才成功地解析了Excel电子表格。

在解析Excel电子表格之前,您必须更新此注册表键:

// Excel 2010
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel\
or
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel\

// Excel 2007
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel\

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

修改此键下的TypeGuessRows0,并将ImportMixedTypes修改为Text。您还需要更新连接字符串,在扩展属性中包含IMEX=1

string connString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileLocation + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";");

参考资料

http://blogs.vertigo.com/personal/aanttila/Blog/archive/2008/03/28/excel-and-csv-reference.aspx

http://msdn.microsoft.com/en-us/library/ms141683.aspx

...字符可能会被截断。 要想从具有超过255个字符的大字段列中导入数据而不出现截断,您必须确保至少在一行采样数据中,大字段列包含一个超过255个字符的值,或者您必须增加驱动程序采样的行数以包括这样一行。 您可以通过增加 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel 注册表项下 TypeGuessRows 的值来增加采样的行数....


谢谢!即使是微软自己的KB文章也指向了相同的键,但位置错误!一旦我按照您的说明操作,所有东西都正常工作了! - Alex Polkhovsky
非常感谢!你的回答让我在短短30分钟内解决了问题,而不是整整一天! :) - Maarten Kieft
我尝试了相同的解决方案。但对我来说不起作用。你能否提供建议? - user684805

8

我遇到了这个问题,解决方法是将带有长文本的单元格移动到电子表格的顶部。

我在一个论坛中发现了这条评论,描述了这个问题

这是Jet OLEDB提供程序的一个问题。它查看电子表格的前8行来确定每列的数据类型。如果在前8行中列不包含超过256个字符的字段值,则假定数据类型为文本,其字符限制为256。以下KB文章有关于此问题的更多信息:http://support.microsoft.com/kb/281517

希望这能帮助其他人!


1
它对我有效。我只是将行移动到工作表的顶部,256个字符后一个单元格不再被切断。对于静态数据源,这是最简单的解决方法。 - Robert Ostrowicki
这对我有用!如果数据的顺序不重要,快速提示。添加一个名为“长度”的列,添加公式=LEN(YOUR LONG TEXT CELL),然后按该列降序排序。可以快速将所有最长的文本放在顶部! - matthew_b

1

你尝试过在电子表格中将列的数据类型设置为文本吗?我相信这样做可以让单元格包含超过255个字符。

[编辑] 就我所知,与 MS-Excel 团队的 this dialog 对话是一篇有趣的阅读材料。在底部的评论部分,他们讨论了那个 255 的截止点。他们说 Excel 12 可以支持每个单元格 32k 个字符。

如果这是真的,肯定有办法获取这些数据。以下是两个需要考虑的事情。

  1. 过去我曾在连接字符串中使用“IMEX=1”选项来处理包含混合数据的列显示为空的问题。这可能是一个冒险,但你可以尝试一下。

  2. 你能将文件导出为制表符分隔的平面文件吗?在我看来,这是处理 Excel 数据最可靠的方法,因为 Excel 有很多陷阱。


当您在Excel中查看Excel文件时,数据是否被截断或全部显示? - James

0
关于上一篇文章,我也使用SpreadsheetGear,并发现它在从旧的XLS(而不是XLSX)格式读取时也受到每个单元格255个字符的限制。

0

1
当我查看表格并且它显示超过255个字符时,如何限制它? - naspinski
从我链接的文章的“原因”部分可以看出:“例如,如果您将一个超过255个字符的文本字符串传递给工作表或对话框中的文本框,则Excel会截断该文本,即使文本框最多可以容纳10,240个字符。” - Chris Doggett

0

.NET下的SpreadsheetGear可以读写(等等)xls和xlsx工作簿,并支持与Excel相同的文本限制 - 换句话说,它会正常工作。如果您想尝试一下,可以免费评估。

免责声明:我拥有SpreadsheetGear LLC


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