Java Apache POI, разделить строку таблицы в docx файле

309
25 января 2018, 19:10

Генерирую таблицу через Apache POI:

    XWPFDocument wordDoc = new XWPFDocument();
    XWPFTable table;
    XWPFTableRow row;
    XWPFTableCell cell;
    table = wordDoc.createTable(1, 1);
    row = table.getRow(0);
    row.getCell(0).getCTTc().addNewTcPr().addNewTcW().setW(BigInteger.valueOf(100));
    cell = row.getCell(0);
    cell.setText("Стоимость ремонтных воздействий");
    cell.getParagraphs().get(0).setAlignment(ParagraphAlignment.CENTER);
    table.addRow(table.createRow());
    cell = table.getRow(1).getCell(0);
    cell.setText("Наименование");
    cell.getParagraphs().get(0).setAlignment(ParagraphAlignment.CENTER);
    cell = table.getRow(1).addNewTableCell();
    cell.setText("Цена");
    cell.getParagraphs().get(0).setAlignment(ParagraphAlignment.CENTER);
    cell = table.getRow(1).createCell();
    cell.setText("Нормо-час");
    cell.getParagraphs().get(0).setAlignment(ParagraphAlignment.CENTER);
    cell = table.getRow(1).createCell();
    cell.setText("Сумма");
    cell.getParagraphs().get(0).setAlignment(ParagraphAlignment.CENTER);

И независимо от метода createCell() или addNewTableCell() ячейки добавляются после строки, расширяя таблицу и сужая 1 колонку:

Как мне вставить эти ячейки внутрь строки?
Я хочу получить вот это:

Answer 1
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHMerge;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class MergingXWPFDocument {
    public static void main(String[] args) throws IOException {
        try (XWPFDocument wordDoc = new XWPFDocument()) {
            XWPFTable table = wordDoc.createTable(3, 4);
            XWPFTableRow tableRowOne = table.getRow(0);
            tableRowOne.getCell(0).setText("Стоимость ремонтных воздействий");
            XWPFTableRow tableRowTwo = table.getRow(1);
            tableRowTwo.getCell(0).setText("Наименование");
            tableRowTwo.getCell(1).setText("Цена");
            tableRowTwo.getCell(2).setText("Нормо-час");
            tableRowTwo.getCell(3).setText("Сумма");
            XWPFTableRow tableRowThree = table.getRow(2);
            tableRowThree.getCell(0).setText("");
            mergeCellHorizontally(table, 0, 0, 3);
            mergeCellHorizontally(table, 2, 0, 3);
            try (OutputStream os = new FileOutputStream(new File("C:\\mergingtable.docx"))) {
                wordDoc.write(os);
            }
        }
    }
    static void mergeCellHorizontally(XWPFTable table, int row, int fromCol, int toCol) {
        for (int colIndex = fromCol; colIndex <= toCol; colIndex++) {
            CTHMerge hmerge = CTHMerge.Factory.newInstance();
            if (colIndex == fromCol) {
                hmerge.setVal(STMerge.RESTART);
            } else {
                hmerge.setVal(STMerge.CONTINUE);
            }
            XWPFTableCell cell = table.getRow(row).getCell(colIndex);
            CTTcPr tcPr = cell.getCTTc().getTcPr();
            if (tcPr != null) {
                tcPr.setHMerge(hmerge);
            } else {
                tcPr = CTTcPr.Factory.newInstance();
                tcPr.setHMerge(hmerge);
                cell.getCTTc().setTcPr(tcPr);
            }
        }
    }
}

READ ALSO
Launch4j не подгружает jar и dependecies

Launch4j не подгружает jar и dependecies

Всем привет, создала exe файл с помощью launch4j, все нормально, проект запускается, но есть некоторые части которые не работают без jar и dependencies,...

250
Реклама съедает память устройства

Реклама съедает память устройства

Решил я попробовать добавить в одно своё Activity рекламуВыбор упал на знаменитый AdMob

237
Вопрос про stream api java 8

Вопрос про stream api java 8

Здравствуйте, имеется 2 стринговых листа List<String> fileList и List<String> arr, требуется вывести сколько слов в fileList содержатся в arr, сделал так:

240
Android, SQLite и REGEXP

Android, SQLite и REGEXP

ЗдравствуйтеПишется Андроид-приложение, в нем требуется использование Базы данных и поиск по ней с использованием регулярных выражений

225