OpenXml CellFormat ApplyBorder, ApplyFill itd.

OpenXml CellFormat ApplyBorder, ApplyFill itd.
KO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 463
0

Cześć,
uczę się biblioteki OpenXML do "zabawy" z excelem w C#.
Gdy chcemy zrobić formatowanie w excelu musimy najpierw stworzyć odpowiednie style a następnie stworzyć obiekt CellFormats w którym definiujemy nasze formaty (CellFormat).
W klasie CellFormat wskazujemy Id wcześniej stworzonych stylów.
Intryguje mnie jednak po co w tej klasie dodatkowo są właściwości typu: ApplyBorder, ApplyNumberFormat, ApplyFill itd? W jakich sytuacjach te właściwości powinny przyjmować wartość false?

Jeśli definiuję format komórki i mówię, że ta komórka ma mieć czcionkę Arial to w jakiej sytuacji miałbym ustawić ApplyFont na false? Analogicznie z pozostałymi właściwościami typu ApplyBorder, ApplyNumberFormat, ApplyFill itd?

Dokumentacja odnośnie tych właściwości mówi jedynie, że: A boolean value indicating whether the alignment formatting specified for this xf should be applied - czy może mi ktoś to wyjaśnić?

Z gory dziękuję za pomoc.

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6961
0

Ja w C#/Unity zrobiłem sobie odczyt pliku językowego gry ręcznie. using System.Xml;

Użyłem do tego formatu FODS. Czyli plik ODS zapisany jako tekstowy XML - bez kompresji itp.

Dane są tekstowe, nie trzeba ich wypakowywać/odczytywać w żaden specjalny sposób.

Jeśli chcę zobaczyć jak dana akcja wpływa na zawartość pliku, mogę podglądnąć zmiany w GitHub Desktop.
Czyli u Ciebie dowiedziałbyś się jak zmienić czcionkę komórki.

LibreOffice Calc normalnie obsługuje te pliki. Np. gdybym użył CSV, to bym musiał się bawić w import eksport za każdym razem.

Polecam spróbować w ten sposób.

KO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 463
0

@Spine dzięki, ale kompletnie nic nie zrozumiałem.

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6961
0

@Kofcio: Spoko, spróbuj jeszcze raz...

Zamiast używać biblioteki OpenXML, możesz używając System.Xml; przeprowadzać operacje na pliku arkusza kalkulacyjnego LibreOffice Calc (*.fods), który jest plikiem XML.
Jeśli zbadasz w jaki sposób zmiana czcionki jest zapisywana w tym pliku to będziesz mógł to zaimplementować przynajmniej dla plików *.fods.
A jak zbadać? Edytujesz plik w Libre Office Calc i sprawdzasz jakie zmiany zostały wprowadzone.

KO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 463
0

Excel to również są pliki XML i również mogę podejrzeć sobie w nich zmianę, ale to niewiele zmienia, bo ciągle nie wiem po co są właściwości typu ApplyFont, ApplyBorder itd. w klasie CellFormat.
Dzięki za próbę pomocy, chociaż liczyłem na konkretną odpowiedź.

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6961
1
Kofcio napisał(a):

chociaż liczyłem na konkretną odpowiedź.

✅ 1. Po co są właściwości Apply* w CellFormat?

W Excelu styl komórki (CellFormat = tzw. XF – eXtended Format) może dziedziczyć formatowanie z dwóch źródeł:

  1. Style Index (StyleIndex) – bazowy styl, który jest przechowywany w CellStyleFormats (np. domyślny styl nagłówka, styl tabeli itp.).
  2. Format komórki (CellFormat) – który może nadpisywać tylko niektóre właściwości.

Te właściwości ApplyFont, ApplyBorder, ApplyFill, ApplyNumberFormat itd. mówią Excelowi, czy masz zastosować (nadpisać) te konkretne ustawienia, czy pozostawić domyślne/dziedziczone.

Jeśli ustawisz np.:

Kopiuj
new CellFormat
{
    FontId = 2,
    ApplyFont = true
}

→ Excel zastosuje czcionkę o FontId=2.

Jeśli ustawisz:

Kopiuj
new CellFormat
{
    FontId = 2,
    ApplyFont = false
}

→ Excel zignoruje FontId=2 i pozostawi czcionkę z domyślnego stylu (CellStyleFormat), mimo że podałeś FontId.


✅ 2. Kiedy miałbym ustawić ApplyFont = false (i analogiczne właściwości)?

Najczęściej nie musisz ustawiać ich na false, bo domyślnie Excel zakłada, że jeśli ustawiasz FontId, to chcesz, żeby było użyte (ApplyFont=true).

Jednak właściwości te mają sens w dwóch przypadkach:


(a) Dziedziczenie stylów – użycie gotowych stylów Excela

Excel ma predefiniowane style (np. "Normal", "Input", "Output"). Możesz przypisać komórce taki styl poprzez StyleIndex.

Jeśli chcesz tylko częściowo zmienić wygląd (np. zmienić kolor tła, ale zachować czcionkę ze stylu), ustawiasz:

Kopiuj
new CellFormat
{
    StyleIndex = 1, // np. "Normal"
    FillId = 3,
    ApplyFill = true,
    ApplyFont = false // zostaw czcionkę ze stylu "Normal"
}

→ Wtedy Excel bierze czcionkę i obramowanie ze stylu bazowego, a tylko wypełnienie jest nadpisywane.


(b) Optymalizacja i spójność stylów

Excel (i OpenXML) przechowuje style w osobnych kolekcjach (Fonts, Fills, Borders). Jeśli generujesz dużo danych i chcesz zmniejszyć rozmiar pliku, możesz stosować wspólne style (StyleIndex) i tylko częściowo je modyfikować, włączając/wyłączając konkretne Apply*.


✅ 3. Czy zawsze muszę ustawiać te właściwości?

  • Jeśli tworzysz własny, kompletny styl od zera – zwykle ustawiasz wszystko i nie przejmujesz się Apply* (Excel sam je ustawi na true).
  • Jeśli bazujesz na istniejącym stylu (StyleIndex) – wtedy świadomie decydujesz, które właściwości mają być nadpisane.

✅ 4. Co się stanie, jeśli je zostawię puste (null)?

W praktyce:

  • Jeśli nie ustawisz ApplyFont – Excel sam zdecyduje:

    • Jeśli FontId ≠ 0 → przyjmie, że chcesz użyć nowej czcionki (jakby true).
    • Jeśli FontId = 0 → zostanie styl bazowy.

Więc w większości przypadków nie musisz ręcznie ustawiać tych flag.


🔥 5. TL;DR – praktyczna zasada

  • Tworzysz nowy styl? → Ignoruj Apply*, ustawiaj tylko FontId, BorderId itd.
  • Bazujesz na istniejącym stylu (StyleIndex)? → Ustawiaj Apply* tylko dla tych właściwości, które mają być nadpisane.
  • Kiedy false? → Gdy chcesz zostawić domyślne dziedziczone ustawienia ze stylu bazowego.
KO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 463
1

@Spine Dzięki wielkie!
Ciągle mam pewien niedosyt, ponieważ z moich dzisiejszych testów wynika, że jeśli ustawię własny styl i ustawię np. ApplyFill na false to i tak moje style (w tym wypadku w zakresie wypełnienia) zostaną zastosowane - nie zostaną zignorowane. Tak więc ta flaga jest tak jakby nieistotna (?) - przynajmniej nie zaobserwowałem różnicy.
Jeszcze raz bardzo dziękuję!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.