Estoy tratando de leer un archivo Excel (xlsx) usando el código que se muestra a continuación. Me sale una "tabla externa no está en el formato esperado". error a menos que ya tenga el archivo abierto en Excel. En otras palabras, primero tengo que abrir el archivo en Excel antes de poder leerlo desde mi programa C #. El archivo xlsx está en un recurso compartido en nuestra red. ¿Cómo puedo leer el archivo sin tener que abrirlo primero? 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);
}
c#
excel-2007
xlsx
import-from-excel
Sisiutl
fuente
fuente
Respuestas:
"La tabla externa no está en el formato esperado". normalmente ocurre cuando se trata de usar un archivo de Excel 2007 con una cadena de conexión que usa: Microsoft.Jet.OLEDB.4.0 y Extended Properties = Excel 8.0
El uso de la siguiente cadena de conexión parece solucionar la mayoría de los problemas.
fuente
Gracias por este código :) Realmente lo aprecio. Funciona para mi.
Entonces, si tiene una versión diff del archivo Excel, obtenga el nombre del archivo, si su extensión es .xlsx , use esto:
y si se trata de .xls , utilice:
fuente
.xls
archivo en una PC que no tiene instalado el Jet OleDb.(Tengo muy poca reputación para comentar, pero este es un comentario sobre la entrada de JoshCaba, usando el motor Ace en lugar de Jet para Excel 2007)
Si no tiene Ace instalado / registrado en su máquina, puede obtenerlo en: https://www.microsoft.com/en-US/download/details.aspx?id=13255
Se aplica también a Excel 2010.
fuente
We're sorry, this download is no longer available
.Solo agrega mi caso. Mi archivo xls fue creado por una función de exportación de datos desde un sitio web, la extensión del archivo es xls, normalmente puede abrirse con MS Excel 2003. Pero tanto Microsoft.Jet.OLEDB.4.0 como Microsoft.ACE.OLEDB.12.0 obtuvieron un " La tabla externa no está en el formato esperado "excepción.
Finalmente, el problema es, tal como lo dijo la excepción, "no está en el formato esperado". Aunque su nombre de extensión es xls, pero cuando lo abro con un editor de texto, en realidad es un archivo html bien formado, todos los datos están en una <table>, cada <tr> es una fila y cada <td> es un célula. Entonces creo que puedo analizarlo de forma html.
fuente
Extended Properties=""HTML Import;HDR=No;IMEX=1
Yo tuve el mismo problema. que tal como se resolvió con estos pasos:
1.) Haga clic en Archivo
2.) Seleccione "guardar como"
3.) Haga clic en el menú desplegable (Guardar como tipo)
4.) Seleccione Excel 97-2003 Workbook
5.) Haga clic en el botón Guardar
fuente
Tuve este mismo problema (Uso de ACE.OLEDB) y lo que lo resolvió para mí fue este enlace:
http://support.microsoft.com/kb/2459087
La esencia de esto es que la instalación de varias versiones de Office y varios SDK, ensamblados, etc. de Office ha llevado a la referencia ACEOleDB.dll en el registro que apunta a la carpeta OFFICE12 en lugar de OFFICE14 en
Desde el enlace:
fuente
También he visto este error al intentar usar fórmulas complejas INDIRECT () en la hoja que se está importando. Me di cuenta de esto porque esta era la única diferencia entre dos libros de trabajo donde uno importaba y el otro no. Ambos eran archivos 2007+ .XLSX y se instaló el motor 12.0.
Confirmé que este era el problema:
y el error desapareció
fuente
Estaba recibiendo errores con terceros y Oledb leyendo un libro de trabajo XLSX. El problema parece ser una hoja de trabajo oculta que causa un error. Mostrar la hoja de trabajo permitió importar el libro de trabajo.
fuente
Si el archivo es de solo lectura, simplemente elimínelo y debería funcionar nuevamente.
fuente
Me encontré con el mismo problema y encontré este hilo. Ninguna de las sugerencias anteriores ayudó, excepto el comentario de @ Smith a la respuesta aceptada el 17 de abril de 2013.
El fondo de mi problema está lo suficientemente cerca de @ zhiyazw, básicamente tratando de configurar un archivo Excel exportado (SSRS en mi caso) como la fuente de datos en el paquete dtsx. Todo lo que hice, después de pensar un poco, fue renombrar la hoja de trabajo. No tiene que estar en minúsculas como ha sugerido @Smith.
Supongo que ACE OLEDB espera que el archivo de Excel siga una determinada estructura XML, pero de alguna manera Reporting Services no lo sabe.
fuente
Esa dirección de archivo de Excel puede tener una extensión incorrecta. Puede cambiar la extensión de xls a xlsx o viceversa e intentar nuevamente.
fuente
el archivo puede estar bloqueado por otro proceso, debe copiarlo y luego cargarlo como dice en esta publicación
fuente
Este también puede ser un archivo que contiene imágenes o gráficos, consulte esto: http://kb.tableausoftware.com/articles/knowledgebase/resolving-error-external-table-is-not-in-expected-format
La recomendación es guardar como Excel 2003
fuente
Solo agrego mi solución a este problema. Estaba cargando un archivo .xlsx en el servidor web, luego leía e insertaba en masa en SQL Server. Recibía el mismo mensaje de error, probé todas las respuestas sugeridas pero ninguna funcionó. Finalmente, guardé el archivo como Excel 97-2003 (.xls) que funcionó ... el único problema que tengo ahora es que el archivo original tenía más de 110,000 filas.
fuente
Si todavía tiene este problema, compruebe sus permisos, probé muchas de estas sugerencias y mi problema concreto fue que el archivo que quería procesar estaba bajo control de origen y el hilo no tenía permisos, tuve que cambiar todos los permisos de la carpeta y comenzó a funcionar (estaba procesando muchos archivos allí) ... También coincide con muchas sugerencias, como cambiar el nombre del archivo o verificar que el archivo no esté bloqueado por otro proceso.
Espero que te ayude.
fuente
Tuve este problema y el cambio de Propiedades extendidas a Importación HTML lo solucionó según esta publicación de Marcus Miris:
fuente
En lugar de OleDb, puede usar la Interoperabilidad de Excel y abrir la hoja de trabajo como solo lectura.
https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.workbooks.open(v=office.15).aspx
fuente
ACE ha reemplazado a JET
Ace admite todas las versiones anteriores de Office
¡Este código funciona bien!
fuente
Esto puede ocurrir cuando el libro de trabajo está protegido con contraseña. Existen algunas soluciones para eliminar esta protección, pero la mayoría de los ejemplos que encontrará en línea no están actualizados. De cualquier manera, la solución simple es desproteger el libro de trabajo manualmente, de lo contrario, use algo como OpenXML para eliminar la protección mediante programación.
fuente
Recientemente vi este error en un contexto que no coincidía con ninguna de las respuestas enumeradas anteriormente. Resultó ser un conflicto con AutoVer . Solución alternativa: deshabilite temporalmente AutoVer.
fuente
Recientemente tuve este "System.Data.OleDb.OleDbException (0x80004005): la tabla externa no está en el formato esperado". se produce un error Estaba confiando en Microsoft Access 2010 Runtime. Antes de la actualización que se instaló automáticamente en mi servidor el 12 de diciembre de 2018, mi código C # funcionó bien con el proveedor Microsoft.ACE.OLEDB.12.0. Después de instalar la actualización del 12 de diciembre de 2018, comencé a obtener la "Tabla externa no está en el formato esperado" en mi archivo de registro.
Abandoné el tiempo de ejecución de Microsoft Access 2010 e instalé el tiempo de ejecución de Microsoft Access 2013 y mi código C # comenzó a funcionar nuevamente sin "System.Data.OleDb.OleDbException (0x80004005): la tabla externa no está en el formato esperado". errores
Versión de 2013 que solucionó este error para mí https://www.microsoft.com/en-us/download/confirmation.aspx?id=39358
Versión de 2010 que funcionó para mí antes de la actualización que se instaló automáticamente en mi servidor el 12 de diciembre. https://www.microsoft.com/en-us/download/confirmation.aspx?id=10910 https://www.microsoft.com/en-us/download/confirmation.aspx?id=10910
También tuve este error el mes pasado en un proceso automatizado. El código C # funcionó bien cuando lo ejecuté depurando. Descubrí que la cuenta de servicio que ejecuta el código también necesitaba permisos para la carpeta C: \ Windows \ Temp.
fuente
Mi alcance consiste en la descarga de la plantilla y verifica la plantilla cuando está llena de datos.
1) Descargue un archivo de plantilla (.xlsx) con la fila del encabezado. el archivo se genera usando openxml y funciona perfectamente.
2) Cargue el mismo archivo sin ningún cambio desde su estado descargado. Esto provocará un error de conexión y falla (la conexión OLEDB se está utilizando para leer la hoja de Excel).
Aquí, si se llenan los datos, el programa funciona como se esperaba.
Cualquiera que tenga una idea del problema está conectado con el archivo que estamos creando, está en formato xml si lo abrimos y simplemente lo guardamos, lo convertimos a formato Excel y funciona bien.
¿Alguna idea para descargar Excel con el tipo de archivo preferido?
fuente
Trabajando con un código anterior y encontré esta misma excepción genérica. Es muy difícil rastrear el problema, así que pensé en agregarlo aquí en caso de que ayude a alguien más.
En mi caso, había código en otra parte del proyecto que estaba abriendo un StreamReader en el archivo de Excel antes de que OleDbConnection intentara abrir el archivo (esto se hizo en una clase base).
Básicamente, solo necesitaba llamar
Close()
primero al objeto StreamReader, luego podría abrir la conexión OleDb con éxito. No tenía nada que ver con el archivo de Excel en sí, ni con la cadena OleDbConnection (que es, naturalmente, donde estaba mirando al principio).fuente