是否可以在 Apache POI XWPF 中设置默认 table 样式?

Is it possible to set a default table style in Apache POI XWPF?

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

在 Word 中,如图所示进行设置。 不知道有没有办法像word一样指定基本样式table.

谢谢!

table 样式存储在 WordOffice Open XML 文件存储中的单独 styles.xml 文件中。 Apache POI 默认情况下不会创建这样的样式文档。但它支持使用 XWPFDocument.createStyles 创建这样的对象。如果有,则需要在该样式文档中创建一个 table 样式。然后 link 使用 XWPFTable.setStyleID.

那个样式到 table

到目前为止,只有使用需要 org.openxmlformats.schemas.wordprocessingml.x2006.main.CTStyle 对象的构造函数才支持创建 XWPFStyle。因此需要使用低级 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 创建了一个简单的 table,然后对其应用了 table 样式“List Table 2”。然后我解压缩生成的 *.docx 文件并查看 /word/styles.xml。在那里我发现 XML 用于 table 样式“List Table 2”。