在C#中parsingExcel文件,单元格似乎被截断了255个字符…我该如何阻止?

我parsing通过上传的Excel文件(xlsx)在asp.net与c#。 我正在使用下面的代码(简化):

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个字符,所以我不相信工作表本身是有限的。

只是从一个简单的谷歌search主题,看来,这是Excel的极限。

编辑 : 可能的解决方法(不幸的是在VB中)

解决scheme!

我今天也一直在和这个战斗。 我终于通过在分析Excel电子表格之前修改一些registry键来工作。

在分析Excel电子表格之前,您必须更新此registry项:

 // 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\ 

TypeGuessRows更改为0ImportMixedTypes此types的ImportMixedTypes更改为Text 。 您还需要更新连接string以在扩展属性中包含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

…字符可能被截断。 要从备注列中导入数据而不截断,必须确保至less一个采样行中的备注列包含的值超过255个字符,或者必须增加驱动程序采样的行数以包含这样一个行。 您可以通过增加HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excelregistry项下的TypeGuessRows的值来增加采样的行数。

您是否尝试过在电子表格中将列数据types设置为文本? 我相信这样做将允许单元格包含超过255个字符。

[编辑]与MS-Excel团队进行对话是值得的。 在底部的评论部分,他们讨论了关于这个255的截止点。 他们说Excel 12可以支持每个单元32k字符。

如果这是真的,那么一定有办法得到这个数据。 这是两件事情要考虑。

  1. 在过去,我使用连接string中的“IMEX = 1”选项来处理包含显示为空的混合数据的列。 这是一个很大的,但你可以试试。

  2. 你能将文件导出到制表符分隔的文件吗? 恕我直言,这是处理Excel数据最可靠的方式,因为Excel确实有这么多的陷阱。

我碰到过这个,对我来说,解决scheme是将长文本的单元格移动到电子表格的顶部。

我在一个描述这个问题的论坛上发现了这个评论

这是Jet OLEDB提供者的问题。 它看起来在前8行
的电子表格来确定每列中的数据types。 如果该列有
在前8行中不包含超过256个字符的字段值,则假定为
数据types是文本,它具有256的字符限制。下面的知识库文章有
有关此问题的更多信息: http : //support.microsoft.com/kb/281517

希望这可以帮助别人!

SpreadsheetGear for .NET可以读写xls和xlsx工作簿,并支持与Excel相同的文本限制 – 换句话说,它就可以工作。 有一个免费的评估,如果你想试试看。

免责声明:我自己的SpreadsheetGear LLC

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