代码之家  ›  专栏  ›  技术社区  ›  naspinski

在C中解析一个Excel文件时,单元格似乎被截断为255个字符…我该如何停止?

  •  16
  • naspinski  · 技术社区  · 15 年前

    我正在用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 回复  |  直到 8 年前
        1
  •  0
  •   Chris Doggett    15 年前

    仅仅通过快速的谷歌搜索主题,就可以看出这是Excel的极限。

    编辑 : Possible workaround (unfortunately in VB)

        2
  •  16
  •   huysentruitw Marc Gravell    9 年前

    解决办法!

    我今天也一直在和这件事作斗争。在分析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 0 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个字符,或者必须 增加采样行数 包括这样一行的驱动程序。 你 可以增加行数 通过增加 字体显示在 hkey_local_machine\software\microsoft\jet\4.0\engines\excel 注册表项….

        3
  •  4
  •   Dai Bok    8 年前

    我发现了这一点,对我有效的解决方案是将长文本单元格移到电子表格的顶部。

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

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

    希望这能帮助别人!

        4
  •  1
  •   James    15 年前

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

    [编辑] 为了它的价值 this dialog MS Excel团队是一个有趣的阅读。在底部的评论部分,他们讨论了255个截止点。他们说Excel12可以支持每个单元格32K字符。

    如果这是真的,就必须有一种方法来获取这些数据。这里有两件事要考虑。

    1. 在过去,我使用连接字符串中的“imex=1”选项来处理包含显示为空的混合数据的列。很长时间了,不过你可以试试看。

    2. 你能把文件导出到一个制表符分隔的平面文件吗?imho这是处理excel数据最可靠的方法,因为excel确实有很多gotcha。

        5
  •  0
  •   Joe Erickson    15 年前

    SpreadsheetGear for .NET 可以读写(以及更多)XLS和XLSX工作簿,并且支持与Excel相同的文本限制——换句话说,它只起作用。如果你想试一试,有一个免费的评估。

    免责声明:我拥有SpreadsheetGear LLC

        6
  •  0
  •   Der Wolf    14 年前

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