【问题标题】:Parsing an Excel file in C#, the cells seem to get cut off at 255 characters... how do I stop that?在 C# 中解析 Excel 文件时,单元格似乎在 255 个字符处被截断......我该如何阻止它?
【发布时间】:2016-09-19 05:01:08
【问题描述】:

我正在使用 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 个,所以我不认为工作表本身是有限的。

【问题讨论】:

    标签: c# linq excel excel-2007 xlsx


    【解决方案1】:

    解决方案!

    我今天也一直在与这个作斗争。我终于通过在解析 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\
    

    在此键下将TypeGuessRows 更改为0ImportMixedTypes 更改为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 个字符,或者您必须 增加采样的行数 驱动程序包括这样一行。你 可以增加行数 通过增加的值采样 TypeGuessRows 下 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel 注册表项....

    【讨论】:

    • 谢谢!甚至微软自己的知识库文章也指向了相同的键,但位置错误!一旦我按照您的指示进行操作,一切正常!
    • 非常感谢!!它为我修好了。您的回答使在 30 分钟内而不是一整天内解决此问题成为可能! :)
    • 我尝试了相同的解决方案。但这对我不起作用。你能建议吗
    【解决方案2】:

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

    我在描述该问题的论坛中发现了这条评论

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

    希望这对其他人有帮助!

    【讨论】:

    • 它对我有用。我只是将行移到工作表的顶部,并且在 256 个字符后不再切断一个单元格。对于静态数据源,这是最简单的解决方法。
    【解决方案3】:

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

    [编辑] 对于 MS-Excel 团队的 this dialog 而言,这是一本有趣的读物。在底部的 cmets 部分,他们就 255 截止值进行了一些讨论。他们说 Excel 12 可以支持每个单元格 32k 个字符。

    如果这是真的,那么一定有办法获取这些数据。这里有两点需要考虑。

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

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

    【讨论】:

    • 在Excel中查看Excel文件时是数据被截断了,还是全部显示出来了?
    【解决方案4】:

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

    编辑Possible workaround (unfortunately in VB)

    【讨论】:

    • 当我查看工作表并显示超过 255 个字符时,如何限制它?
    • 来自我链接的文章的“原因”部分:“例如,如果您将超过 255 个字符的文本字符串传递给工作表或对话框表上的文本框,Excel 会截断即使一个文本框最多可以容纳 10,240 个字符,文本也是如此。"
    【解决方案5】:

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

    免责声明:我拥有 SpreadsheetGear LLC

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-05
        • 2017-01-01
        • 2010-10-28
        • 1970-01-01
        相关资源
        最近更新 更多