2009-06-24 10 views
7

Excelブックのセルに長いテキスト(1K〜2K文字の長さ、単純なxmlデータ)を書き込んでいます。 以下のステートメントは、HRESULTからのCOMエラー例外がスローされます。0x800A03ECinterop throwsエラーを使用してExcelブックに長いテキストを書き込んでいますか?

range.set_Value(Type.Missing, data); 

私はExcelに手動で同じXMLをコピー&ペーストした場合、それはうまく動作しますが、同じことがprogamatically動作しません。 テキストを100/300文字のように切り取っても問題ありません。

+0

Excel 2010とVSTO 4.0を使用していますが、このような問題はありません。あなたは何を使用していますか? – user626528

+0

@Sean my answerにはC#コードが含まれています。リビジョン3で尋ねたように、リンクされたアーティクルにはVBコードが含まれています。 – StuperUser

+0

私の最初の考えは、データをさまざまなセル(それぞれ100/300文字)に分割してそれらをマージすることです...残念ながら回避できますが、うまくいくと思います – Ortund

答えて

5

このように回避することはほとんど不可能です(私は正しく覚えていれば800から900文字の間にいくつかの制限があります)。

OLE接続を使用し、SQLコマンドでデータを挿入してみてください。それはあなたのためにうまくいくかもしれません。必要に応じてinteropを使用して任意の書式設定を行うことができます。

+4

ええ、制限は911文字です。これに対する解決策が何であるかは不明です。 – dotnetcoder

4

グッドオーレやExcelの記事:http://support.microsoft.com/kb/316934

次のコードは、成功した行数で、Excelファイルへのパスを表す文字列を返しますプライベート変数を更新します。

Pathから覚えておいてください。System.IO;

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; 

N.B.これは急いで編集されたので、間違いを含んでいる可能性があります。

5

次のKB記事では、最大制限は911文字であることが説明されています。私はそれが911文字までの文字列のために働く私のコードで同じをチェックした。

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

周りにこの資料に記載の作業には、セル以上911個の文字を保持していないことを確認することをお勧めします。ださいよ!

2

この制限を解決するには、一度に1つのセルを書き込み/更新し、Excelのcomオブジェクトをすぐに破棄します。次のセルの書き込み/更新のために再びオブジェクトを再作成します。

私は、このソリューションは、この制限がExcel 2007/2010で削除されたことになっている

0

のMicrosoft Excel 10.0オブジェクトライブラリ(のMicrosoft Office XP)でVS2010(VB.NETプロジェクト)で作業されていることを確認することができます。以下は、

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 
0

を作品VBAを使用すると、私はこれを自分で試していないが、私の研究は、あなたが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)

関連する問題