Używam OleDb do czytania ze skoroszytu programu Excel z wieloma arkuszami.
Muszę przeczytać nazwy arkuszy, ale potrzebuję ich w kolejności, w jakiej są zdefiniowane w arkuszu kalkulacyjnym; więc jeśli mam plik, który wygląda tak;
|_____|_____|____|____|____|____|____|____|____|
|_____|_____|____|____|____|____|____|____|____|
|_____|_____|____|____|____|____|____|____|____|
\__GERMANY__/\__UK__/\__IRELAND__/
Następnie muszę zdobyć słownik
1="GERMANY",
2="UK",
3="IRELAND"
Próbowałem użyć OleDbConnection.GetOleDbSchemaTable()
i to daje mi listę nazwisk, ale posortuje je alfabetycznie. Sortowanie alfa oznacza, że nie wiem, któremu numerowi arkusza odpowiada dana nazwa. Więc dostaję;
GERMANY, IRELAND, UK
który zmienił kolejność UK
i IRELAND
.
Powodem, dla którego potrzebuję sortowania, jest to, że muszę pozwolić użytkownikowi wybrać zakres danych według nazwy lub indeksu; mogą poprosić o „wszystkie dane z NIEMIEC do IRLANDII” lub „dane z arkusza 1 do arkusza 3”.
Wszelkie pomysły będą mile widziane.
gdybym mógł użyć klas międzyoperacyjnych pakietu office, byłoby to proste. Niestety nie mogę, ponieważ klasy międzyoperacyjne nie działają niezawodnie w nieinteraktywnych środowiskach, takich jak usługi Windows i witryny ASP.NET, więc musiałem użyć OLEDB.
źródło
Odpowiedzi:
Nie mogę znaleźć tego w rzeczywistej dokumentacji MSDN, ale powiedział moderator na forach
Nazwy arkuszy programu Excel w kolejności arkuszy
Wydaje się, że byłby to dość powszechny wymóg, aby istniało przyzwoite obejście.
źródło
Czy nie możesz po prostu zapętlić arkuszy od 0 do Liczba nazwisk -1? w ten sposób powinieneś uzyskać je we właściwej kolejności.
Edytować
Zauważyłem w komentarzach, że istnieje wiele obaw związanych z używaniem klas Interop do pobierania nazw arkuszy. Dlatego oto przykład użycia OLEDB do ich odzyskania:
Wyodrębniono z artykułu w CodeProject.
źródło
Ponieważ powyższy kod nie obejmuje procedur wyodrębniania listy nazw arkuszy dla Excel 2007, poniższy kod będzie miał zastosowanie zarówno do Excela (97-2003), jak i Excel 2007:
Powyższa funkcja zwraca listę arkuszy w konkretnym pliku Excel dla obu typów Excela (97,2003,2007).
źródło
To jest krótkie, szybkie, bezpieczne i użyteczne ...
źródło
exceladdress
- co to jest?Inny sposób:
plik xls (x) to po prostu zbiór plików * .xml przechowywanych w kontenerze * .zip. rozpakuj plik „app.xml” w folderze docProps.
Plik jest plikiem niemieckim (Arbeitsblätter = workheets). Nazwy tabel (Tabelle3 itp.) Są we właściwej kolejności. Wystarczy przeczytać te tagi;)
pozdrowienia
źródło
Poniższą funkcję stworzyłem korzystając z informacji podanych w odpowiedzi z @kraeppy ( https://stackoverflow.com/a/19930386/2617732 ). Wymaga to użycia platformy .net Framework w wersji 4.5 i odwołania do System.IO.Compression. Działa to tylko w przypadku plików xlsx, a nie starszych plików xls.
źródło
Podoba mi się pomysł @deathApril, aby nazywać arkusze jako 1_Germany, 2_UK, 3_IRELAND. Mam również twój problem, aby zmienić nazwę dla setek arkuszy. Jeśli nie masz problemu ze zmianą nazwy arkusza, możesz użyć tego makra, aby zrobić to za siebie. Zmiana nazw wszystkich arkuszy zajmie mniej niż sekundy. niestety ODBC, OLEDB zwraca kolejność nazw arkuszy rosnąco. Nie ma na to zamiennika. Musisz użyć COM lub zmienić nazwę swojej nazwy, aby była w kolejności.
AKTUALIZACJA: Po przeczytaniu komentarza @SidHoland dotyczącego BIFF pojawił się pomysł. Poniższe kroki można wykonać za pomocą kodu. Nie wiem, czy naprawdę chcesz to zrobić, aby uzyskać nazwy arkuszy w tej samej kolejności. Daj mi znać, jeśli potrzebujesz pomocy, aby to zrobić za pomocą kodu.
AKTUALIZACJA: Inne rozwiązanie - NPOI może być tutaj pomocne http://npoi.codeplex.com/
To rozwiązanie działa dla xls. Nie próbowałem xlsx.
Dzięki,
Esen
źródło
To zadziałało dla mnie. Skradzione stąd: Jak uzyskać nazwę pierwszej strony skoroszytu programu Excel?
źródło
Spróbuj tego. Oto kod umożliwiający uporządkowanie nazw arkuszy.
źródło
Excel.XlFileFormat.xlWorkbookNormal
)Zgodnie z MSDN, w przypadku arkuszy kalkulacyjnych w programie Excel może nie działać, ponieważ pliki programu Excel nie są prawdziwymi bazami danych. Dlatego nie będziesz w stanie uzyskać nazwy arkuszy w kolejności ich wizualizacji w skoroszycie.
Kod, aby uzyskać nazwę arkusza zgodnie z ich wyglądem wizualnym za pomocą współdziałania:
Dodaj odniesienie do biblioteki obiektów programu Microsoft Excel 12.0.
Poniższy kod poda nazwę arkuszy w rzeczywistej kolejności przechowywanej w skoroszycie, a nie posortowaną nazwę.
Przykładowy kod:
źródło
Nie widzę żadnej dokumentacji, która mówi, że kolejność w app.xml jest gwarantowana jako kolejność arkuszy. PRAWDOPODOBNIE jest, ale nie zgodnie ze specyfikacją OOXML.
Z drugiej strony plik workbook.xml zawiera atrybut sheetId, który określa kolejność - od 1 do liczby arkuszy. Jest to zgodne ze specyfikacją OOXML. workbook.xml jest opisywane jako miejsce, w którym przechowywana jest kolejność arkuszy.
Dlatego zalecam przeczytanie pliku workbook.xml po wyodrębnieniu go z pliku XLSX. NIE app.xml. Zamiast docProps / app.xml użyj xl / workbook.xml i spójrz na element, jak pokazano tutaj -
`
`
źródło