XWPFRuns and XWPFParagraph Apache POI помогите исправить

460
03 октября 2017, 03:38

Добрый день, помогите исправить, суть такая есть исходный документ (шаблон) его нужно изменять, меняя часть шаблонного текста на нужную, но проблема в том, что

`for (XWPFParagraph p : doc.getParagraphs()) {
            System.out.println("-----"+p.getText());

и

`for (XWPFRun r : runs) {
                    String text = r.getText(0);`

отличаются, т.е. runs разбивает входящую строку параграфа и не получается проверить на вхождение и заменить участок нужного теста. Пример кода

public static void ChengePattern(Paragraphs paragraphs) throws FileNotFoundException, IOException, InvalidFormatException {
XWPFDocument doc = new XWPFDocument(OPCPackage.open("fileName.docx"));
        for (XWPFParagraph p : doc.getParagraphs()) {
            //System.out.println("-----"+p.getText());
            List<XWPFRun> runs = p.getRuns();
           if (runs != null) {
                for (XWPFRun r : runs) {
                    String text = r.getText(0);
                    if (text != null && text.contains("Name")) {
                        text = text.replace("Name", paragraphs.address);
                        r.setText(text, 0);
                    }
                    else if (text != null && text.contains("Address")) {
                        text = text.replace("Address", paragraphs.address);
                        r.setText(text, 0);
                    }
                }
            }
        }
        doc.write(new FileOutputStream("path\\output.docx"));
}

пробовал собирать runs стрингбилдером, и заменять в нем нужную часть текста и вставлять в Runs, но лучшее чего смог добиться это просто вставка нужного мне теста в позицию шаблонного текста с сохранением исходной.

public static void ChengePattern(Paragraphs paragraphs) throws FileNotFoundException, IOException, InvalidFormatException {
    XWPFDocument doc = new XWPFDocument(OPCPackage.open("fileName.docx"));
    for (XWPFParagraph p : doc.getParagraphs()) {
        //System.out.println("-----"+p.getText());
       List<XWPFRun> runs = p.getRuns();
       StringBuilder sb = new StringBuilder();
       if (runs != null) {
            for (XWPFRun r : runs) {
                String text = r.getText(0);
                sb.append(r.getText(r.getTextPosition()));
                System.out.println(sb.toString());
                if (sb.toString().contains("Name")) {
                    text = sb.toString().replace("Name", paragraphs.subscriber);
                    r.setText(text, 0);
                }
                else if (sb.toString().contains("Address")) {
                    text = sb.toString().replace("Address", paragraphs.address);
                    r.setText(text, 0);
                }
        }
    }
    doc.write(new FileOutputStream("path\\output.docx"));
}

}

Для понятности приведу примеры

System.out.println(System.out.println("-----"+p.getText());

результат

-----Приложение №1 к ТУ № -----Т Е Х Н И Ч Е С К И Е Т Р Е Б О В А Н И Я -----на присоединение эл.установок 0,4 кВ -----трехэтажного административного комплекса -----Выданы: Name. -----Место расположения объекта: Address.

if (runs != null) {
                for (XWPFRun r : runs) {
                    String text = r.getText(0);
                    System.out.println("------"+text);

------null ------Приложение №1 ------ к ТУ №

------Т Е Х Н И Ч Е С К И Е Т

------Р

------Е

------Б

------О

------В

------А

------Н

------И

------Я

------на ------присоединение ------эл.установок ------ 0,

------4

------кВ ------трехэтажн ------ого ------ административн ------ого ------ комплекс ------а

как видно, runs дробит текст в строке параграфа. и результат лучшего варианта на данный момент

Приложение №1 к ТУ № Т Е Х Н И Ч Е С К И Е Т Р Е Б О В А Н И Я на присоединение эл.установок 0,4 кВ трехэтажного административного комплекса Выданы: NameВыданы:paragraphs.subscriber Место расположения объекта: AddressМесто расположения объекта:paragraphs.address

Вроде бы, можно удалить изначальную строку шаблона и вставить свою, но проблема в том, что не сохраняется форматирование текста, (выделение жирным, шрифты).

READ ALSO
Как переписать SQL запрос на criteria api?

Как переписать SQL запрос на criteria api?

SQL работает отлично и выводит все как нужноХочу переписать его на criteria api, я написал вот такой метод

316
Android - Удержание прав доступа

Android - Удержание прав доступа

Подскажите, есть раздел про то, как удержать права доступа, дескать сделать такое можно, но на примерах и на практике не нашел реализации,...

213
Разбор массива JSON

Разбор массива JSON

Как вытащить строку в правильном формате? Сейчас пока вытащил только так в логи:

319
Интерфейсы C++ наподобие Java interface

Интерфейсы C++ наподобие Java interface

Изучал Java, сейчас захотелось чуть чуть подучить C++Захотел изобрести такой велосипед, как сортировку

205