Merge pull request #14141 from thibaultfaure/article/BAEL-5773
BAEL-5773 Code for the Replacing Variables in a Document Template wit…
This commit is contained in:
commit
1e25991080
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>apache-poi-2</artifactId>
|
<artifactId>apache-poi-2</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
@ -19,10 +19,15 @@
|
||||||
<artifactId>poi-ooxml</artifactId>
|
<artifactId>poi-ooxml</artifactId>
|
||||||
<version>${poi.version}</version>
|
<version>${poi.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.poi</groupId>
|
||||||
|
<artifactId>poi-scratchpad</artifactId>
|
||||||
|
<version>${poi.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<poi.version>5.2.0</poi.version>
|
<poi.version>5.2.3</poi.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -0,0 +1,38 @@
|
||||||
|
package com.baeldung.poi.replacevariables;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import org.apache.poi.hwpf.HWPFDocument;
|
||||||
|
import org.apache.poi.hwpf.usermodel.Range;
|
||||||
|
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||||
|
|
||||||
|
public class DocTextReplacer {
|
||||||
|
|
||||||
|
public void replaceText() throws IOException {
|
||||||
|
String filePath = getClass().getClassLoader()
|
||||||
|
.getResource("baeldung.doc")
|
||||||
|
.getPath();
|
||||||
|
try (InputStream inputStream = new FileInputStream(filePath); POIFSFileSystem fileSystem = new POIFSFileSystem(inputStream)) {
|
||||||
|
HWPFDocument doc = new HWPFDocument(fileSystem);
|
||||||
|
doc = replaceText(doc, "Baeldung", "Hello");
|
||||||
|
saveFile(filePath, doc);
|
||||||
|
doc.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private HWPFDocument replaceText(HWPFDocument doc, String originalText, String updatedText) {
|
||||||
|
Range range = doc.getRange();
|
||||||
|
range.replaceText(originalText, updatedText);
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveFile(String filePath, HWPFDocument doc) throws IOException {
|
||||||
|
try (FileOutputStream out = new FileOutputStream(filePath)) {
|
||||||
|
doc.write(out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
package com.baeldung.poi.replacevariables;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.poi.xwpf.usermodel.XWPFDocument;
|
||||||
|
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
|
||||||
|
import org.apache.poi.xwpf.usermodel.XWPFRun;
|
||||||
|
import org.apache.poi.xwpf.usermodel.XWPFTable;
|
||||||
|
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
|
||||||
|
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
|
||||||
|
|
||||||
|
public class DocxNaiveTextReplacer {
|
||||||
|
|
||||||
|
public void replaceText() throws IOException {
|
||||||
|
String filePath = getClass().getClassLoader()
|
||||||
|
.getResource("baeldung-copy.docx")
|
||||||
|
.getPath();
|
||||||
|
try (InputStream inputStream = new FileInputStream(filePath)) {
|
||||||
|
XWPFDocument doc = new XWPFDocument(inputStream);
|
||||||
|
doc = replaceText(doc, "Baeldung", "Hello");
|
||||||
|
saveFile(filePath, doc);
|
||||||
|
doc.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private XWPFDocument replaceText(XWPFDocument doc, String originalText, String updatedText) {
|
||||||
|
replaceTextInParagraphs(doc.getParagraphs(), originalText, updatedText);
|
||||||
|
for (XWPFTable tbl : doc.getTables()) {
|
||||||
|
for (XWPFTableRow row : tbl.getRows()) {
|
||||||
|
for (XWPFTableCell cell : row.getTableCells()) {
|
||||||
|
replaceTextInParagraphs(cell.getParagraphs(), originalText, updatedText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void replaceTextInParagraphs(List<XWPFParagraph> paragraphs, String originalText, String updatedText) {
|
||||||
|
paragraphs.forEach(paragraph -> replaceTextInParagraph(paragraph, originalText, updatedText));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void replaceTextInParagraph(XWPFParagraph paragraph, String originalText, String updatedText) {
|
||||||
|
List<XWPFRun> runs = paragraph.getRuns();
|
||||||
|
for (XWPFRun run : runs) {
|
||||||
|
String text = run.getText(0);
|
||||||
|
if (text != null && text.contains(originalText)) {
|
||||||
|
String updatedRunText = text.replace(originalText, updatedText);
|
||||||
|
run.setText(updatedRunText, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveFile(String filePath, XWPFDocument doc) throws IOException {
|
||||||
|
try (FileOutputStream out = new FileOutputStream(filePath)) {
|
||||||
|
doc.write(out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
package com.baeldung.poi.replacevariables;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import org.apache.poi.xwpf.usermodel.XWPFDocument;
|
||||||
|
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
|
||||||
|
import org.apache.poi.xwpf.usermodel.XWPFRun;
|
||||||
|
import org.apache.poi.xwpf.usermodel.XWPFTable;
|
||||||
|
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
|
||||||
|
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
|
||||||
|
|
||||||
|
public class DocxTextReplacer {
|
||||||
|
|
||||||
|
public void replaceText() throws IOException {
|
||||||
|
String filePath = getClass().getClassLoader()
|
||||||
|
.getResource("baeldung.docx")
|
||||||
|
.getPath();
|
||||||
|
try (InputStream inputStream = new FileInputStream(filePath)) {
|
||||||
|
XWPFDocument doc = new XWPFDocument(inputStream);
|
||||||
|
doc = replaceText(doc, "Baeldung", "Hello");
|
||||||
|
saveFile(filePath, doc);
|
||||||
|
doc.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private XWPFDocument replaceText(XWPFDocument doc, String originalText, String updatedText) {
|
||||||
|
replaceTextInParagraphs(doc.getParagraphs(), originalText, updatedText);
|
||||||
|
for (XWPFTable tbl : doc.getTables()) {
|
||||||
|
for (XWPFTableRow row : tbl.getRows()) {
|
||||||
|
for (XWPFTableCell cell : row.getTableCells()) {
|
||||||
|
replaceTextInParagraphs(cell.getParagraphs(), originalText, updatedText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void replaceTextInParagraphs(List<XWPFParagraph> paragraphs, String originalText, String updatedText) {
|
||||||
|
paragraphs.forEach(paragraph -> replaceTextInParagraph(paragraph, originalText, updatedText));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void replaceTextInParagraph(XWPFParagraph paragraph, String originalText, String updatedText) {
|
||||||
|
String paragraphText = paragraph.getParagraphText();
|
||||||
|
if (paragraphText.contains(originalText)) {
|
||||||
|
String updatedParagraphText = paragraphText.replace(originalText, updatedText);
|
||||||
|
while (paragraph.getRuns().size() > 0) {
|
||||||
|
paragraph.removeRun(0);
|
||||||
|
}
|
||||||
|
XWPFRun newRun = paragraph.createRun();
|
||||||
|
newRun.setText(updatedParagraphText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveFile(String filePath, XWPFDocument doc) throws IOException {
|
||||||
|
try (FileOutputStream out = new FileOutputStream(filePath)) {
|
||||||
|
doc.write(out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,31 @@
|
||||||
|
package com.baeldung.poi.replacevariables;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import org.apache.poi.hwpf.HWPFDocument;
|
||||||
|
import org.apache.poi.hwpf.extractor.WordExtractor;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
class DocTextReplacerUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenReplaceText_ThenTextReplaced() throws IOException {
|
||||||
|
new DocTextReplacer().replaceText();
|
||||||
|
|
||||||
|
String filePath = getClass().getClassLoader()
|
||||||
|
.getResource("baeldung.doc")
|
||||||
|
.getPath();
|
||||||
|
try (FileInputStream fis = new FileInputStream(filePath); HWPFDocument document = new HWPFDocument(fis); WordExtractor extractor = new WordExtractor(document)) {
|
||||||
|
long occurrencesOfHello = Arrays.stream(extractor.getText()
|
||||||
|
.split("\\s+"))
|
||||||
|
.filter(s -> s.contains("Hello"))
|
||||||
|
.count();
|
||||||
|
assertEquals(5, occurrencesOfHello);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
package com.baeldung.poi.replacevariables;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
|
||||||
|
import org.apache.poi.xwpf.usermodel.XWPFDocument;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
class DocxNaiveTextReplacerUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenReplaceText_ThenTextReplaced() throws IOException {
|
||||||
|
new DocxNaiveTextReplacer().replaceText();
|
||||||
|
|
||||||
|
String filePath = getClass().getClassLoader()
|
||||||
|
.getResource("baeldung-copy.docx")
|
||||||
|
.getPath();
|
||||||
|
try (FileInputStream fis = new FileInputStream(filePath); XWPFDocument document = new XWPFDocument(fis); XWPFWordExtractor extractor = new XWPFWordExtractor(document)) {
|
||||||
|
long occurrencesOfHello = Arrays.stream(extractor.getText()
|
||||||
|
.split("\\s+"))
|
||||||
|
.filter(s -> s.contains("Hello"))
|
||||||
|
.count();
|
||||||
|
assertTrue(occurrencesOfHello < 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
package com.baeldung.poi.replacevariables;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
|
||||||
|
import org.apache.poi.xwpf.usermodel.XWPFDocument;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
class DocxTestReplacerUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenReplaceText_ThenTextReplaced() throws IOException {
|
||||||
|
new DocxTextReplacer().replaceText();
|
||||||
|
|
||||||
|
String filePath = getClass().getClassLoader()
|
||||||
|
.getResource("baeldung.docx")
|
||||||
|
.getPath();
|
||||||
|
try (FileInputStream fis = new FileInputStream(filePath); XWPFDocument document = new XWPFDocument(fis); XWPFWordExtractor extractor = new XWPFWordExtractor(document)) {
|
||||||
|
long occurrencesOfHello = Arrays.stream(extractor.getText()
|
||||||
|
.split("\\s+"))
|
||||||
|
.filter(s -> s.contains("Hello"))
|
||||||
|
.count();
|
||||||
|
assertEquals(5, occurrencesOfHello);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue