我需要打开.dotx文档,修改内容(或类似内容)并放入自己的数据,然后返回生成的.docx / document。
对于dotx文件中的示例,在生成的docx文件中,字符串“ name”应替换为“ John”。
public static void main( String[] args ) throws IOException
{
String inputFile="D:/Copies 2.dotx";
// String outputeFile="D:/test.txt";
String outputeFile="D:/test.docx";
File inFile=new File(inputFile);
File ouFile=new File(outputeFile);
Map<String,String> hm = new HashMap<String,String>();
hm.put("Namur","Youssef");
App a = new App();
a.changeData(inFile,ouFile, hm);
}
private void changeData(File targetFile,File out, Map<String,String> substitutionData) throws IOException{
BufferedReader br = null;
String docxTemplate = "";
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(targetFile)));
String temp;
while( (temp = br.readLine()) != null) {
docxTemplate = docxTemplate + temp;
}
br.close();
}
catch (IOException e) {
br.close();
throw e;
}
Iterator<Entry<String, String>> substitutionDataIterator = substitutionData.entrySet().iterator();
while(substitutionDataIterator.hasNext()){
Map.Entry<String,String> pair = (Map.Entry<String,String>)substitutionDataIterator.next();
if(docxTemplate.contains(pair.getKey())){
if(pair.getValue() != null)
docxTemplate = docxTemplate.replace(pair.getKey(), pair.getValue());
else
docxTemplate = docxTemplate.replace(pair.getKey(), "NEDOSTAJE");
}
}
FileOutputStream fos = null;
try{
fos = new FileOutputStream(out);
fos.write(docxTemplate.getBytes());
fos.close();
}
catch (IOException e) {
fos.close();
throw e;
}
}
有人可以给我一些建议吗?
Ps:我正在使用apach POI 3.16
答案 0 :(得分:1)
因为解析dotx / docx文件不是那么简单 我们让apache poi为此付出了一些努力,例如
XWPFDocument doc = new XWPFDocument(OPCPackage.open("-you docx/dotx file-path-"));
通过此操作,您可以加载现有文件。 现在解析文件 你得到
XWPFParagraph
XWPFTable
您可以像这样解析两者
for (XWPFParagraph p : doc.getParagraphs()) {
List<XWPFRun> runs = p.getRuns();
if (runs != null) {
for (XWPFRun r : runs) {
String text = r.getText(0);
if (text != null && text.contains("$$key$$")) {
text = text.replace("<asdas>", "ABCD");// your content
r.setText(text, 0);
}
}
}
}
要分析表格
for (XWPFTable tbl : doc.getTables()) {
for (XWPFTableRow row : tbl.getRows()) {
for (XWPFTableCell cell : row.getTableCells()) {
for (XWPFParagraph p : cell.getParagraphs()) {
for (XWPFRun r : p.getRuns()) {
String text = r.getText(0);
if (text != null && text.contains("$$key$$")) {
text = text.replace("<asdas>", "abcd");
r.setText(text, 0);
}
}
}
}
}
}
现在将解析的文件写入您获得的目标中
doc.write(new FileOutputStream("-taget-path-"));
这需要使用Apache POI的所有依赖项 像
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
您将需要更多的构建路径,检查异常并添加。
您可以使用此链接并浏览更多