Estou usando o OleDb para ler uma pasta de trabalho do Excel com muitas planilhas.
Preciso ler os nomes das planilhas, mas preciso deles na ordem em que estão definidos na planilha; então, se eu tiver um arquivo parecido com este;
|_____|_____|____|____|____|____|____|____|____|
|_____|_____|____|____|____|____|____|____|____|
|_____|_____|____|____|____|____|____|____|____|
\__GERMANY__/\__UK__/\__IRELAND__/
Então eu preciso pegar o dicionário
1="GERMANY",
2="UK",
3="IRELAND"
Eu tentei usar OleDbConnection.GetOleDbSchemaTable()
e isso me dá uma lista de nomes, mas os classifica em ordem alfabética. A classificação alfa significa que não sei a qual número de folha corresponde um determinado nome. Então eu consigo;
GERMANY, IRELAND, UK
que mudou a ordem de UK
e IRELAND
.
A razão pela qual preciso que seja classificado é que devo deixar o usuário escolher um intervalo de dados por nome ou índice; eles podem pedir 'todos os dados da ALEMANHA para a IRLANDA' ou 'dados da folha 1 à folha 3'.
Quaisquer ideias seriam muito apreciadas.
se eu pudesse usar as aulas de interoperabilidade de escritório, isso seria simples. Infelizmente, não posso porque as classes de interoperabilidade não funcionam de forma confiável em ambientes não interativos, como serviços do Windows e sites ASP.NET, então precisei usar OLEDB.
fonte
Respostas:
Não é possível encontrar isso na documentação real do MSDN, mas um moderador nos fóruns disse
Nomes de planilhas do Excel na ordem das planilhas
Parece que esse seria um requisito comum o suficiente para que houvesse uma solução alternativa decente.
fonte
Você não pode simplesmente percorrer as folhas de 0 a Contagem de nomes -1? dessa forma, você deve colocá-los na ordem correta.
Editar
Percebi através dos comentários que há muitas preocupações sobre o uso das classes Interop para recuperar os nomes das planilhas. Portanto, aqui está um exemplo usando OLEDB para recuperá-los:
Extraído do artigo no CodeProject.
fonte
Uma vez que o código acima não cobre os procedimentos para extrair a lista do nome da planilha para o Excel 2007, o código a seguir também será aplicável para o Excel (97-2003) e o Excel 2007:
A função acima retorna uma lista de planilhas em um arquivo excel específico para ambos os tipos de excel (97,2003,2007).
fonte
Isso é curto, rápido, seguro e utilizável ...
fonte
exceladdress
- o que é isso?Outra maneira:
um arquivo xls (x) é apenas uma coleção de arquivos * .xml armazenados em um contêiner * .zip. descompacte o arquivo "app.xml" na pasta docProps.
O arquivo é um arquivo alemão (Arbeitsblätter = planilhas). Os nomes das tabelas (Tabelle3 etc) estão na ordem correta. Você só precisa ler essas tags;)
Saudações
fonte
Criei a função abaixo usando as informações fornecidas na resposta de @kraeppy ( https://stackoverflow.com/a/19930386/2617732 ). Isso requer que o .net framework v4.5 seja usado e requer uma referência a System.IO.Compression. Isso só funciona para arquivos xlsx e não para os arquivos xls mais antigos.
fonte
Gosto da ideia de @deathApril para nomear as planilhas como 1_Germany, 2_UK, 3_IRELAND. Também recebi o seu problema para renomear centenas de planilhas. Se você não tiver problemas para renomear o nome da planilha, poderá usar esta macro para fazer isso por você. Levará menos de segundos para renomear todos os nomes de planilhas. infelizmente ODBC, OLEDB retornar a ordem do nome da folha por asc. Não há substituto para isso. Você deve usar COM ou renomear seu nome para que esteja no pedido.
ATUALIZAÇÃO: Depois de ler o comentário de @SidHoland sobre o BIFF, uma ideia surgiu. As etapas a seguir podem ser executadas por meio de código. Não sei se você realmente deseja fazer isso para colocar os nomes das planilhas na mesma ordem. Avise-me se precisar de ajuda para fazer isso por meio de código.
ATUALIZAÇÃO: Outra solução - NPOI pode ser útil aqui http://npoi.codeplex.com/
Esta solução funciona para xls. Eu não tentei xlsx.
Obrigado,
Esen
fonte
Isso funcionou para mim. Roubado daqui: como você consegue o nome da primeira página de uma pasta de trabalho do Excel?
fonte
Experimente isso. Aqui está o código para colocar os nomes das folhas em ordem.
fonte
Excel.XlFileFormat.xlWorkbookNormal
)De acordo com o MSDN, em um caso de planilhas dentro do Excel, pode não funcionar porque os arquivos do Excel não são bancos de dados reais. Assim, você não conseguirá obter o nome das planilhas na ordem de sua visualização na pasta de trabalho.
Código para obter o nome das folhas de acordo com sua aparência visual usando interoperabilidade:
Adicione referência à Biblioteca de objetos do Microsoft Excel 12.0.
O código a seguir fornecerá o nome das planilhas na ordem real armazenada na pasta de trabalho, não o nome classificado.
Código de amostra:
fonte
Não vejo nenhuma documentação que diga que a ordem em app.xml é garantida como a ordem das planilhas. PROVAVELMENTE é, mas não de acordo com a especificação OOXML.
O arquivo workbook.xml, por outro lado, inclui o atributo sheetId, que determina a sequência - de 1 ao número de folhas. Isso está de acordo com a especificação OOXML. workbook.xml é descrito como o local onde a sequência das planilhas é mantida.
Portanto, a leitura do workbook.xml depois de extraído do XLSX seria minha recomendação. NÃO app.xml. Em vez de docProps / app.xml, use xl / workbook.xml e observe o elemento, conforme mostrado aqui -
`
`
fonte