【问题标题】:writing long text in excel workbook using interop throws error?使用互操作在 Excel 工作簿中编写长文本会引发错误?
【发布时间】:2010-11-05 10:46:51
【问题描述】:

我正在将长文本(1K 到 2K 个字符长,纯 xml 数据)写入 Excel 工作簿的单元格。 以下语句抛出 COM 错误 HRESULT 异常:0x800A03EC

range.set_Value(Type.Missing, data);

如果我手动将相同的 xml 复制粘贴到 excel 中,它就可以正常工作,但不能以编程方式工作。 如果我将文本剥离为 100/300 字符之类的内容,则效果很好。

【问题讨论】:

  • 我使用的是 Excel 2010 和 VSTO 4.0,它没有这样的问题。你在用什么?
  • @Sean 我的答案包含 C# 代码,链接的文章包含 VB 代码,正如您在修订版 3 中所要求的那样。
  • 我最初的想法是将数据拆分为多个不同的单元格(例如每个 100/300 个字符),然后将它们合并...草率的工作,但我认为它可以工作跨度>
  • 您使用的是什么版本的 Excel?

标签: c# .net vb.net excel com-interop


【解决方案1】:

我首先要说我自己没有尝试过,但我的研究表明您可以使用 QueryTables 来克服 911 字符的限制。

这是我发现的主要帖子,其中讨论了使用记录集作为 QueryTable 的数据源并将其添加到电子表格:http://www.excelforum.com/showthread.php?t=556493&p=1695670&viewfull=1#post1695670

这里是一些使用 QueryTables 的示例 C# 代码:import txt files using excel interop in C# (QueryTables.Add)

【讨论】:

    【解决方案2】:

    以下知识库文章解释了最大限制为 911 个字符。我在我的代码上检查了相同的内容,它适用于最多 911 个字符的字符串。

    http://support.microsoft.com/kb/818808

    本文中提到的解决方法建议确保没有单元格包含超过 911 个字符。太蹩脚了!

    【讨论】:

      【解决方案3】:

      为解决此限制,一次只写入/更新一个单元格并立即处理 Excel com 对象。并重新创建对象以写入/更新下一个单元格。

      我可以确认此解决方案在带有 Microsoft Excel 10.0 对象库 (Microsoft Office XP) 的 VS2010(VB.NET 项目)中运行

      【讨论】:

        【解决方案4】:

        此限制应该已在 Excel 2007/2010 中删除。使用 VBA 可以完成以下工作

        Sub longstr()
            Dim str1 As String
            Dim str2 As String
            Dim j As Long
        
            For j = 1 To 2000
                str1 = str1 & "a"
            Next j
            Range("a1:a5").Value2 = str1
            str2 = Range("a5").Value2
            MsgBox Len(str2)
        End Sub
        

        【讨论】:

          【解决方案5】:

          优秀的 Ole 和 excel 文章:http://support.microsoft.com/kb/316934

          以下代码更新了一个私有变量,即成功的行数,并返回一个字符串,该字符串是 excel 文件的路径。

          记得从System.IO;使用Path

          string tempXlsFilePathName; string result = new string;

                  string sheetName;
                  string queryString;
          
                  int successCounter;
          
                  // set sheetName and queryString
                  sheetName = "sheetName";
                  queryString = "CREATE TABLE " + sheetName + "([columnTitle] char(255))";
          
                  // Write .xls
                  successCounter = 0;
                  tempXlsFilePathName = (_tempXlsFilePath + @"\literalFilename.xls");
                  using (OleDbConnection connection = new OleDbConnection(GetConnectionString(tempXlsFilePathName)))
                  {
                      OleDbCommand command = new OleDbCommand(queryString, connection);
                      connection.Open();
                      command.ExecuteNonQuery();
          
                      yourCollection.ForEach(dataItem=>
                      {
                          string SQL = "INSERT INTO [" + sheetName + "$] VALUES ('" + dataItem.ToString() + "')";
                          OleDbCommand updateCommand = new OleDbCommand(SQL, connection);
                          updateCommand.ExecuteNonQuery();
                          successCounter++;
                      }
                      );
          
                      // update result with successfully written username filepath
                      result = tempXlsFilePathName;
                  }
          
                  _successfulRowsCount = successCounter;
                  return result;
          

          注:编辑匆忙,可能有一些错误。

          【讨论】:

            【解决方案6】:

            有一个限制(如果我没记错的话,大约在 800 到 900 个字符之间)几乎不可能像这样绕过。

            尝试使用 ole 连接并使用 SQL 命令插入数据。这可能对你更有效。然后,您可以根据需要使用互操作进行任何格式化。

            【讨论】:

            • 是的,限制为 911 个字符。不知道有什么解决办法。
            猜你喜欢
            • 1970-01-01
            • 2014-12-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-12
            相关资源
            最近更新 更多