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

4

6 回答 6

19

解决方案!

我今天也一直在和这个作斗争。我终于通过在解析 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。您还需要更新连接字符串以包含在扩展属性中:ImportMixedTypesTextIMEX=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 个字符的值,或者您必须增加驱动程序采样的行数以包含这样的排。您可以通过增加 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel 注册表项下的 TypeGuessRows 的值来增加采样的行数。...

于 2010-09-27T17:41:37.067 回答
6

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

我在描述该问题的论坛中找到了此评论

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

希望这对其他人有帮助!

于 2016-09-18T21:01:08.470 回答
1

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

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

如果这是真的,那么必须有一种方法可以获取这些数据。这里有两点需要考虑。

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

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

于 2009-05-29T15:06:15.797 回答
0

仅通过对该主题的快速谷歌搜索,这似乎是 Excel 的限制。

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

于 2009-05-29T15:02:15.367 回答
0

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

免责声明:我拥有 SpreadsheetGear LLC

于 2009-05-29T16:35:29.110 回答
0

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

于 2010-09-03T15:40:56.993 回答