Pregunta

Estoy intentando leer un archivo de Excel (.xlsx) utilizando el código que se muestra a continuación. Me aparece un "tabla externa no está en el formato esperado." de error a menos que tenga el archivo ya está abierto en Excel. En otras palabras, tengo que abrir el archivo en Excel primero antes de que pueda leer si de mi programa en C #. El archivo xlsx está en un recurso compartido en nuestra red. ¿Cómo puedo leer el archivo sin tener que abrirlo por primera vez? Gracias

string sql = "SELECT * FROM [Sheet1$]";
string excelConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathname + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1;\"";

using (OleDbDataAdapter adaptor = new OleDbDataAdapter(sql, excelConnection)) {
    DataSet ds = new DataSet();
    adaptor.Fill(ds);
}
¿Fue útil?

Solución

"La tabla externa no está en el formato esperado." normalmente se produce cuando se intenta utilizar un archivo de Excel 2007 con una cadena de conexión que utiliza: Microsoft.Jet.OleDb.4.0 y Extended Properties = Excel 8.0

El uso de la cadena de conexión parece solucionar la mayoría de problemas.

public static string path = @"C:\src\RedirectApplication\RedirectApplication\301s.xlsx";
public static string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";

Otros consejos

Gracias por el código :) Realmente lo aprecio. Que funciona para mí.

public static string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";

Así que si tienes la versión diff del archivo de Excel, obtener el nombre del archivo, si su extensión es .xlsx , utilice la siguiente:

Private Const connstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";

y si es .xls , utilice:

