Apache POI, позиционирование таблицы игнорируется (.docx, xwpf)

Я пытаюсь разместить таблицу, используя элемент tblPr и его атрибуты tblpX и tblpY. Моя проблема в том, что когда я открываю файл .docx, таблица находится в верхнем левом углу страницы, игнорируя значения tblpX и tblPY. Вы можете найти подробную информацию о расположении таблиц .docx здесь или здесь. Это должно выглядеть примерно так:

<w:tbl>
  <w:tblPr>
  <w:tblpPr w:vertAnchor="text" w:tblpY="200" />
  </w:tblPr>  
  …
</w:tbl>

Apache POI не предлагает атрибуты «tblpY» и «tblpX», поэтому я могу добавить этот атрибут только вручную. Вот мой код для этого:

public static XWPFTable createTable(XWPFDocument doc) {

  //CTTbl ctTable = CTTbl.Factory.newInstance();
  XWPFTable table = doc.createTable();//new XWPFTable(ctTable, doc, 0, 0);

  XmlObject x = (XmlObject) table.getCTTbl().getTblPr();
  XmlCursor c = x.newCursor();  // Create a cursor at the element
  c.toNextToken();              // Move cursor after the tblPr tag
  c.insertElement("tblPr", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");

  c.toPrevSibling(); //Now go to the tblPr
  XmlObject x2 = c.getObject(); //Get the tblPr object
  c.dispose();
  c = x2.newCursor(); //Now our cursor is inside the second tblPr
  c.toNextToken();
  c.insertAttributeWithValue("tblpX", "http://schemas.openxmlformats.org/wordprocessingml/2006/main", "500");
  c.insertAttributeWithValue("tblpY", "http://schemas.openxmlformats.org/wordprocessingml/2006/main", "500");
  c.dispose();

  XWPFTableRow tr = table.getRow(0);
  XWPFTableCell cell = tr.getCell(0);
  cell.setText("some text");

  return table;  

}

Я открыл .docx и убедился, что внутри document.xml находится следующее:

<w:tbl>
  <w:tblPr>
    <w:tblPr w:tblpX="500" w:tblpY="500"/>
    <w:tblW w:w="0" w:type="auto"/>
    <w:tblBorders>
      <w:top w:val="single"/>
      <w:left w:val="single"/>
      <w:bottom w:val="single"/>
      <w:right w:val="single"/>
      <w:insideH w:val="single"/>
      <w:insideV w:val="single"/>
    </w:tblBorders>
  </w:tblPr>
  <w:tr>
    <w:tc>
      <w:p>
        <w:r>
          <w:t>some text</w:t>
        </w:r>
      </w:p>
    </w:tc>
  </w:tr>
</w:tbl>

Так что я делаю неправильно? Почему таблица все еще в левом верхнем углу? Почему Microsoft Word игнорирует мои значения tblpX и tblpY?


person Ben Shumway    schedule 03.11.2017    source источник
comment
Ой!!! Я нашел решение!   -  person Ben Shumway    schedule 03.11.2017


Ответы (1)


Дочерний узел внутри tblPr должен быть: tblpPr NOT tblPr!

это единственное отличие в синтаксисе «p» сбивало меня с толку.

Во всяком случае, надеюсь, кто-то может извлечь из этого уроки. Например. не было решения StackOverflow о том, как использовать Apache POI для абсолютного позиционирования таблицы... до сих пор мваахаха

person Ben Shumway    schedule 03.11.2017