Как заменить «переменные» в docx в Apache POI JavaJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как заменить «переменные» в docx в Apache POI Java

Сообщение Anonymous »

Я пишу метод, который заменяет текст в документе docx, используя Apache POI. В самом документе имеется x «переменных», отмеченных знаком «». Так, например, документ Midth выглядит примерно так: «В > человек > выполняет >.». Суть метода состоит в том, чтобы получить XWPFParagraph и Map переменныеValues, а также выполнить прогоны абзаца и заменить там, где он находит ключ переменныхValues ​​(так что это жестко запрограммировано в документе) на значение ключа.

Код: Выделить всё

private void replaceTextInParagraph(XWPFParagraph paragraph, Map variableValues) {
List runs = paragraph.getRuns();
StringBuilder paragraphText = new StringBuilder();

// Step 1: Gather all text from the paragraph
for (XWPFRun run : runs) {
String text = run.getText(0);
if (text != null) {
paragraphText.append(text);
}
}

// Step 2: Perform replacements on the complete text
String replacedText = paragraphText.toString();
for (Map.Entry entry : variableValues.entrySet()) {
replacedText = replacedText.replace("", entry.getValue());
}

// Step 3: Clear all existing runs
for (XWPFRun run : runs) {
run.setText("", 0);
}

// Step 4: Add the replaced text back to the paragraph
if (!replacedText.isEmpty()) {
XWPFRun newRun = paragraph.createRun();
newRun.setText(replacedText);
}
}
Это последняя итерация кода, но здесь есть фундаментальная проблема. Это сильно портит стиль кода. Он меняет шрифт (например, от 11 до 10, но не последовательно во всем файле), а также если одна переменная выделена жирным шрифтом, что означает следующее: , то значение переменной должно быть тоже жирный. Но на практике были смешанные решения: в одном и том же документе один абзац был полностью выделен жирным шрифтом, а другой был прямо противоположным и не был выделен жирным шрифтом, хотя в обоих абзацах было всего несколько переменных, выделенных жирным шрифтом.
И это метод, который я использую для просмотра документа.

Код: Выделить всё

    public void replaceVariables(XWPFDocument document, Map variableValues) {
for (XWPFParagraph paragraph : document.getParagraphs()) {
replaceTextInParagraph(paragraph, variableValues);
}
for (XWPFHeader header : document.getHeaderList()) {
for (XWPFParagraph paragraph : header.getParagraphs()) {
replaceTextInParagraph(paragraph, variableValues);
}
processTables(header.getTables(), variableValues);
}
for (XWPFFooter footer : document.getFooterList()) {
for (XWPFParagraph paragraph : footer.getParagraphs()) {
replaceTextInParagraph(paragraph, variableValues);
}
processTables(footer.getTables(), variableValues);
}
processTables(document.getTables(), variableValues);
}
private void processTables(List tables, Map variableValues) {
for (XWPFTable table : tables) {
for (XWPFTableRow row : table.getRows()) {
for (XWPFTableCell cell : row.getTableCells()) {
for (XWPFParagraph paragraph : cell.getParagraphs()) {
replaceTextInParagraph(paragraph, variableValues);
}
}
}
}
}
Я также даю вам две старые версии кода, чтобы увидеть, что я пробовал раньше. Последнее решение, которое я дал, наиболее близко к правильной работе программы.

Код: Выделить всё

    private void replaceTextInParagraph(XWPFParagraph paragraph, Map variableValues) {
List runs = paragraph.getRuns();
//        List newRuns = new ArrayList();
StringBuilder paragraphText = new StringBuilder();

for (XWPFRun run : runs) {
//            XWPFRun newRun = run;
//            newRun.setText("", 0);
//            newRuns.add(newRun);

String text = run.getText(0);
if (text != null) {
paragraphText.append(text);
}
}

String replacedText = paragraphText.toString();
for (Map.Entry entry : variableValues.entrySet()) {
replacedText = replacedText.replace("", entry.getValue());
}

//        while (!paragraph.getRuns().isEmpty()) {
//            paragraph.removeRun(0);
//        }
String [] textParts = replacedText.split(" ");

for (int i = 0; i < runs.size(); i++) {
int j = 0;
runs.get(i).setText(textParts[j], 0);

paragraph.addRun(runs.get(i));
}
//
//        XWPFRun newRun = paragraph.createRun();
//        newRun.setText(replacedText);
}

private void replaceTextInParagraph(XWPFParagraph paragraph, Map variableValues) {
StringBuilder paragraphText = new StringBuilder();
List runs = paragraph.getRuns();

// First, get the entire text of the paragraph
for (XWPFRun run : runs) {
String text = run.getText(0);
if (text != null) {
paragraphText.append(text);
}
}

// Perform the replacement on the entire paragraph text
String replacedText = paragraphText.toString();
for (Map.Entry entry : variableValues.entrySet()) {
replacedText = replacedText.replace("", entry.getValue());
}

// Split the replaced text back into runs
int currentIndex = 0;
for (XWPFRun run : runs) {
String text = run.getText(0);
if (text != null) {
int remainingLength = replacedText.length() - currentIndex; // Calculate remaining length in the replaced text
String subText;

if (text.length() 

Подробнее здесь: [url]https://stackoverflow.com/questions/78982146/how-to-replace-variables-in-docx-in-apache-poi-java[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»