una tipos tablas tabla que para mueva insertar inmovilizar herramientas hacer fijar estilos diseño como docx pandoc odt

docx - tipos - herramientas de tabla en word



Agregue reglas de estilo en tablas pandoc para salida odt/docx(bordes de tabla) (6)

Estoy generando algunos informes odt / docx a través de markdown usando knitr y pandoc, y ahora me pregunto cómo iría para formar tablas. Principalmente estoy interesado en agregar reglas (al menos arriba, abajo y una debajo del encabezado, pero también sería bueno poder agregar reglas arbitrarias dentro de la tabla).

Ejecutar el siguiente ejemplo de la documentación de pandoc a través de pandoc (sin ningún parámetro especial) solo produce una tabla "simple" sin ningún tipo de reglas / colores / guías (en -t odt o -t docx ).

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

Busqué en los "estilos" la posibilidad de especificar el formato de tabla en una .docx / .odt de referencia, pero no encontré nada obvio más allá de los estilos de "encabezado de tabla" y "contenido de tabla", ambos parecen referirse solo al formato de Texto dentro de la tabla.

Al no estar familiarizado con los procesadores de documentos de estilo WYSIWYG, no sé cómo continuar.


Aquí es cómo busqué cómo hacer esto:

La forma de agregar una tabla en Docx es usar la etiqueta <w:tbl> . Así que busqué esto en el repositorio de github, y lo encontré en este archivo (llamado Writers / Docx.hs, así que no es una gran sorpresa)

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

No estoy familiarizado en absoluto con Haskell, pero puedo ver que el estilo del borde está codificado, ya que no hay ninguna variable en él:

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

Qué significa eso ?

Eso significa que no puede cambiar el estilo de las tablas docx con la versión actual de PanDoc. Sin embargo, hay una manera de obtener tu propio estilo.

¿Cómo conseguir tu propio estilo?

  1. Cree un documento Docx con el estilo que desea en su tabla (creando esa tabla)
  2. Cambia la extensión de ese archivo y descomprime.
  3. Abra word/document.xml y busque <w:tbl>
  4. Trate de averiguar cómo se traduce su estilo en XML y cambie los BorderProps de acuerdo con lo que ve.

Aquí hay una prueba con un estilo de borde que creé:

Y aquí está el XML correspondiente:

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

¿Qué hay de odt?

No lo he visto todavía, pregunte si no encuentra usted mismo un método similar.

Espero que esto ayude y no dudes en pedir algo más.


La misma sugerencia que edi9999: hackear el contenido XML de docx convertido. Y el siguiente es mi código R para hacer eso.

La variable tblPr contiene la definición de estilo que se agregará a las tablas en docx. Puede modificar la cadena para satisfacer su propia necesidad.

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


Simplemente agregue un estilo de tabla a lo que desee que se llame "Tabla" en el archivo de documento de referencia。 Y actualice pandoc a la última versión.


Usando un archivo docx de referencia y luego pydocx hace el trabajo con bastante facilidad:

Primero convierte tu documento a docx:

Bash:

pandoc --standalone --data-dir=/path/to/reference/ --output=/tmp/xxx.docx input_file.md

Notas:

  • /path/to/reference/ apunta a la carpeta que contiene reference.docx
  • reference.docx es un archivo que contiene los estilos que necesita para los elementos docx

Luego, asigne a las tablas de su documento el estilo que desea usar:

Python:

import docx document = docx.Document(''/tmp/xxx.docx'') for table in document.tables: table.style = document.styles[''custom_style'']


agregue un estilo de tabla llamado "TableNormal" en reference.docx.


edi9999 tiene la mejor respuesta pero esto es lo que hago:

Al crear el docx, use un docx de referencia para obtener estilos. Esa referencia contendrá un montón de otros estilos que Pandoc simplemente no utiliza para crear, pero todavía están allí. Por lo general, obtendrá los conjuntos predeterminados, pero también puede agregar un nuevo estilo de tabla.

Entonces, solo necesita actualizar el archivo word / document.xml para hacer referencia al nuevo estilo de tabla, y puede hacerlo mediante programación (descomprimiendo, ejecutando sed y actualizando el archivo docx), por ejemplo:

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