2013-07-25 26 views
19

Knitr ve pandoc kullanarak işaretleme yoluyla bazı odt/docx raporları oluşturuyorum ve şimdi tabloları nasıl oluşturacağınızı merak ediyorum. Öncelikle kurallar eklemekle ilgileniyorum (en azından üst, alt ve başlığın altında bir tane olmakla birlikte, masanın içinde keyfi olanları ekleyebilmek de güzel olurdu).odt/docx çıktısı için pandoc tablolarında stil kuralları ekleyin (tablo sınırları)

Aşağıdaki örneği pandoc aracılığıyla pandoc aracılığıyla çalıştırarak (herhangi bir özel parametre olmadan) yalnızca herhangi bir kural/renk/kılavuz ("-t odt veya -t docx) olmadan" düz "bir tablo verilir.

+---------------+---------------+--------------------+ 
| Fruit   | Price   | Advantages   | 
+===============+===============+====================+ 
| Bananas  | $1.34   | - built-in wrapper | 
|    |    | - bright color  | 
+---------------+---------------+--------------------+ 
| Oranges  | $2.10   | - cures scurvy  | 
|    |    | - tasty   | 
+---------------+---------------+--------------------+ 

Ben Bir başvurudaki çizelge biçimlendirme belirleme imkanı için "stilleri" inceledim .docx/Odt ama "Tablo başlığı" ve "Tablo içeriğinin" stilleri, ötesinde bariz hiçbir şey bulunamadı her ikisi de sadece tablo içindeki metnin formatını ilgilendiriyor gibi görünüyor.

WYSIWYG stili belge işlemcilerini oldukça aşina olmak nasıl devam edeceğimi bilmiyorum. bir tablo eklemek için

yolu Docx <w:tbl> etiketi kullanmaktır içinde:

cevap

20

İşte bunun nasıl aranır nasıl. Yani github depoda bu aradı ve buldu in this file (denilen Yazarlar/Docx.hs, büyük bir sürpriz değil bu yüzden) ben hiç Haskell aşina değilim

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' 

ama görebiliyorum

let borderProps = mknode "w:tcPr" [] 
        [ mknode "w:tcBorders" [] 
         $ mknode "w:bottom" [("w:val","single")]() 
        , mknode "w:vAlign" [("w:val","bottom")]() ] 

bu ne anlama geliyor: içinde hiçbir değişken olmadığı için sınır tarzı, sabit kodlu olduğunu?

Bu, docx tablolarının stilini PanDoc'un geçerli sürümü ile değiştiremeyeceğiniz anlamına gelir. Nasıl, kendi tarzınızı elde etmenin bir yolu var.

Kendi stilinizi nasıl alabilirsiniz?

  1. Değişim (bu tabloyu oluşturarak) o dosyanın uzantısını size masada istediğiniz tarzı ile Docx belgesi oluşturma ve bunu
  2. Açık word/document.xml halletmek ve <w:tbl>
  3. Try aramak stilinizin XML'de nasıl çevrildiğini ve gördüğünüz şeye göre borderProp'ları nasıl değiştirdiğini öğrenmek için.

İşte benim yarattığım bir sınır tarzı ile bir test: Custom border style

Ve burada karşılık gelen XML geçerli: Ne odt hakkında

<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> 

?

Henüz bir bakmadım, benzer bir yöntemle kendiniz bulmamanız sorun. Dönüştürülen docx xml içeriğini kesmek: Bu yardımcı olur ve edi9999 olarak bir şey daha

+0

Bunu kabul ediyorum, çünkü ilk oldu. Sadece kodu kontrol etmeyi bile düşünmedim (ya da belki de çok tembelim ve başkalarının bunu yapmasına izin vermeyi tercih ederim;))! Teşekkürler! –

+0

Geride olup bitenlere aşina olmadığınız zaman kodu kontrol etmek her zaman kolay değildir, örneğin bir belgenin nasıl yapılandırıldığı, tablonun docx'te nasıl temsil edildiği. Yani normal. – edi9999

+1

Bu harika bir cevap. @ Edi9999 için tüm upvotes. – Archonic

9

aynı öneriyi sormaya çekinmeyin

Umut.Ve aşağıdaki, bunu yapmak için benim R kodum.

