Pergunta

Eu estou tentando ler um arquivo do Excel (xlsx), utilizando o código mostrado abaixo. Recebo uma "tabela externa não está no formato esperado." erro a menos que eu tenho o arquivo já está aberto no Excel. Em outras palavras, eu tenho que abrir o arquivo em Excel primeiro antes que eu possa ler se do meu programa C #. O arquivo xlsx estiver em um compartilhamento em nossa rede. Como posso ler o arquivo sem ter que abri-la primeiro? Graças

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);
}
Foi útil?

Solução

"Tabela externa não está no formato esperado." normalmente ocorre ao tentar usar um arquivo do Excel 2007 com uma seqüência de conexão que usa: Microsoft.Jet.OLEDB.4.0 e Extensão Propriedades = Excel 8.0

Usando a seguinte seqüência de conexão parece resolver a maioria dos 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;";

Outras dicas

Obrigado por este código :) Eu realmente aprecio isso. Funciona para mim.

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

Então, se você tem diff versão do arquivo do Excel, obter o nome do arquivo, se a sua extensão é .xlsx , use o seguinte:

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

e se é .xls , use:

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

(eu tenho muito baixa reputação ao comentário, mas este é o comentário sobre a entrada da JoshCaba, usando o Ace-motor em vez de Jet para o Excel 2007)

Se você não tem Ace instalado / registado na sua máquina, você pode obtê-lo em: https://www.microsoft.com/en-US/download/details.aspx?id=13255

Aplica-se para Excel 2010 também.

Basta adicionar o meu caso. Meu arquivo xls foi criado por uma função de exportação de dados a partir de um site, a extensão do arquivo é xls, ele pode ser normalmente aberto por MS Excel 2003. Mas ambos Microsoft.Jet.OLEDB.4.0 e Microsoft.ACE.OLEDB.12.0 tem um " tabela externa não está na exceção prevista formato".

Finalmente, o problema é que, assim como a exceção, disse, "não é no formato esperado". Embora seu nome extensão é xls, mas quando eu abri-lo com um editor de texto, é na verdade um arquivo html bem formada, todos os dados estão em um

, cada é uma linha e cada
é um célula. Então eu acho que eu posso analisá-lo de uma forma html.

Eu tive esse mesmo problema (Usando o ACE.OLEDB) eo que resolveu isso para mim foi este link:

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

A essência do que é que a instalação de várias versões de escritórios e diversos escritórios SDK, montagens, etc. levou à referência ACEOleDB.dll na apontar Registro para a pasta em vez de Office14 OFFICE12 na

C: Files \ Arquivos de Programas \ Common \ Microsoft Shared \ Office14 \ ACEOLEDB.DLL

A partir do link:

Como alternativa, você pode modificar a chave do registro alterando o caminho dll para coincidir com a sua versão Access.

Access 2007 deve usar OFFICE12, Access 2010 - Office14 e Acesso 2013 - OFFICE15

(OS: 64bit escritório: 64 bits) ou (OS: 32bit escritório: 32bit)

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

Nome do valor: (Padrão)

Dados do valor: C: \ Program Files \ Common Files \ Microsoft Shared \ Office14 \ ACEOLEDB.DLL

(OS: 64bit escritório: 32bit)

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

Nome do valor: (Padrão)

Dados do valor: C: \ Program Files (x86) \ Common Files \ Microsoft Shared \ Office14 \ ACEOLEDB.DLL

Também já vi esse erro ao tentar usar complexos indireta () fórmulas na folha que está sendo importado. Notei isso porque essa era a única diferença entre duas pastas de trabalho onde se importava eo outro não. Ambos eram 2007+ arquivos .xlsx, eo motor 12.0 foi instalado.

I confirmou esta foi a questão por:

  • Fazer uma cópia do arquivo (ainda tinha o problema, por isso não era algum guardar como diferença)
  • Selecionar todas as células na folha com as fórmulas indiretas
  • Colar como Os valores só

eo erro desapareceu.

Eu estava recebendo erros com terceiros e Oledb leitura de um livro XLSX. A questão parece ser uma planilha oculto que provoca um erro. Reexibir a planilha ativado o livro para importação.

Eu tive o mesmo problema. que conforme deliberado usando essas etapas:

1.) Clique em Arquivo

2.) Selecione "Salvar como"

3.) Clique no drop-down (Salvar como tipo)

enter descrição da imagem aqui

4.) Select Excel 97-2003

enter descrição da imagem aqui

5.) Clique no botão Salvar

enter descrição da imagem aqui

Eu tive esse problema e alterar as propriedades estendidas para HTML Import fixa-lo como por este post por Marcus Miris:

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

Em vez de OleDb, você poderia usar o Interop Excel e abra a planilha como somente leitura.

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

correu para o mesmo problema e encontrou esta discussão. Nenhuma das sugestões acima ajudaram exceto para @ o comentário de Smith para a resposta aceita em 17 de abril '13.

O fundo da minha questão é perto o suficiente para o @ zhiyazw - basicamente tentando definir um arquivo do Excel exportados (SSRS no meu caso) como fonte de dados no pacote dtsx. Tudo o que fiz, depois de alguns ajustes ao redor, foi mudar o nome da planilha. Ele não tem que estar em letras minúsculas como @Smith sugeriu.

