Oto jak szukałem jak to zrobić:
The sposób dodać tabelę w Docx jest użycie znacznika <w:tbl>
. Więc szukałem tego w repozytorium github i znalazł go in this file (tzw Writers/Docx.hs, więc to nie jest wielka niespodzianka)
blockToOpenXML opts (Table caption aligns widths headers rows) = do
let captionStr = stringify caption
caption' <- if null caption
then return []
else withParaProp (pStyle "TableCaption")
$ blockToOpenXML opts (Para caption)
let alignmentFor al = mknode "w:jc" [("w:val",alignmentToString al)]()
let cellToOpenXML (al, cell) = withParaProp (alignmentFor al)
$ blocksToOpenXML opts cell
headers' <- mapM cellToOpenXML $ zip aligns headers
rows' <- mapM (\cells -> mapM cellToOpenXML $ zip aligns cells)
$ rows
let borderProps = mknode "w:tcPr" []
[ mknode "w:tcBorders" []
$ mknode "w:bottom" [("w:val","single")]()
, mknode "w:vAlign" [("w:val","bottom")]() ]
let mkcell border contents = mknode "w:tc" []
$ [ borderProps | border ] ++
if null contents
then [mknode "w:p" []()]
else contents
let mkrow border cells = mknode "w:tr" [] $ map (mkcell border) cells
let textwidth = 7920 -- 5.5 in in twips, 1/20 pt
let mkgridcol w = mknode "w:gridCol"
[("w:w", show $ (floor (textwidth * w) :: Integer))]()
return $
[ mknode "w:tbl" []
(mknode "w:tblPr" []
([ mknode "w:tblStyle" [("w:val","TableNormal")]() ] ++
[ mknode "w:tblCaption" [("w:val", captionStr)]()
| not (null caption) ])
: mknode "w:tblGrid" []
(if all (==0) widths
then []
else map mkgridcol widths)
: [ mkrow True headers' | not (all null headers) ] ++
map (mkrow False) rows'
)
] ++ caption'
nie jestem obeznany w ogóle z Haskell, ale widzę, że styl graniczny jest zakodowany, ponieważ nie ma w nim żadnej zmiennej:
let borderProps = mknode "w:tcPr" []
[ mknode "w:tcBorders" []
$ mknode "w:bottom" [("w:val","single")]()
, mknode "w:vAlign" [("w:val","bottom")]() ]
Co to znaczy?
Oznacza to, że nie można zmienić stylu tabel docx za pomocą bieżącej wersji PanDoc. Istnieje jednak sposób na zdobycie własnego stylu.
Jak uzyskać własny styl?
- utworzyć dokument docx ze stylem chcesz na stole (poprzez tworzenie tej tabeli)
- zmienić rozszerzenie tego pliku i rozpakuj go
- Otwórz
word/document.xml
i poszukać <w:tbl>
- Try aby dowiedzieć się, jak twój styl przekłada się na XML i zmieniać borderProps zgodnie z tym, co widzisz.
Oto test z pogranicza stylu utworzonego:
I tu jest odpowiedź XML:
<w:tblBorders>
<w:top w:val="dotted" w:sz="18" w:space="0" w:color="C0504D" w:themeColor="accent2"/>
<w:left w:val="dotted" w:sz="18" w:space="0" w:color="C0504D" w:themeColor="accent2"/>
<w:bottom w:val="dotted" w:sz="18" w:space="0" w:color="C0504D" w:themeColor="accent2"/>
<w:right w:val="dotted" w:sz="18" w:space="0" w:color="C0504D" w:themeColor="accent2"/>
<w:insideH w:val="dotted" w:sz="18" w:space="0" w:color="C0504D" w:themeColor="accent2"/>
<w:insideV w:val="dotted" w:sz="18" w:space="0" w:color="C0504D" w:themeColor="accent2"/>
</w:tblBorders>
Co odt?
Nie obejrzałem jeszcze tego, zapytaj, czy nie znajdziesz sam, używając podobnej metody.
Nadzieja to pomaga i nie wahaj się prosić coś więcej
Zaakceptuję ten, ponieważ był pierwszy. Nie myślałem nawet o sprawdzeniu kodu (a może po prostu jestem zbyt leniwy i wolę pozwolić innym to zrobić;))! Dzięki! –
Nie zawsze łatwo jest sprawdzić kod, gdy nie wiesz, co dzieje się z tyłu, np. W jaki sposób dokument jest zorganizowany, w jaki sposób tabela jest reprezentowana w docx. Więc to normalne. – edi9999
To jest cudowna odpowiedź. Wszystkie upvotes do ciebie @ edi9999. – Archonic