Private Const connstring As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" + path + ";Extended Properties=""Excel 8.0;HDR=YES;"""

(tengo demasiado baja reputación para comentar, pero esto es comentario sobre el ingreso de JoshCaba, utilizando el As-motor en lugar de Jet para Excel 2007)

Si no tiene instalado el as / registrado en su máquina, lo puede conseguir en: https://www.microsoft.com/en-US/download/details.aspx?id=13255

Se aplica para Excel 2010 también.

Sólo tiene que añadir mi caso. Mi xls fue creado por una función de exportación de datos desde una página web, la extensión de archivo es xls, puede ser normalmente abierto por MS Excel 2003. Sin embargo, ambos Microsoft.Jet.OleDb.4.0 y Microsoft.ACE.OLEDB.12.0 consiguió un " la tabla externa no está en la excepción prevista formato".

Por último, el problema es, como dijo la excepción, "que no está en el formato esperado". A pesar de su nombre extensión es xls, pero cuando lo abra con un editor de texto, en realidad es un archivo HTML bien formado, todos los datos están en un

, cada uno es una fila y cada
es una celda. Entonces creo que puedo analizarlo de una manera html.

Tenía esta misma edición (Uso de la ACE.OLEDB) y lo resuelto por mí era este enlace:

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

El quid de la cuestión es que la instalación de múltiples versiones de oficina y varios SDK de oficina, asambleas, etc. había llevado a la referencia ACEOleDB.dll en el registro que apunta a la carpeta Office14 OFFICE12 en lugar de en

  

C: \ Archivos de programa \ Archivos comunes \ Microsoft Shared \ Office14 \ ACEOLEDB.DLL

Desde el enlace:

  

Como alternativa, puede modificar la clave de registro cambiar la ruta DLL para que coincida con la de la versión de acceso.

     

Access 2007 debe utilizar OFFICE12, Access 2010 - Office14 y Acceso   2013 - OFFICE15

     

(OS: Oficina de 64 bits: 64 bits) o (OS: Oficina de 32 bits: 32 bits)

     

Clave: HKCR \ CLSID {3BE786A0-0366-4F5C-9434-25CF162E475E} \ InprocServer32 \

     

Nombre del valor: (predeterminado)

     

Información del valor: C: \ Archivos de programa \ Archivos comunes \ Microsoft   Shared \ Office14 \ ACEOLEDB.DLL

     

(OS: Oficina de 64 bits: 32 bits)

     

Clave:   HKCR \ Wow6432Node \ CLSID {3BE786A0-0366-4F5C-9434-25CF162E475E} \ InprocServer32 \

     

Nombre del valor: (predeterminado)

     

Información del valor: C: \ Archivos de programa (x86) \ Archivos comunes \ Microsoft   Shared \ Office14 \ ACEOLEDB.DLL

También he visto este error al intentar utilizar complejos INDIRECTOS () fórmulas en la hoja que se está importando. Me di cuenta de esto porque esta era la única diferencia entre los dos libros de trabajo donde se estaba importando y el otro no lo era. Ambos eran 2007+ .xlsx, y se instaló el motor 12.0.

Me confirmó que era el problema:

  • Hacer una copia del archivo (todavía tenía el problema, por lo que no era una de Guardar Como diferencia)
  • Selección de todas las células en la hoja con las fórmulas indirectos
  • pegar como valores únicamente

y desapareció el error.

Me estaba errores con terceros y la lectura de un libro Oledb XLSX. El problema parece ser una hoja oculta que provoca un error. Unhiding la hoja de trabajo habilitado el libro a importar.

Yo tenía el mismo problema. que como resuelto usando estos pasos:

1.) Haga clic en Archivo

2.) Seleccione "guardar como"

3.) Haga clic en desplegables (Guardar como tipo)

introducir descripción de la imagen aquí

4). Seleccione Excel 97-2003

introducir descripción de la imagen aquí

5.) Haga clic en el botón Guardar

introducir descripción de la imagen aquí

he tenido este problema y cambiar propiedades extendidas a HTML importación fijados como por este mensaje por Marcus Miris:

strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & importedFilePathAndName _
         & ";Extended Properties=""HTML Import;HDR=No;IMEX=1"";"

En lugar de OleDb, se puede utilizar la interoperabilidad de Excel y abra la hoja de trabajo como de sólo lectura.

https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.workbooks.open (v = office.15) .aspx

topó con el mismo tema y encontraron este hilo. Ninguna de las sugerencias anteriores ayudó a excepción de comentario de Smith @ a la respuesta aceptada el abr 17 de 13.

El fondo de mi problema es lo suficientemente cerca de @ zhiyazw - básicamente tratando de establecer un archivo de Excel exportado (SSRS en mi caso) como origen de datos en el paquete dtsx. Todo lo que hice, después de algunos retoques alrededor, fue el cambio de nombre de la hoja de trabajo. No tiene que ser minúsculas como se ha sugerido @Smith.

supongo ACE OLEDB espera que el archivo de Excel que seguir una cierta estructura XML pero de alguna manera Reporting Services no es consciente de ello.

que Excel dirección de archivo puede tener una extensión incorrecta. Puede cambiar la extensión de xls a xlsx o viceversa, y vuelve a intentarlo.

Si es de sólo lectura del archivo, simplemente eliminarlo y que debería funcionar de nuevo.

el archivo podría ser bloqueado por otro proceso, es necesario copiarlo luego cargarla como se dice en este después

Esto también puede ser un archivo que contiene imágenes o gráficos, consulte la siguiente: http://kb.tableausoftware.com/articles/knowledgebase/resolving-error-external-table-is-not-in-expected-format

La recomendación es guardar como Excel 2003

Simplemente añadiendo mi solución a este problema. Yo estaba cargando un archivo .xlsx al servidor web, entonces la lectura de la misma y mayor inserción a SQL Server. Fue conseguir este mismo mensaje de error, probado todas las posibles respuestas pero ninguna funcionó. Con el tiempo he salvado el archivo de Excel 97-2003 (.xls), que trabajó ... único problema que tengo ahora es que el archivo original tenía más de 110,000 filas.

Si todavía tiene este problema, a continuación, comprobar sus permisos, he intentado muchas de estas sugerencias y mi problema concreto era que el archivo que quería proceso estaba bajo control de origen y el hilo no tenía permisos, que tenía que cambiar el permisos de carpetas enteras y empezó a trabajar (que estaba procesando muchos archivos de allí) ... también coincide con muchas sugerencias como cambiar el nombre del archivo o compruebe que el archivo no se loicked por otro proceso.

Espero que le ayuda.

ACE ha Sustituida JET

Ace soporta todas las versiones anteriores de Office

Este código funciona bien!

        OleDbConnection MyConnection;
        DataSet DtSet;
        OleDbDataAdapter MyCommand;

        MyConnection = new System.Data.OleDb.OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=..\\Book.xlsx;Extended Properties=Excel 12.0;");
        MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", MyConnection);
        DtSet = new System.Data.DataSet();

        MyCommand.Fill(DtSet);
        dataGridView1.DataSource = DtSet.Tables[0];
        MyConnection.Close();

Esto puede ocurrir cuando el libro está protegido por contraseña. Hay algunas soluciones para eliminar esta protección, pero la mayoría de los ejemplos que encontrará en línea están anticuados. De cualquier manera, la solución más sencilla es desproteger el libro manualmente, de lo contrario usar algo como OpenXML para eliminar la protección mediante programación.

Hace poco vi este error en un contexto que no coincide con ninguna de las respuestas enumeradas anteriormente. Resultó ser un conflicto con AutoVer . Solución:. Desactivar temporalmente AutoVer

Recientemente he tenido este "System.Data.OleDb.OleDbException (0x80004005): La tabla externa no está en el formato esperado." se producen errores. Me baso en Microsoft Access 2010 en tiempo de ejecución. Antes de la actualización que se instala automáticamente en mi servidor el 12 de diciembre 2018 mi código C # funcionó muy bien el uso de proveedor de Microsoft.ACE.OLEDB.12.0. Después de la actualización del 12 de diciembre fue instalado 2018 empecé a conseguir la “tabla externa no está en el formato esperado" en mi archivo de registro.

Dejé el tiempo de ejecución de Microsoft Access 2010 e instalado el tiempo de ejecución de Microsoft Access 2013 y mi código C # empecé a trabajar de nuevo sin "System.Data.OleDb.OleDbException (0x80004005). La tabla externa no está en el formato esperado" errores.

2013 versión que corrige este error para mí https://www.microsoft.com/en-us/ descarga / confirmation.aspx? id = 39358

versión 2010 que trabajó para mí antes de la actualización que se instala automáticamente en mi servidor 12 de diciembre. https://www.microsoft.com/en-us/ descarga / confirmation.aspx? id = 10910 https://www.microsoft.com/en-us/ descarga / confirmation.aspx? id = 10910

también tuve este error producirse el mes pasado en un proceso automatizado. El código C # funcionó muy bien cuando me encontré con que la depuración. He encontrado que la cuenta de servicio que se ejecuta el código de permisos también necesarios para el directorio C:. Carpeta \ Windows \ Temp

Mi alcance consiste en la plantilla de descarga y verifica la plantilla cuando está lleno de datos Por lo tanto,

1) Descargar una plantilla (.xlsx) presentar ante la fila de encabezado. el archivo se genera utilizando OpenXML y está funcionando perfectamente.

2) Sube el mismo archivo sin ningún cambio desde su estado descargado. Esto provocará un error de conexión y falla (conexión OLEDB está utilizando para la lectura de la hoja de Excel).

A continuación, si los datos que se llene el programa funciona como se esperaba.

Cualquier persona que tenga una idea del problema está relacionado con el archivo que estamos creando es en XML formato si lo abrimos y simplemente ahorrar convertirlo a formato excel y funciona bien.

¿Alguna idea para descargar el Excel con el tipo de archivo preferido?

El trabajo con algún código más viejo y me encontré con esta misma excepción genérica. Muy difícil de localizar el problema, así que pensé que me gustaría añadir aquí en caso de que ayuda a otra persona.

En mi caso, no había código de otra parte del proyecto que se estaba abriendo un StreamReader en el archivo de Excel antes OleDbConnection intentó abrir el archivo (esto se hizo en una clase base).

Así que, básicamente, sólo tenía que llamar Close() en el objeto StreamReader primero, entonces yo podría abrir la conexión OleDb éxito. No tenía nada que ver con el archivo de Excel en sí, o con la cadena OleDbConnection (que es, naturalmente, cuando yo estaba buscando en primer lugar).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top