tblPr değişken stil tanımı docx tablo eklenecek içerir. Kendi ihtiyacınızı karşılamak için dizgiyi değiştirebilirsiniz.

require(XML) 

docx.file <- "report.docx" 
tblPr <- '<w:tblPr xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"><w:tblStyle w:val="a8"/><w:tblW w:w="0" w:type="auto"/><w:tblBorders><w:top w:val="single" w:sz="4" w:space="0" w:color="000000" w:themeColor="text1"/><w:left w:val="single" w:sz="4" w:space="0" w:color="000000" w:themeColor="text1"/><w:bottom w:val="single" w:sz="4" w:space="0" w:color="000000" w:themeColor="text1"/><w:right w:val="single" w:sz="4" w:space="0" w:color="000000" w:themeColor="text1"/><w:insideH w:val="single" w:sz="4" w:space="0" w:color="000000" w:themeColor="text1"/><w:insideV w:val="single" w:sz="4" w:space="0" w:color="000000" w:themeColor="text1"/></w:tblBorders><w:jc w:val="center"/></w:tblPr>' 

## unzip the docx converted by Pandoc 
system(paste("unzip", docx.file, "-d temp_dir")) 
document.xml <- "temp_dir/word/document.xml" 

doc <- xmlParse(document.xml) 
tbl <- getNodeSet(xmlRoot(doc), "//w:tbl") 
tblPr.node <- lapply(1:length(tbl), function (i) 
        xmlRoot(xmlParse(tblPr))) 
added.Pr <- names(xmlChildren(tblPr.node[[1]])) 
for (i in 1:length(tbl)) { 
    tbl.node <- tbl[[i]] 
    if ('tblPr' %in% names(xmlChildren(tbl.node))) { 
     children.Pr <- xmlChildren(xmlChildren(tbl.node)$tblPr) 
     for (j in length(added.Pr):1) { 
      if (added.Pr[j] %in% names(children.Pr)) { 
       replaceNodes(children.Pr[[added.Pr[j]]], 
          xmlChildren(tblPr.node[[i]])[[added.Pr[j]]]) 
      } else { 
       ## first.child <- children.Pr[[1]] 
       addSibling(children.Pr[['tblStyle']], 
          xmlChildren(tblPr.node[[i]])[[added.Pr[j]]], 
          after=TRUE) 
      } 
     } 
    } else { 
     addSibling(xmlChildren(tbl.node)[[1]], tblPr.node[[i]], after=FALSE) 
    } 
} 

## save hacked xml back to docx 
saveXML(doc, document.xml, indent = F) 
setwd("temp_dir") 
system(paste("zip -r ../", docx.file, " *", sep="")) 
setwd("..") 
system("rm -fr temp_dir") 
4

edi9999 iyi cevabı vardır ama burada böyle yapar:

docx oluşturarak stilleri almak için bir referans docx kullanın. Bu referans, Pandoc tarafından yaratılmayan diğer stilleri içeren bir yığın içerecektir, ancak yine de oradalar. Genellikle varsayılan kümeleri alırsınız, ancak yeni bir tablo stili de ekleyebilirsiniz. örneğin

Ardından, yalnızca yeni tablo stilini başvurmak için kelime \ document.xml dosyasını güncelleştirmek gerekir ve (Ayıklama sed çalışan ve docx arşivi güncelleyerek) programlı bunu yapabilir:

7z.exe x mydoc.docx word\document.xml 
sed "s/<w:tblStyle w:val=\"TableNormal\"/<w:tblStyle w:val=\"NewTableStyle\"/g" word\document.xml > word\document2.xml 
copy word\document2.xml word\document.xml /y 
7z.exe u mydoc.docx word\document.xml 
+0

Bu cevap --reference-docx ile birleştirildi = seçenek bir katil! – ivarec

2

reference.docx dosyasında "TableNormal" adlı bir tablo stili ekleyin.

+0

Bu, Word'ün (2010) o tarzın rezerve edilmesinden şikayetçi olduğu için benim için çalışmadı. – mkingston

0

Her başvuruda "Tablo" olarak adlandırılan ve referans dokümanı dosyasında bir tablo stili ekleyin ve pandoc'u en son güncelleyin.