2009-06-24 8 views
7

Ich schreibe langen Text (1K bis 2K Zeichen lang, einfache XML-Daten) in eine Zelle in Excel-Arbeitsmappe. Die nachstehende Erklärung wirft COM Fehler Ausnahme von HRESULT: 0x800A03EClangen Text in Excel-Arbeitsmappe mit Interop-Würfe Fehler schreiben?

range.set_Value(Type.Missing, data); 

Wenn ich manuell kopieren die gleiche XML-Einfügen in Excel es funktioniert gut, aber das gleiche progamatically funktioniert nicht. Wenn ich den Text zu etwas wie 100/300 Zeichen entkleide, funktioniert es gut.

+0

Ich verwende Excel 2010 und VSTO 4.0 und es hat kein solches Problem. Was benutzt du? – user626528

+0

@Sean meine Antwort enthält C# -Code und der verknüpfte Artikel enthält VB-Code, wie Sie in Revision 3 gefordert haben. – StuperUser

+0

Mein erster Gedanke wäre, die Daten in eine Reihe von verschiedenen Zellen zu teilen (sagen wir jeweils 100/300 Zeichen) und dann diese zusammenführen ... Schlampig arbeiten, aber ich denke, es könnte funktionieren – Ortund

Antwort

5

Es gibt eine Grenze (einige zwischen 800 und 900 Zeichen, wenn ich mich richtig erinnere), dass es fast unmöglich ist, so herumzukommen.

Verwenden Sie eine Ole-Verbindung und fügen Sie die Daten mit einem SQL-Befehl ein. Das könnte für dich besser funktionieren. Sie können dann interop verwenden, um bei Bedarf Formatierungen vorzunehmen.

+4

yep, Das Limit ist 911 Zeichen. Nicht sicher, was die Lösung für dieses Problem ist. – dotnetcoder

4

Good Ole und Excel-Artikel: http://support.microsoft.com/kb/316934

Der folgende Code aktualisiert eine private Variable, die die Anzahl der erfolgreichen Reihen ist und gibt eine Zeichenfolge, die den Pfad zu der Excel-Datei ist.

Denken Sie daran, Path von System.IO; zu verwenden!

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. Dies wurde in Eile bearbeitet, könnte also einige Fehler enthalten.

5

Der folgende KB-Artikel erklärt, dass das maximale Limit 911 Zeichen beträgt. Ich habe das gleiche auf meinem Code überprüft es funktioniert für String bis 911 Zeichen.

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

Die Arbeit um in diesem Artikel erwähnt empfiehlt keine Zelle mehr als 911 Zeichen, um sicherzustellen, hält. das ist lahm!

2

Um diese Einschränkung zu beheben, schreiben/aktualisieren Sie jeweils nur eine Zelle und entfernen Sie das Excel-com-Objekt sofort. Und erstellen Sie das Objekt erneut zum Schreiben/Aktualisieren der nächsten Zelle.

Ich kann bestätigen, diese Lösung arbeitet in VS2010 (VB.NET-Projekt) mit Microsoft Excel 10.0-Objektbibliothek (Microsoft Office XP)

0

Diese Einschränkung soll in Excel 2007/2010 wurden entfernt. Mit VBA folgenden Arbeiten

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

ich sage, dass ich das selbst nicht versucht habe, beginnen würde, aber meine Forschung sagt, dass Sie Querytables zu überwinden, um die 911 Zeichenbeschränkung verwenden können.

Dies ist der primäre Beitrag, den ich gefunden habe, der über die Verwendung eines Datensatzes als Datenquelle für ein QueryTable spricht und es zu einer Tabelle hinzufügt: http://www.excelforum.com/showthread.php?t=556493&p=1695670&viewfull=1#post1695670.

Hier ist ein Beispiel C# -Code der Verwendung von QueryTables: import txt files using excel interop in C# (QueryTables.Add).

Verwandte Themen