Есть ли способ удалить границы строк внутри таблицы в Apache POI? - PullRequest
0 голосов
/ 07 мая 2020

enter image description here В Apache POI вы можете удалить все границы из таблицы, однако я не хочу удалять все границы, я просто хочу удалить границы внутренних строк таблицы, Является ли это возможным? Предлагает ли Apache POI способ сделать это?

Я создал следующий метод для создания таблицы. Мне нужно удалить верхнюю и нижнюю границы второго столбца.

public void theTable(XWPFDocument doc) {

    XWPFTable t = doc.createTable(2,3);

    t.getRow(0).getCell(0).setWidth("5000");
    t.getRow(0).getCell(1).setWidth("500");
    t.getRow(0).getCell(2).setWidth("5000");

}

У меня есть следующее, что не соответствует моей цели, поскольку оно нацелено на всю таблицу, а не на столбец 2:

    t.removeBorders();
    t.removeBottomBorder();
    t.removeInsideHBorder();
    t.removeInsideVBorder();
    t.removeLeftBorder();
    t.removeRightBorder();
    t.removeTopBorder();

Можно ли это сделать?

1 Ответ

2 голосов
/ 09 мая 2020

До текущей Apache POI 4.1.2 в XWPFTableCell отсутствуют методы настройки границ. Но ячейки таблицы Word могут иметь собственные настройки границ. Так что эти методы должны быть добавлены в следующих версиях.

До тех пор мы могли бы предоставить собственный метод для этого, используя базовые ooxml-schemas классы.

Пример:

import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.*;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

public class CreateWordTableCellBorders {

 private enum Border { LEFT, TOP, BOTTOM, RIGHT }

 static void setTableCellBorder(XWPFTableCell cell, Border border, STBorder.Enum type) {
  CTTc tc = cell.getCTTc();
  CTTcPr tcPr = tc.getTcPr(); if (tcPr == null) tcPr = tc.addNewTcPr();
  CTTcBorders tcBorders = tcPr.getTcBorders(); if (tcBorders == null) tcBorders = tcPr.addNewTcBorders();
  if (border == Border.LEFT) {
   CTBorder left = tcBorders.getLeft(); if(left == null) left = tcBorders.addNewLeft();
   left.setVal(type);
  } else if (border == Border.TOP) {
   CTBorder top = tcBorders.getTop(); if(top == null) top = tcBorders.addNewTop();
   top.setVal(type);
  } else if (border == Border.BOTTOM) {
   CTBorder bottom = tcBorders.getBottom(); if(bottom == null) bottom = tcBorders.addNewBottom();
   bottom.setVal(type);
  } else if (border == Border.RIGHT) {
   CTBorder right = tcBorders.getRight(); if(right == null) right = tcBorders.addNewRight();
   right.setVal(type);
  }
 }

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

  XWPFDocument document= new XWPFDocument();

  XWPFParagraph paragraph = document.createParagraph();
  XWPFRun run=paragraph.createRun();  
  run.setText("The table:");

  //create the table
  XWPFTable table = document.createTable(2,3);

  //set column widths and table cell borders
  for (XWPFTableRow row : table.getRows()) {
   row.getCell(0).setWidth("5000");
   row.getCell(1).setWidth("500");
   setTableCellBorder(row.getCell(1), Border.TOP, STBorder.NIL);
   setTableCellBorder(row.getCell(1), Border.BOTTOM, STBorder.NIL);
   row.getCell(2).setWidth("5000");
  }

  FileOutputStream out = new FileOutputStream("CreateWordTableCellBorders.docx"); 
  document.write(out);
  out.close();
  document.close();
 }
}
...