Ich verwende OleDb, um aus einer Excel-Arbeitsmappe mit vielen Blättern zu lesen.
Ich muss die Blattnamen lesen, aber ich brauche sie in der Reihenfolge, in der sie in der Tabelle definiert sind. Also, wenn ich eine Datei habe, die so aussieht;
|_____|_____|____|____|____|____|____|____|____|
|_____|_____|____|____|____|____|____|____|____|
|_____|_____|____|____|____|____|____|____|____|
\__GERMANY__/\__UK__/\__IRELAND__/
Dann muss ich das Wörterbuch bekommen
1="GERMANY",
2="UK",
3="IRELAND"
Ich habe versucht, zu verwenden OleDbConnection.GetOleDbSchemaTable()
, und das gibt mir die Liste der Namen, aber es sortiert sie alphabetisch. Die Alpha-Sortierung bedeutet, dass ich nicht weiß, welcher Blattnummer ein bestimmter Name entspricht. Also bekomme ich;
GERMANY, IRELAND, UK
das hat die Reihenfolge von UK
und geändert IRELAND
.
Der Grund, warum ich es sortieren muss, ist, dass ich den Benutzer einen Datenbereich nach Name oder Index auswählen lassen muss; Sie können nach "allen Daten von DEUTSCHLAND nach IRLAND" oder "Daten von Blatt 1 nach Blatt 3" fragen.
Irgendwelche Ideen wären sehr dankbar.
Wenn ich die Office-Interop-Klassen nutzen könnte, wäre dies unkompliziert. Leider kann ich das nicht, da die Interop-Klassen in nicht interaktiven Umgebungen wie Windows-Diensten und ASP.NET-Sites nicht zuverlässig funktionieren. Daher musste ich OLEDB verwenden.
quelle
Antworten:
Ich kann dies nicht in der aktuellen MSDN-Dokumentation finden, aber ein Moderator in den Foren sagte
Excel-Blattnamen in Blattreihenfolge
Dies scheint eine häufig genug erforderliche Voraussetzung für eine angemessene Problemumgehung zu sein.
quelle
Können Sie nicht einfach die Blätter von 0 bis Anzahl der Namen -1 durchlaufen? Auf diese Weise sollten Sie sie in der richtigen Reihenfolge erhalten.
Bearbeiten
Ich habe durch die Kommentare festgestellt, dass es viele Bedenken gibt, die Interop-Klassen zum Abrufen der Blattnamen zu verwenden. Daher hier ein Beispiel, in dem OLEDB zum Abrufen verwendet wird:
Auszug aus dem Artikel über das CodeProject.
quelle
Da der obige Code keine Verfahren zum Extrahieren der Liste der Blattnamen für Excel 2007 abdeckt, gilt der folgende Code sowohl für Excel (97-2003) als auch für Excel 2007:
Die obige Funktion gibt eine Liste der Blätter in einer bestimmten Excel-Datei für beide Excel-Typen (97.2003.2007) zurück.
quelle
Dies ist kurz, schnell, sicher und verwendbar ...
quelle
exceladdress
- Was ist das?Ein anderer Weg:
Eine xls (x) -Datei ist nur eine Sammlung von * .xml-Dateien, die in einem * .zip-Container gespeichert sind. Entpacken Sie die Datei "app.xml" im Ordner docProps.
Die Datei ist eine deutsche Datei (Arbeitsblätter). Die Tabellennamen (Tabelle3 usw.) sind in der richtigen Reihenfolge. Sie müssen nur diese Tags lesen;)
Grüße
quelle
Ich habe die folgende Funktion unter Verwendung der Informationen erstellt, die in der Antwort von @kraeppy ( https://stackoverflow.com/a/19930386/2617732 ) angegeben sind. Dies erfordert die Verwendung des .net Framework v4.5 und einen Verweis auf System.IO.Compression. Dies funktioniert nur für XLSX-Dateien und nicht für ältere XLS-Dateien.
quelle
Ich mag die Idee von @deathApril, die Blätter als 1_Germany, 2_UK, 3_IRELAND zu benennen. Ich habe auch Ihr Problem, diese Umbenennung für Hunderte von Blättern durchzuführen. Wenn Sie keine Probleme haben, den Blattnamen umzubenennen, können Sie dieses Makro verwenden, um dies für Sie zu tun. Das Umbenennen aller Blattnamen dauert weniger als Sekunden. Leider gibt ODBC, OLEDB die Blattnamenreihenfolge per ASC zurück. Dafür gibt es keinen Ersatz. Sie müssen entweder COM verwenden oder Ihren Namen umbenennen, um in der Reihenfolge zu sein.
UPDATE: Nach dem Lesen des @ SidHoland-Kommentars zu BIFF kam eine Idee auf. Die folgenden Schritte können über Code ausgeführt werden. Ich weiß nicht, ob Sie das wirklich tun möchten, um die Blattnamen in derselben Reihenfolge zu erhalten. Lassen Sie mich wissen, wenn Sie Hilfe benötigen, um dies durch Code zu tun.
UPDATE: Eine andere Lösung - NPOI könnte hier hilfreich sein http://npoi.codeplex.com/
Diese Lösung funktioniert für xls. Ich habe xlsx nicht ausprobiert.
Vielen Dank,
Esen
quelle
Das hat bei mir funktioniert. Von hier gestohlen: Wie erhält man den Namen der ersten Seite einer Excel-Arbeitsmappe?
quelle
Versuche dies. Hier ist der Code, um die Blattnamen in der richtigen Reihenfolge zu erhalten.
quelle
Excel.XlFileFormat.xlWorkbookNormal
)Gemäß MSDN funktioniert dies bei Tabellenkalkulationen in Excel möglicherweise nicht, da Excel-Dateien keine echten Datenbanken sind. Daher können Sie den Blattnamen nicht in der Reihenfolge seiner Visualisierung in der Arbeitsmappe abrufen.
Code zum Abrufen des Blattnamens gemäß ihrem visuellen Erscheinungsbild mithilfe von Interop:
Verweis auf Microsoft Excel 12.0-Objektbibliothek hinzufügen.
Der folgende Code gibt den Blattnamen in der tatsächlichen Reihenfolge an, die in der Arbeitsmappe gespeichert ist, nicht den sortierten Namen.
Beispielcode:
quelle
Ich sehe keine Dokumentation, die besagt, dass die Reihenfolge in app.xml garantiert der Reihenfolge der Blätter entspricht. Es ist wahrscheinlich, aber nicht gemäß der OOXML-Spezifikation.
Die Datei workbook.xml enthält andererseits das Attribut sheetId, das die Reihenfolge bestimmt - von 1 bis zur Anzahl der Blätter. Dies entspricht der OOXML-Spezifikation. workbook.xml wird als der Ort beschrieben, an dem die Reihenfolge der Blätter beibehalten wird.
Daher wäre es meine Empfehlung, workbook.xml zu lesen, nachdem es aus dem XLSX extrahiert wurde. NICHT app.xml. Verwenden Sie anstelle von docProps / app.xml xl / workbook.xml und sehen Sie sich das Element wie hier gezeigt an.
`
`
quelle