2009-05-22 22 views
11

estoy usando la clase OleDbConnection para recuperar datos de un Excel 2000/2003 libro:-valores de las celdas de Excel se truncan por OLEDB proveedor

string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + 
          "Data Source=" + filename + ";" + 
          "Extended Properties=\"Excel 8.0;IMEX=1\";"; 

OleDbConnection connection = new OleDbConnection(connectionString); 
connection.Open(); 

// code to get table name from schema omitted 

var dataAdapter = new OleDbDataAdapter(string.Format("SELECT * FROM [{0}]", name),connection); 
var myDataSet = new DataSet(); 
dataAdapter.Fill(myDataSet, "ExcelInfo"); 

Ahora resulta que las células en la hoja de trabajo con longitud mayor de 255 caracteres están siendo truncados. ¿Es esto una limitación en el proveedor Microsoft.Jet.OLEDB, o hay algo que pueda hacer al respecto?

¿Alguien?

Respuesta

17

El proveedor OLEDB para Excel intentará determinar automáticamente los tipos de datos basados ​​en las primeras 8 filas de datos, esto se puede establecer con la propiedad HDR = Yes/No en la cadena de conexión. Además, hay varios tipos que puede aplicar a columnas de texto. El tipo de memo posee más de 255 caracteres, por lo que si ninguna de las primeras 8 filas tiene eso, entonces establecerá incorrectamente el tipo de datos.

La manera de cambiar esto es cambiando la configuración de registro denominada TypeGuessRows, tal como se describe aquí: Microsoft Support

NOTA: El rango válido de valores para la clave TypeGuessRows es de 0 a 16. Sin embargo, si el valor es 0 , el número de filas de origen escaneadas es 16384. Por lo tanto, si tiene un archivo muy grande, asegúrese de que las filas más grandes estén primero.

+1

Gracias. Es una solución algo fea, ya que mi instalador tendrá que modificar el registro del usuario, pero espero que funcione. Mientras un administrador ejecute el instalador ... –

+1

no entiendo la sugerencia de microsofts aquí/si la cambias a 16 ¿no solo verifica las primeras 16 filas? – leora

+1

@ooo Si lo cambia a 0, entonces escanea todas las filas. Tenga cuidado, ya que esto puede tener un impacto en el rendimiento en tablas más grandes. – rmoore

1

Probar este OleDBAdapter Excel QA He publicado a través de desbordamiento de pila.

que poblaron una celda de la hoja (Filas [0] [4]) w/445 caracteres y funcionó bien ... Añadir esto al final del código para que la salida

// DataSet:   
Object row0Col3 = ds.Tables["xlsImport"].Rows[0][2]; 
Object row0Col4 = ds.Tables["xlsImport"].Rows[0][4]; 

string rowZeroColumn3 = row0Col3.ToString(); 
string rowZeroColumn4 = row0Col4.ToString(); 

Console.WriteLine("Row 0, Col 4 string length: {0} " + Environment.NewLine + "Excel content: {1}", rowZeroColumn4.Length, rowZeroColumn4);   
Cuestiones relacionadas