Current output:
Needed output:
above are the snapshots of the .docx and below is the code sample code, I want to change the color of a
after it is replaced by @
. r.setColor("DC143C")
doesn't work:
for (XWPFParagraph p : docx.getParagraphs()) {
List<XWPFRun> runs = p.getRuns();
if (runs != null) {
for (XWPFRun r : runs) {
String origText = r.getText(0);
if (origText != null && origText.contains("a")) {
origText = origText.replace("a", "@");
r.setText(origText, 0);
}
}
}
}
Select the text you're interested in. Right click on the text and choose Font from the context menu (or just hit ctrl-D) Click the down arrow to the right of the Font color setting, then click More Colors. Click the Custom tab, and you'll see the RGB value of the colour.
Apache POI provides three methods for changing the background color. In the CellStyle class, we can use the setFillForegroundColor, setFillPattern, and setFillBackgroundColor methods for this purpose. A list of colors is defined in the IndexedColors class. Similarly, a list of patterns is defined in FillPatternType.
In “Find and Replace” dialog box, put cursor in “Find what” text box and clear any content there if any. Next click “More” button. Now click “Format” button and Choose “Font”. In “Find Font” dialog box, click the drop down button behind “Font color” to choose the exact color you assign to your texts.
If the need is to change the color of just one character then this character must be in its own run. This is because only runs can be styled.
If you have a document containing text already then you must run through all already existing runs and possible split those runs into multiple ones. As the result each string part which shall be styled separately must be in its own run, also if it is only one character.
Example:
import java.io.*;
import org.apache.poi.xwpf.usermodel.*;
import java.awt.Desktop;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
public class WordReadAndWrite {
public static void main(String[] args) throws IOException, InvalidFormatException {
XWPFDocument doc = new XWPFDocument(new FileInputStream("source.docx"));
for (XWPFParagraph p : doc.getParagraphs()) { //go through all paragraphs
int runNumber = 0;
while (runNumber < p.getRuns().size()) { //go through all runs, we cannot use for each since we will possibly insert new runs
XWPFRun r = p.getRuns().get(runNumber);
String runText = r.getText(0);
if (runText != null && runText.contains("a")) { //if we have a run with an "a" in it, then
char[] runChars = runText.toCharArray();
StringBuffer sb = new StringBuffer();
for (int charNumber = 0; charNumber < runChars.length; charNumber++) { //go through all characters in that run
if (runChars[charNumber] == 'a') { //if the charcter is an 'a' then
r.setText(sb.toString(), 0); //set all characters, which are current buffered, as the text of the actual run
r = p.insertNewRun(++runNumber); //insert new run for the '@' as the replacement for the 'a'
r.setText("@", 0);
r.setColor("DC143C");
r = p.insertNewRun(++runNumber); //insert new run for the next characters
sb = new StringBuffer(); //empty buffer
} else {
sb.append(runChars[charNumber]); //buffer all characters which are not 'a's
}
}
r.setText(sb.toString(), 0); //set all characters, which are current buffered, as the text of the actual run
}
runNumber++;
}
}
doc.write(new FileOutputStream("result.docx"));
doc.close();
System.out.println("Done");
Desktop.getDesktop().open(new File("result.docx"));
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With