Estou tentando ler um arquivo do Excel (xlsx) usando o código mostrado abaixo. Eu recebo uma "tabela externa não está no formato esperado". erro, a menos que eu já tenha o arquivo aberto no Excel. Em outras palavras, eu tenho que abrir o arquivo no Excel primeiro antes de poder ler se do meu programa C #. O arquivo xlsx está em um compartilhamento em nossa rede. Como posso ler o arquivo sem precisar abri-lo primeiro? obrigado
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
fonte
fonte
Respostas:
"A tabela externa não está no formato esperado." geralmente ocorre ao tentar usar um arquivo do Excel 2007 com uma cadeia de conexão que usa: Microsoft.Jet.OLEDB.4.0 e Propriedades estendidas = Excel 8.0
O uso da seguinte cadeia de conexão parece corrigir a maioria dos problemas.
fonte
Obrigado por este código :) Eu realmente aprecio isso. Funciona para mim.
Portanto, se você possui a versão diff do arquivo do Excel, obtenha o nome do arquivo, se a extensão for .xlsx , use o seguinte:
e se for .xls , use:
fonte
.xls
arquivo em um PC que não tenha o Jet OleDb instalado.(Tenho reputação muito baixa para comentar, mas isso é comentário sobre a entrada de JoshCaba, usando o mecanismo Ace em vez do Jet for Excel 2007)
Se você não tem o Ace instalado / registrado em sua máquina, pode obtê-lo em: https://www.microsoft.com/en-US/download/details.aspx?id=13255
Também se aplica ao Excel 2010.
fonte
We're sorry, this download is no longer available
.Apenas adicione meu caso. Meu arquivo xls foi criado por uma função de exportação de dados de um site, a extensão do arquivo é xls, normalmente pode ser aberta pelo MS Excel 2003. Mas o Microsoft.Jet.OLEDB.4.0 e o Microsoft.ACE.OLEDB.12.0 obtiveram um " A tabela externa não está no formato esperado "exceção.
Por fim, o problema é, assim como a exceção disse, "não está no formato esperado". Embora o nome da extensão seja xls, mas quando eu o abro com um editor de texto, na verdade é um arquivo html bem formado, todos os dados estão em uma <table>, cada <tr> é uma linha e cada <td> é um célula. Então eu acho que posso analisá-lo de uma maneira html.
fonte
Extended Properties=""HTML Import;HDR=No;IMEX=1
Eu tive o mesmo problema. que foi resolvido usando estas etapas:
1.) Clique em Arquivo
2.) Selecione "salvar como"
3.) Clique no menu suspenso (Salvar como tipo)
4.) Selecione Pasta de trabalho do Excel 97-2003
5.) Clique no botão Salvar
fonte
Eu tive esse mesmo problema (usando o ACE.OLEDB) e o que resolveu para mim foi este link:
http://support.microsoft.com/kb/2459087
O essencial é que a instalação de várias versões do Office e vários sdks, assemblies etc. do escritório levou à referência ACEOleDB.dll no registro, apontando para a pasta OFFICE12 em vez do OFFICE14 em
No link:
fonte
Também vi esse erro ao tentar usar fórmulas complexas INDIRECT () na planilha que está sendo importada. Percebi isso porque essa era a única diferença entre duas pastas de trabalho em que uma estava importando e a outra não. Ambos tinham mais de 2007 arquivos .XLSX e o mecanismo 12.0 foi instalado.
Confirmei que esse era o problema:
e o erro desapareceu.
fonte
Eu estava recebendo erros com a leitura de uma pasta de trabalho XLSX e de Oledb de terceiros. O problema parece ser uma planilha oculta que causa um erro. Mostrar novamente a planilha permitiu a importação da pasta de trabalho.
fonte
Se o arquivo for somente leitura, remova-o e ele deverá funcionar novamente.
fonte
Ocorreu o mesmo problema e encontrou este tópico. Nenhuma das sugestões acima ajudou, exceto o comentário de @ Smith à resposta aceita em 17 de abril de 13.
O pano de fundo do meu problema está próximo o suficiente do @ zhiyazw's - basicamente tentando definir um arquivo do Excel exportado (SSRS no meu caso) como fonte de dados no pacote dtsx. Tudo o que fiz, depois de alguns ajustes, foi renomear a planilha. Não precisa ser minúsculo, como o @Smith sugeriu.
Suponho que o ACE OLEDB espera que o arquivo do Excel siga uma certa estrutura XML, mas de alguma forma o Reporting Services não está ciente disso.
fonte
Esse endereço de arquivo do Excel pode ter uma extensão incorreta. Você pode alterar a extensão de xls para xlsx ou vice-versa e tente novamente.
fonte
o arquivo pode estar bloqueado por outro processo, você precisa copiá-lo e carregá-lo, como diz nesta postagem
fonte
Também pode ser um arquivo que contém imagens ou gráficos. Consulte: http://kb.tableausoftware.com/articles/knowledgebase/resolving-error-external-table-is-not-in-expected-format
A recomendação é salvar como Excel 2003
fonte
Apenas adicionando minha solução a esse problema. Eu estava carregando um arquivo .xlsx no servidor da Web, depois lendo e inserindo em massa no SQL Server. Estava recebendo a mesma mensagem de erro, tentei todas as respostas sugeridas, mas nenhuma funcionou. Eventualmente, salvei o arquivo como excel 97-2003 (.xls), que funcionou ... o único problema que tenho agora é que o arquivo original tinha mais de 110.000 linhas.
fonte
Se você ainda tiver esse problema, verifique suas permissões, tentei muitas dessas sugestões e meu problema concreto era que o arquivo que eu queria processar estava sob controle de origem e o thread não tinha permissões, tive que alterar as permissões da pasta inteira e começou a funcionar (eu estava processando muitos arquivos lá) ... Ele também corresponde a muitas sugestões, como alterar o nome do arquivo ou verificar se o arquivo não foi bloqueado por outro processo.
Espero que ajude você.
fonte
Eu tive esse problema e alterar as propriedades estendidas para importação de HTML corrigiu-o conforme esta postagem de Marcus Miris:
fonte
Em vez de OleDb, você pode usar a interoperabilidade do Excel e abrir a planilha como somente leitura.
https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.workbooks.open(v=office.15).aspx
fonte
O ACE substituiu o JET
Ace suporta todas as versões anteriores do Office
Este código funciona bem!
fonte
Isso pode ocorrer quando a pasta de trabalho está protegida por senha. Existem algumas soluções alternativas para remover essa proteção, mas a maioria dos exemplos que você encontrará online está desatualizada. De qualquer maneira, a solução simples é desproteger a pasta de trabalho manualmente, caso contrário, use algo como o OpenXML para remover a proteção programaticamente.
fonte
Vi recentemente esse erro em um contexto que não correspondia a nenhuma das respostas listadas anteriormente. Acabou sendo um conflito com o AutoVer . Solução alternativa: desative temporariamente o AutoVer.
fonte
Recentemente, tive este "System.Data.OleDb.OleDbException (0x80004005): tabela externa não está no formato esperado." ocorrer um erro. Eu estava contando com o Microsoft Access 2010 Runtime. Antes da atualização que foi instalada automaticamente no meu servidor em 12 de dezembro de 2018, meu código C # funcionou bem usando o provedor Microsoft.ACE.OLEDB.12.0. Após a instalação da atualização de 12 de dezembro de 2018, comecei a obter a tabela "A tabela externa não está no formato esperado" no meu arquivo de log.
Abaixei o tempo de execução do Microsoft Access 2010 e instalei o tempo de execução do Microsoft Access 2013 e meu código C # começou a funcionar novamente sem "System.Data.OleDb.OleDbException (0x80004005): tabela externa não está no formato esperado." erros.
Versão 2013 que corrigiu esse erro para mim https://www.microsoft.com/en-us/download/confirmation.aspx?id=39358
Versão 2010 que funcionou para mim antes da atualização que foi instalada automaticamente no meu servidor em 12 de dezembro. https://www.microsoft.com/en-us/download/confirmation.aspx?id=10910 https://www.microsoft.com/en-us/download/confirmation.aspx?id=10910
Eu também tive esse erro no mês passado em um processo automatizado. O código C # funcionou bem quando eu executei a depuração. Descobri que a conta de serviço que executava o código também precisava de permissões para a pasta C: \ Windows \ Temp.
fonte
Meu escopo consiste no download do modelo e verifica o modelo quando é preenchido com dados. Portanto,
1) Faça o download de um arquivo de modelo (.xlsx) com a linha do cabeçalho. o arquivo é gerado usando openxml e está funcionando perfeitamente.
2) Carregue o mesmo arquivo sem nenhuma alteração no estado baixado. Isso causará um erro de conexão e falhará (a conexão OLEDB está sendo usada para ler a planilha do Excel).
Aqui, se os dados forem preenchidos, o programa funcionará conforme o esperado.
Qualquer pessoa que tenha uma ideia de que o problema está conectado ao arquivo que estamos criando, está em xml formato , se o abrirmos e salvarmos, convertê-lo para o formato Excel e funcionar bem.
Alguma idéia para baixar o excel com o tipo de arquivo preferido?
fonte
Trabalhando com algum código mais antigo e encontrei essa mesma exceção genérica. Muito difícil rastrear o problema, então pensei em adicionar aqui caso isso ajude outra pessoa.
No meu caso, havia código em outro lugar do projeto que estava abrindo um StreamReader no arquivo do Excel antes o OleDbConnection tentasse abrir o arquivo (isso foi feito em uma classe base).
Então, basicamente, eu só precisava chamar
Close()
o objeto StreamReader primeiro, para poder abrir a Conexão OleDb com êxito. Não tinha nada a ver com o próprio arquivo do Excel ou com a string OleDbConnection (que é naturalmente onde eu estava olhando primeiro).fonte