Suponho ACE OLEDB espera que o arquivo Excel para seguir uma certa estrutura XML mas de alguma forma Reporting Services não está ciente disso.

Este 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.

Se o arquivo é somente leitura, basta removê-lo e ele deve funcionar novamente.

O arquivo pode ser bloqueado por outro processo, você precisa copiá-lo, em seguida, carregá-lo como diz este pós

Isso também pode ser um arquivo que contém imagens ou gráficos, ver o seguinte: http://kb.tableausoftware.com/articles/knowledgebase/resolving-error-external-table-is-not-in-expected-format

A recomendação é para salvar o Excel 2003

Basta adicionar a minha solução para esta questão. Eu estava carregando um arquivo .xlsx para o servidor web, em seguida, ler a partir dele e em massa inserir para SQL Server. Estava ficando esta mesma mensagem de erro, tentou todas as respostas sugeridas, mas nenhum funcionou. Eventualmente eu salvou o arquivo como Excel 97-2003 (.xls) que trabalhou ... único problema que tenho agora é que o arquivo original tinha 110,000+ linhas.

Se você ainda tiver este problema, em seguida, verifique as suas permissões, eu tentei muitas destas sugestões e meu problema concreto foi que o arquivo que eu queria processo estava sob controle de origem e o fio não tinha permissões, eu tive que mudar o inteiros permissões de pasta e começou a trabalhar (eu estava processando muitos arquivos em lá) ... ele também corresponde muitas sugestões, como a mudança do nome do arquivo ou verifique se o arquivo não é loicked por outro processo.

Eu espero que o ajude.

ACE tem substituído JET

Ace Suporta todas as versões anteriores do Office

Este código funciona bem!

        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();

Isso pode ocorrer quando o livro é protegido por senha. Há algumas soluções alternativas para remover essa proteção, mas a maioria dos exemplos que você vai encontrar on-line estão desatualizados. De qualquer maneira, a solução mais simples é para desproteger a pasta de trabalho manualmente, caso contrário, usar algo como OpenXML para remover a proteção de programação.

Recentemente, vi esse erro em um contexto que não encontrou nenhum das respostas listadas anteriormente. Ele acabou por ser um conflito com AutoVer . Solução:. Desativar temporariamente AutoVer

Eu tive recentemente esta "System.Data.OleDb.OleDbException (0x80004005): Tabela externa não está no formato esperado." de erro ocorrer. Eu estava contando com o Microsoft Access 2010 Runtime. Antes da atualização que foi instalado automaticamente no meu servidor em 12 de dezembro de 2018 meu código C # funcionou muito bem usando o provedor Microsoft.ACE.OLEDB.12.0. Após a atualização a partir de 12 de dezembro de 2018 foi instalado comecei a obter a “Tabela externa não está no formato esperado" no meu arquivo de log.

I abandonou o Runtime Microsoft Access 2010 e instalado o Microsoft Access 2013 Runtime e meu código C # começou a trabalhar novamente com não "System.Data.OleDb.OleDbException (0x80004005): Tabela externa não está no formato esperado." erros.

2013 versão que fixa esse erro para mim https://www.microsoft.com/en-us/ download / confirmation.aspx? id = 39358

2010 versão que funcionou para mim antes da atualização que foi instalado 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 ocorrer no mês passado em um processo automatizado. A C # correu código bem quando eu corri depuração. Descobri que a conta de serviço que executa o código de permissões também necessários para a C:. Pasta Temp \ Windows \

Meu escopo consiste em baixar modelo e verifica o modelo quando ela está cheia de dados Então,

1) Baixar um modelo (.xlsx) arquivo com a linha de cabeçalho. o arquivo é gerado usando OpenXML e está funcionando perfeitamente.

2) Carregar o mesmo arquivo sem qualquer alteração do seu estado descarregado. Isso fará com que um erro de conexão e falha (conexão OLEDB está usando para ler a folha de excel).

Aqui, se os dados são preenchidos o programa funciona como esperado.

Qualquer pessoa ter uma idéia a questão está relacionada com o arquivo que estamos criando é em xml formato se abri-lo e apenas salvar convertê-lo no formato Excel e funciona bem.

Qualquer idéia para fazer o download do excel com o tipo de arquivo preferido?

Trabalho com algum código antigo e me deparei com essa mesma exceção genérica. Muito difícil de rastrear o problema, então eu pensei que eu ia acrescentar aqui no caso de ajuda de outra pessoa.

No meu caso, houve código em outras partes do projeto que estava abrindo um StreamReader no arquivo Excel antes o OleDbConnection tentou abrir o arquivo (isso foi feito em uma classe base).

Então, basicamente, eu só precisava chamar Close() no objeto StreamReader em primeiro lugar, então eu poderia abrir a conexão OleDb com sucesso. Não tinha nada a ver com o arquivo Excel em si, ou com a seqüência OleDbConnection (que é, naturalmente, onde eu estava olhando em primeiro lugar).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top