首页 > 解决方案 > 是否可以在 Apache POI XWPF 中设置默认表格样式?

问题描述

除了一个单元格之外,还有什么方法可以设置整个表格的样式吗?

(前任)

在 Word 中,按照您在图像中看到的进行设置。我想知道是否有一种方法可以指定像单词表这样的基本样式。

谢谢!

标签: javaapache-poixwpf

解决方案


表格样式存储在's文件存储中的单独styles.xml文件中。默认情况下不会创建这样的样式文档。但它支持创建这样的 using 。如果有,则需要在该样式文档中创建表格样式。然后使用 将该样式链接到表格。WordOffice Open XMLApache POIXWPFDocument.createStylesXWPFTable.setStyleID

到目前为止,只有使用需要对象XWPFStyle的构造函数才支持创建 a 。org.openxmlformats.schemas.wordprocessingml.x2006.main.CTStyle所以需要使用低级ooxml-schemas对象和方法来创建这样一个CTStyle对象。这样做的最短方法是解析XML到这样的对象。下面的完整示例显示了这一点。

import java.io.FileOutputStream;

import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

public class CreateWordTable {

 private static XWPFStyle createTableStyle(XWPFStyles styles, String styleId) throws Exception {
  if (styles == null || styleId == null) return null;
  String tableStyleXML = 
     "<w:style xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:styleId=\"" + styleId + "\" w:type=\"table\">"
   + "<w:name w:val=\"" + styleId + "\"/>"
   + "<w:pPr><w:spacing w:lineRule=\"auto\" w:line=\"240\" w:after=\"0\"/></w:pPr>"
   + "<w:tblPr>"
   + "<w:tblStyleRowBandSize w:val=\"1\"/><w:tblStyleColBandSize w:val=\"1\"/>"
   + "<w:tblBorders>"
   + "<w:top w:val=\"single\" w:themeTint=\"99\" w:themeColor=\"text1\" w:color=\"666666\" w:space=\"0\" w:sz=\"4\"/>"
   + "<w:bottom w:val=\"single\" w:themeTint=\"99\" w:themeColor=\"text1\" w:color=\"666666\" w:space=\"0\" w:sz=\"4\"/>"
   + "<w:insideH w:val=\"single\" w:themeTint=\"99\" w:themeColor=\"text1\" w:color=\"666666\" w:space=\"0\" w:sz=\"4\"/>"
   + "</w:tblBorders>"
   + "</w:tblPr>"
   + "<w:tblStylePr w:type=\"firstRow\"><w:rPr><w:b/><w:bCs/></w:rPr></w:tblStylePr>"
   + "<w:tblStylePr w:type=\"lastRow\"><w:rPr><w:b/><w:bCs/></w:rPr></w:tblStylePr>"
   + "<w:tblStylePr w:type=\"firstCol\"><w:rPr><w:b/><w:bCs/></w:rPr></w:tblStylePr>"
   + "<w:tblStylePr w:type=\"lastCol\"><w:rPr><w:b/><w:bCs/></w:rPr></w:tblStylePr>"
   + "<w:tblStylePr w:type=\"band1Vert\"><w:tblPr/><w:tcPr><w:shd w:val=\"clear\" w:color=\"auto\" w:themeFillTint=\"33\" w:themeFill=\"text1\" w:fill=\"CCCCCC\"/></w:tcPr></w:tblStylePr>"
   + "<w:tblStylePr w:type=\"band1Horz\"><w:tblPr/><w:tcPr><w:shd w:val=\"clear\" w:color=\"auto\" w:themeFillTint=\"33\" w:themeFill=\"text1\" w:fill=\"CCCCCC\"/></w:tcPr></w:tblStylePr>"
   + "</w:style>";

  CTStyles ctStyles = CTStyles.Factory.parse(tableStyleXML);
  CTStyle ctStyle = ctStyles.getStyleArray(0);

  XWPFStyle style = styles.getStyle(styleId);
  if (style == null) {
   style = new XWPFStyle(ctStyle, styles);
   styles.addStyle(style);
  } else {
   style.setStyle(ctStyle);
  }

  return style;
 }

 public static void main(String[] args) throws Exception {

  XWPFDocument document = new XWPFDocument();

  XWPFParagraph paragraph = document.createParagraph();
  XWPFRun run = paragraph.createRun();  
  run.setText("The table");
  XWPFTable table = document.createTable(6, 4);
  for (int r = 0; r < 6; r++) {
   for (int c = 0; c < 4; c++) {
    XWPFTableCell cell = table.getRow(r).getCell(c);
    cell.setText("row " + (r+1) + ", col " + (c+1));
   }
  }

  table.removeBorders();

  XWPFStyles styles = document.createStyles();
  XWPFStyle style = createTableStyle(styles, "ListTableStyle");
  table.setStyleID(style.getStyleId());
 
  FileOutputStream out = new FileOutputStream("CreateWordTable.docx");
  document.write(out);
  out.close();
  document.close();

 }
}

XML从哪里得到的?我使用创建了一个简单的表格Word,然后对其应用了表格样式“List Table 2”。然后我解压缩生成的*.docx文件并查看/word/styles.xml. 在那里我找到了XML用于表格样式“List Table 2”的内容。


推荐阅读