J'utilise OleDb pour lire à partir d'un classeur Excel avec de nombreuses feuilles.
J'ai besoin de lire les noms des feuilles, mais j'en ai besoin dans l'ordre dans lequel ils sont définis dans la feuille de calcul; donc si j'ai un fichier qui ressemble à ceci;
|_____|_____|____|____|____|____|____|____|____|
|_____|_____|____|____|____|____|____|____|____|
|_____|_____|____|____|____|____|____|____|____|
\__GERMANY__/\__UK__/\__IRELAND__/
Ensuite, j'ai besoin du dictionnaire
1="GERMANY",
2="UK",
3="IRELAND"
J'ai essayé d'utiliser OleDbConnection.GetOleDbSchemaTable()
, et cela me donne la liste des noms, mais cela les trie par ordre alphabétique. Le tri alpha signifie que je ne sais pas à quel numéro de feuille correspond un nom particulier. Alors je reçois;
GERMANY, IRELAND, UK
qui a changé l'ordre de UK
et IRELAND
.
La raison pour laquelle j'ai besoin qu'il soit trié est que je dois laisser l'utilisateur choisir une plage de données par nom ou par index; ils peuvent demander «toutes les données de l'ALLEMAGNE vers l'IRLANDE» ou «les données de la feuille 1 à la feuille 3».
Toutes les idées seraient grandement appréciées.
si je pouvais utiliser les classes d'interopérabilité de bureau, ce serait simple. Malheureusement, je ne peux pas car les classes d'interopérabilité ne fonctionnent pas de manière fiable dans des environnements non interactifs tels que les services Windows et les sites ASP.NET, j'ai donc dû utiliser OLEDB.
la source
Réponses:
Impossible de trouver cela dans la documentation MSDN réelle, mais un modérateur des forums a dit
Noms des feuilles Excel dans l'ordre des feuilles
Il semble que ce soit une exigence assez courante pour qu'il y ait une solution de contournement décente.
la source
Ne pouvez-vous pas simplement parcourir les feuilles de 0 au nombre de noms -1? de cette façon, vous devriez les obtenir dans le bon ordre.
Éditer
J'ai remarqué à travers les commentaires que l'utilisation des classes Interop pour récupérer les noms de feuille suscitait de nombreuses inquiétudes. Voici donc un exemple utilisant OLEDB pour les récupérer:
Extrait de l' article sur le CodeProject.
la source
Étant donné que le code ci-dessus ne couvre pas les procédures d'extraction de la liste des noms de feuille pour Excel 2007, le code suivant sera également applicable pour Excel (97-2003) et Excel 2007:
La fonction ci-dessus renvoie la liste des feuilles dans un fichier Excel particulier pour les deux types Excel (97,2003,2007).
la source
C'est court, rapide, sûr et utilisable ...
la source
exceladdress
- Qu'est-ce que c'est?Autrement:
un fichier xls (x) est juste une collection de fichiers * .xml stockés dans un conteneur * .zip. décompressez le fichier "app.xml" dans le dossier docProps.
Le fichier est un fichier allemand (Arbeitsblätter = feuilles de calcul). Les noms de table (Tabelle3, etc.) sont dans le bon ordre. Il vous suffit de lire ces balises;)
Cordialement
la source
J'ai créé la fonction ci-dessous en utilisant les informations fournies dans la réponse de @kraeppy ( https://stackoverflow.com/a/19930386/2617732 ). Cela nécessite l'utilisation du framework .net v4.5 et une référence à System.IO.Compression. Cela ne fonctionne que pour les fichiers xlsx et non pour les anciens fichiers xls.
la source
J'aime l'idée de @deathApril de nommer les feuilles comme 1_Germany, 2_UK, 3_IRELAND. J'ai également eu votre problème pour renommer des centaines de feuilles. Si vous ne rencontrez pas de problème pour renommer le nom de la feuille, vous pouvez utiliser cette macro pour le faire à votre place. Il faudra moins de secondes pour renommer tous les noms de feuille. malheureusement ODBC, OLEDB renvoient l'ordre des noms de feuille par asc. Il n'y a pas de remplacement pour cela. Vous devez utiliser COM ou renommer votre nom pour qu'il soit dans l'ordre.
MISE À JOUR: Après avoir lu le commentaire de @SidHoland concernant BIFF, une idée a flashé. Les étapes suivantes peuvent être effectuées via du code. Je ne sais pas si vous voulez vraiment faire cela pour obtenir les noms de feuille dans le même ordre. Faites-moi savoir si vous avez besoin d'aide pour le faire via le code.
MISE À JOUR: Une autre solution - NPOI pourrait être utile ici http://npoi.codeplex.com/
Cette solution fonctionne pour xls. Je n'ai pas essayé xlsx.
Merci,
Esen
la source
Cela a fonctionné pour moi. Volé d'ici: comment obtenir le nom de la première page d'un classeur Excel?
la source
Essaye ça. Voici le code pour obtenir les noms des feuilles dans l'ordre.
la source
Excel.XlFileFormat.xlWorkbookNormal
)Selon MSDN, dans le cas de feuilles de calcul à l'intérieur d'Excel, cela peut ne pas fonctionner car les fichiers Excel ne sont pas de vraies bases de données. Vous ne pourrez donc pas obtenir le nom des feuilles dans l'ordre de leur visualisation dans le classeur.
Code pour obtenir le nom des feuilles selon leur apparence visuelle en utilisant l'interopérabilité:
Ajoutez une référence à la bibliothèque d'objets Microsoft Excel 12.0.
Le code suivant donnera le nom des feuilles dans l'ordre réel stocké dans le classeur, pas le nom trié.
Exemple de code:
la source
Je ne vois aucune documentation indiquant que l'ordre dans app.xml est garanti comme étant l'ordre des feuilles. Il est PROBABLEMENT, mais pas selon la spécification OOXML.
Le fichier workbook.xml, en revanche, inclut l'attribut sheetId, qui détermine la séquence - de 1 au nombre de feuilles. Ceci est conforme à la spécification OOXML. workbook.xml est décrit comme l'endroit où la séquence des feuilles est conservée.
Donc, lire workbook.xml après avoir été extrait du XLSX serait ma recommandation. PAS app.xml. Au lieu de docProps / app.xml, utilisez xl / workbook.xml et regardez l'élément, comme indiqué ici -
»
»
la source