在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
更改为0
, ImportMixedTypes
此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字符。
如果这是真的,那么一定有办法得到这个数据。 这是两件事情要考虑。
-
在过去,我使用连接string中的“IMEX = 1”选项来处理包含显示为空的混合数据的列。 这是一个很大的,但你可以试试。
-
你能将文件导出到制表符分隔的文件吗? 恕我直言,这是处理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个字符的限制。