Określenie typu pola w pliku XLSX

0

Muszę przygotować aplikację, która będzie importowała dane do bazy z pliku *.xlsx . Podstawowy problem jest taki, że odbywa się to na maszynie, która nie ma zainstalowanego pakietu Office (nie wchodzą więc w grę proste narzędzia typu wywołanie z wiersza poleceń funkcji np. zapisu w formacie CSV, użycie automatyzacji, czy importowane biblioteki typów). Projekt jest stosunkowo mały, więc nie bardzo wchodzi też zakup dedykowanego komponentu - tym bardziej, że mam dośc duże doświadczenie w przetwarzaniu plików XML - stąd myślałem, że zadanie będzie ... trywialne. Ale do rzeczy.

Dobrnąłem do punktu, gdzie mam już wypakowany i otworzony plik: xl\worksheet\sheet1.xml oraz xl\sharedstrings.xml. Potrafię się poruszać dość sprawnie po komórkach

Rozbiłem się jednak o kwestię prawidłowego przetwarzania typów danych. Węzeł /worksheet/sheetData/row/c posiada atrybuty r (oznaczenie celi), s (oznaczenie stylu). Pobieram dane z węzła /worksheet/sheetData/row/c/v - są to jednak dane surowe.

Pytanie jest proste - gdzie w pliku xlsx zapisane są typy danych dla poszczególnych celek ?

P.S. Używam DXE2.

0

Okej - przebrnąłem ten problem - informacja o typie danych znajduje się w pliku xl\styles.xml w węźle: cellXfs (/worksheet/sheetData/row/c/@s w pliku sheet*.xml wskazuje na numer stylu formatowania w cellXfs po indeksie - w sumie proste i logiczne).

Utknąłem jednak na kolejnej rzeczy - być może wynika to ze zmęczenia (bo wydaje mi się, że sprawa powinna być banalna, ale nie umiem się odetkać z tym tematem) - na tej stronie: https://xlsxwriter.readthedocs.org/en/latest/format.html#format-set-num-format rozpisane są w ładnej tabelce formatowania "Excel’s built-in formats". Nie umiem przełożyć tego na język delphi. W szczególności mam problem z datą, która jest przechowywana jako liczba (oczywiście chodzi do liczbę dni od ...).

Jeżeli bełkoczę to proszę o solidny policzek.

0

Nie bardzo mogę zrozumieć w czym problem. Ponieważ można wywnioskować z kodu xml tam jak i ScreenShota arkusza w Excelu, iż data jest liczona identycznie jak robi to Delphi w typie TDate. Sprawdź sam takim kodem:

  Caption := DateToStr(36892.521);
0

Łał. NA prawdę nie wiedziałem, że w Delphi mogę przetwarzać datę w taki sposób. super.

A podpowiesz mi coś z formatowaniem ? W sensie - czy muszę używać case i w zależności od numFmtId, czy jest jakiś prostszy sposób bezpośredniego zastosowania formatowania Excelowanego ? Prawdopodobnie i tak skończy się na jakimś case, tylko kwestia czy mogę użyć tych łańcuchów formatujących, które są podane na stronie, do której podałem link, czy muszę jakoś "dobrać" formatowanie Delphiowe ?

0

Jeżeli chodzi o formatowanie daty i/lub czasu to jest przecież funkcja do tego. Tutaj masz opis: FormatDateTime a co do formatowania pod Excelem, to nie mam pojęcia. Powinien gdzieś być opis. Zresztą z tego co widziałem na tej stronie, co podałeś - tam było pokazane chyba jak osiągnąc formatowanie w sensie kolorki i chba typu też.

0

W Excelu data to zwykła liczba owszem nie równa tej co w Delphi ale wystarczy że wyliczysz i dodasz pewną wartość całkowitą.
Więc jako dane jest zapisana liczba i tą liczbę wpisujesz/odczytujesz.
Wyświetlenie tej liczby w formacie daty odbywa się poprzez odpowiednie ustawienie formatowania - czyli ciebie nie interesuje.

0

Nie doprecyzowałem pytania - z datą oczywiście sobie poradzę. Pytanie dotyczyło liczb - zwykłych.

Z tabelki chodzi o przypadki: 1-13 i 37-49

Wyczytałem gdzieś, że formatowanie nr=49 - czyli "@" oznacza po prostu tekst (a właściwie - przedstaw tak jak jest zapisane), ale nie do końca rozumiem zapisy niektórych formatowań - znak # oznacza zapewne liczbę. $ znak waluty. 0 cyfrę, a 9 liczbę. Ale ? , *

znalazłem taką stronę: http://office.microsoft.com/en-gb/excel-help/create-or-delete-a-custom-number-format-HP005199500.aspx?redir=0 . Znak ? oznacza chyba wyrównanie.

Generalnie - potrzebuję naprowadzenia jak zapisać formatowania z tabeli (1-13 i 37-49) za pomocą jakiejś funkcji w Delphi. Próbowałem bawić się z Format, ale mam dzisiaj wrażenie, jakby mózg chciał mi wyciec przez uszy. Kompletny brain-death.

1 użytkowników online, w tym zalogowanych: 0, gości: 1