Analisar um arquivo do Excel em C #, as células parecem ter cortado em 255 caracteres ... como posso parar com isso?

StackOverflow https://stackoverflow.com/questions/926453

Pergunta

Eu estou analisando através de um supere arquivos enviados (xlsx) em asp.net com c #. Eu estou usando o código a seguir (simplificado):

string connString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileLocation + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES\";");
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", connString);
DataSet ds = new DataSet();
adapter.Fill(ds);
adapter.Dispose();
DataTable dt = ds.Tables[0];
var rows = from p in dt.AsEnumerable() select new { desc = p[2] };

Isso funciona perfeitamente, e se há alguma coisa maior do que 255 caracteres na célula, ele será cortado. Qualquer idéia do que estou fazendo de errado? Obrigado.

EDIT:. Ao visualizar a folha de excel, ele mostra muito mais do que 255 caracteres, então eu não acredito que a folha em si é limitado

Foi útil?

Solução

Apenas a partir de um Googling rápida do assunto, parece que isso é um limite de Excel.

Editar : solução alternativa possível (infelizmente, em VB)

Outras dicas

A Solução!

Eu estive lutando esta hoje também. Eu finalmente tenho que trabalhar, modificando algumas chaves do registro antes de analisar a planilha Excel.

Você deve atualizar essa chave do Registro antes de analisar a planilha Excel:

// Excel 2010
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel\
or
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel\

// Excel 2007
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel\

// Excel 2003
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel\

Alterar TypeGuessRows para 0 e ImportMixedTypes para Text nesta chave. Você também vai precisar atualizar a seqüência de conexão para incluir IMEX=1 nas propriedades estendidas:

string connString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileLocation + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";");

Referências

http: //blogs.vertigo.com/personal/aanttila/Blog/archive/2008/03/28/excel-and-csv-reference.aspx

http://msdn.microsoft.com/en-us/library/ ms141683.aspx

... caracteres podem ser truncados. Importar para Dados a partir de uma coluna sem nota truncamento, você deve se certificar de que a coluna memorando em, pelo menos, um da linhas amostradas contém um valor mais de 255 caracteres, ou você deve aumentar o número de linhas por amostrados o motorista para incluir essa linha. Você pode aumentar o número de linhas amostradas através do aumento do valor de TypeGuessRows sob a HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel chave de registro ....

Eu deparei com este, e a solução que funcionou para mim foi para mover as células com longa texto para o topo da planilha.

Eu encontrei este comentário em um fórum descrevendo o problema

Este é um problema com o provedor Jet OLEDB. Ele olha para os primeiros 8 linhas
do folha de cálculo para determinar o tipo de dados em cada coluna. Se a coluna faz
Não contém um valor de campo sobre 256 caracteres nos primeiros 8 linhas , em seguida, ele assume a
tipo de dados é um texto, que tem um limite de caracteres de 256. O seguinte artigo KB tem
Mais informações sobre este assunto: http://support.microsoft.com/kb/281517

Espero que isso ajuda alguém!

Você já tentou definir o tipo de dados colunas de texto dentro da planilha? Acredito que fazendo isso vai permitir que as células para conter muito mais do que 255 caracteres.

[Edit] Para o que vale a pena este de diálogo que está com o MS- equipe do Excel é uma leitura interessante. Na seção de comentários na parte inferior eles entrar em algumas discussões sobre isso 255 de corte. Eles dizem Excel 12 pode suportar 32k caracteres por célula.

Se isso for verdade, deve haver uma forma de chegar a esses dados. Aqui é duas coisas a considerar.

  1. No passado, eu usei a opção "IMEX = 1" no meu seqüência de conexão para lidar com colunas contendo dados mistos aparecendo como vazio. É uma possibilidade remota, mas você pode dar um que tente.

  2. Você poderia exportar o arquivo para uma guia delimitado arquivo simples? IMHO esta é a maneira mais confiável de lidar com dados do Excel, uma vez que Excel tem tantas armadilhas.

SpreadsheetGear for .NET pode ler e escrever (e mais) xls e pastas de trabalho XLSX e suporta o mesmo limitações como Excel para texto - em outras palavras, ele vai funcionar. Há uma avaliação gratuita se você quiser experimentá-lo.

Disclaimer: eu próprio SpreadsheetGear LLC

Em relação ao último post, eu também uso SpreadsheetGear e descobrir que ele também sofre com os 255 caracteres por limitação de células durante a leitura do formato XLS mais velhos (não XLSX).

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