2009-06-24 20 views
7

Estoy escribiendo texto largo (1K a 2K caracteres de longitud, datos xml simples) en una celda en el libro de Excel. La declaración a continuación lanza el error COM excepción de HRESULT: 0x800A03ECescribiendo texto largo en el libro de trabajo de excel usando el error de interpo throws?

range.set_Value(Type.Missing, data); 

Si copio pegar el mismo XML manualmente en Excel simplemente funciona bien, pero el mismo no funciona progamatically. Si elimino el texto a algo así como 100/300 caracteres, funciona bien.

+0

Estoy usando Excel 2010 y VSTO 4.0 y no tiene ese problema. ¿Qué estás usando? – user626528

+0

@Sean mi respuesta contiene el código C# y el artículo vinculado contiene el código VB, como solicitó en la revisión 3. – StuperUser

+0

Mi idea inicial era dividir los datos en varias celdas diferentes (digamos 100/300 caracteres cada uno) y luego combinarlos ... Sloppy funciona, pero creo que podría funcionar – Ortund

Respuesta

5

Hay un límite (somehwere entre 800 y 900 caracteres, si no recuerdo mal) que es casi imposible de conseguir alrededor de esta manera.

Intente utilizar una conexión ole e inserte los datos con un comando SQL. Eso podría funcionar mejor para ti. luego puede usar interoperabilidad para hacer cualquier formateo si es necesario.

+4

sí, el límite es de 911 caracteres. No estoy seguro de cuál es la solución para esto. – dotnetcoder

4

Good Ole y sobresalir artículo: http://support.microsoft.com/kb/316934

El siguiente código actualiza una variable privada que es el número de filas de éxito y devuelve una cadena que es la ruta de acceso al archivo de Excel.

recuerde utilizar Path de 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. Esto fue editado con prisa, por lo que puede contener algunos errores.

5

el siguiente artículo de KB explica que el límite máximo es de 911 caracteres. Comprobé lo mismo en mi código, funciona para string hasta 911 caracteres.

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

El trabajo alrededor mencionado en este artículo recomienda para asegurarse de que ninguna célula contiene más de 911 caracteres. ¡eso es patético!

2

Para resolver esta limitación, solamente escribir/actualización de una célula a la vez y disponer el objeto COM de Excel inmediatamente. Y vuelva a crear el objeto para escribir/actualizar la siguiente celda.

puedo confirmar esta solución funciona en VS2010 (proyecto VB.NET) con Microsoft Excel 10.0 Object Library (Microsoft Office XP)

0

se supone Esta limitación haber sido eliminado en Excel 2007/2010. El uso de VBA las siguientes obras

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

Voy a empezar diciendo que no he probado esto por mí mismo, pero mi investigación dice que puede utilizar QueryTables para superar la limitación de 911 caracteres.

Esta es la publicación principal que encontré que habla sobre el uso de un conjunto de registros como fuente de datos para una QueryTable y agregarla a una hoja de cálculo: http://www.excelforum.com/showthread.php?t=556493&p=1695670&viewfull=1#post1695670.

Aquí es un poco de muestra de código C# de utilizar QueryTables: import txt files using excel interop in C# (QueryTables.Add).

Cuestiones relacionadas