open - read excel c#
Excel "La tabla externa no está en el formato esperado". (16)
ACE ha remplazado a JET
Ace admite 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();
Intento leer un archivo Excel (xlsx) usando el código que se muestra a continuación. Obtengo una "Tabla externa no está en el formato esperado". error a menos que tenga el archivo ya abierto en Excel. En otras palabras, tengo que abrir el archivo en Excel primero antes de poder leer si proviene de 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);
}
"La tabla externa no está en el formato esperado". normalmente ocurre cuando se intenta utilizar un archivo de Excel 2007 con una cadena de conexión que utiliza: Microsoft.Jet.OLEDB.4.0 y Propiedades extendidas = Excel 8.0
Usar la siguiente cadena de conexión parece solucionar la mayoría de los 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;";
En lugar de OleDb, puede usar la interoperabilidad de Excel y abrir la hoja de trabajo como de solo lectura.
Estaba recibiendo errores con terceros y la lectura de Oledb de un libro de trabajo de XLSX. El problema parece ser una hoja de cálculo oculta que causa un error. Al ocultar la hoja de trabajo, se habilitó el libro de trabajo para importar.
Esto puede ocurrir cuando el libro de trabajo está protegido por contraseña. Existen algunas soluciones para eliminar esta protección, pero la mayoría de los ejemplos que encontrará en línea están desactualizados. De cualquier manera, la solución simple es desproteger el libro de trabajo manualmente, de lo contrario, utilice algo como OpenXML para eliminar la protección mediante programación.
Gracias por este código :) Realmente lo aprecio. Funciona para mi.
public static string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";
Entonces, si tiene una versión de diff del archivo Excel, obtenga el nombre del archivo, si su extensión es .xlsx , use esto:
Private Const connstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";
y si es .xls , use:
Private Const connstring As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" + path + ";Extended Properties=""Excel 8.0;HDR=YES;"""
Hace poco 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: deshabilite temporalmente AutoVer.
Si todavía tienes este problema, entonces revisa tus permisos, probé muchas de estas sugerencias y mi problema concreto era que el archivo que quería procesar estaba bajo control de fuente y el hilo no tenía permisos, tuve que cambiar los permisos de la carpeta completa 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 sea eliminado por otro proceso.
Espero que te ayude.
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, MS Excel 2003 lo puede abrir normalmente. 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 que, como dijo la excepción, "no está en el formato esperado". Aunque su nombre de extensión es xls, cuando lo abro con un editor de texto, en realidad es un archivo html bien formado, todos los datos están en una <tabla>, cada <tr> es una fila y cada <td> es una celda. Entonces creo que puedo analizarlo de una manera html.
Solo agregué mi solución a este problema. Estaba cargando un archivo .xlsx al servidor web, luego leyendo de él y volviéndola a insertar en SQL Server. Estaba recibiendo el mismo mensaje de error, intenté todas las respuestas sugeridas pero ninguna funcionó. Eventualmente 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.
También he visto este error al intentar usar fórmulas INDIRECTAS complejas () 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 estaba importando y el otro no. Ambos eran 2007+ .XLSX archivos, y el motor 12.0 se instaló.
Confirmé que este era el problema por:
- Hacer una copia del archivo (aún tenía el problema, por lo que no era una diferencia de guardado)
- Seleccionar todas las celdas de la hoja con las fórmulas Indirectas
- Pegando solo como valores
y el error desapareció
También puede ser un archivo que contenga 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
Tuve este mismo problema (usando ACE.OLEDB) y lo que lo resolvió 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 de oficina, ensamblados, etc. ha llevado a la referencia ACEOleDB.dll en el registro apuntando a la carpeta OFFICE12 en lugar de a OFFICE14 en
C: / Archivos de programa / Archivos comunes / Microsoft Shared / OFFICE14 / ACEOLEDB.DLL
Desde el enlace:
De forma alternativa, puede modificar la clave de registro cambiando la ruta de acceso dll para que coincida con la de su versión de Access.
Access 2007 debe usar OFFICE12, Access 2010 - OFFICE14 y Access 2013 - OFFICE15
(SO: oficina de 64 bits: 64 bits) o (sistema operativo: oficina de 32 bits: 32 bits)
Clave: HKCR / CLSID {3BE786A0-0366-4F5C-9434-25CF162E475E} / InprocServer32 /
Nombre del valor: (predeterminado)
Datos de valor: C: / Archivos de programa / Archivos comunes / Microsoft Shared / OFFICE14 / ACEOLEDB.DLL
(SO: oficina de 64 bits: 32 bits)
Clave: HKCR / Wow6432Node / CLSID {3BE786A0-0366-4F5C-9434-25CF162E475E} / InprocServer32 /
Nombre del valor: (predeterminado)
Datos de valor: C: / Archivos de programa (x86) / Archivos comunes / Microsoft Shared / OFFICE14 / ACEOLEDB.DLL
Tuve este problema y el cambio de Propiedades extendidas a HTML Import lo arregló según this publicación de Marcus Miris:
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & importedFilePathAndName _
& ";Extended Properties=""HTML Import;HDR=No;IMEX=1"";"
el archivo puede estar bloqueado por otro proceso, debe copiarlo y luego cargarlo como se indica en esta post
(Tengo muy poca reputación para comentar, pero este es un comentario sobre la entrada de JoshCaba, usando el Ace-engine en lugar de Jet for Excel 2007)
Si no tiene Ace instalado / registrado en su máquina, puede obtenerlo en: http://www.microsoft.com/downloads/details.aspx?FamilyID=7554F536-8C28-4598-9B72-EF94E038C891&displaylang=en
Se aplica para Excel 2010 también.