注:本文由于个人工作需要,有对多个他人博文进行借鉴,但是多数博文都只是讲到了小部分,例如图片/表格的操作,都只有根据书签进行替换,比较片面,本人有总结到根据文字进行图片/表格的替换,希望可以帮到更多有需要的朋友 。
java代码对word文档进行文字,图片,表格的添加以及替换,效果图如下:
前提:需要引入包 Spire.Doc.jar 大家可以去官网进行下载:https://www.e-iceblue.cn/
public static void main(String[] args) {
Document document = new Document("C:/Users/moreyou0426003/Desktop/测试文字-图片-表格模板.docx");
/****** 1.使用新文本替换文档中的指定文本 begin ******/
document.replace("${title}", "水晶之痕", false, true);
document.replace("${currentYear}", "2019", false, true);
document.replace("${currentMonth}", "12", false, true);
document.replace("${currentDate}", "25", false, true);
document.replace("${startYear}", "2010", false, true);
document.replace("${endYear}", "2020", false, true);
document.replace("${name}", "艾欧尼亚", false, true);
/********************* 1.使用新文本替换文档中的指定文本 end *********************/
/********************* 2.图片替换文字 begin *********************/
//获取第二段
//Paragraph para = document.getSections().get(0).getParagraphs().get(1);
//添加图片,并设置图片高、宽
//DocPicture picture = para.appendPicture("C:/Users/moreyou0426003/Desktop/img.jpg");
//picture.setHeight(200);
//picture.setWidth(300);
/**********以上是根据段落添加图片************/
//获取第一个section
Section section = document.getSections().get(0);
TextSelection selection = document.findString("${img}", true, true);
//查找文档中的指定文本内容
TextSelection[] selections = document.findAllString("${img}", true, true);
int index = 0;
TextRange range = null;
//遍历文档,移除文本内容,插入图片
for (TextSelection selection : selections) {
DocPicture pic = new DocPicture(document);
pic.loadImage("C:/Users/moreyou0426003/Desktop/img.jpg");
range = selection.getAsOneRange();
index = range.getOwnerParagraph().getChildObjects().indexOf(range);
range.getOwnerParagraph().getChildObjects().insert(index, pic);
range.getOwnerParagraph().getChildObjects().remove(range);
}
/********************* 2.图片替换文字 end *********************/
/********************* 3.表格替换文字 begin *********************/
//声明数组内容
/*
String[][] data =
{
new String[]{"班级", "姓名", "学号"},
new String[]{"1班", "刘楠", "Y12534"},
new String[]{"2班", "刘莉", "Y12547"},
new String[]{"3班", "方红", "Y12365"},
};
//创建表格
Table table = new Table(document, true);
table.resetCells(4, 3);
for (int i = 0; i < data.length; i++) {
TableRow dataRow = table.getRows().get(i);
for (int j = 0; j < data[i].length; j++) {
TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]);
range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center);
range.getCharacterFormat().setFontName("楷体");
dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center);
dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle);
}
}
//定位到指定书签位置,添加表格
BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document);
bookmarksNavigator.moveToBookmark("bookmark1");
bookmarksNavigator.insertTable(table);
*/
/**********以上是根据书签添加表格**************/
//查找关键字符串文本
Section section = document.getSections().get(0);
TextSelection[] selections2 = document.findAllString("${list}", true, true);
for (TextSelection selection2 : selections2) {
//获取关键字符串所在段落的索引
TextRange range2 = selection2.getAsOneRange();
Paragraph paragraph = range2.getOwnerParagraph();
Body body = paragraph.ownerTextBody();
int index2 = body.getChildObjects().indexOf(paragraph);
//添加一个两行三列的表格
Table table = section.addTable(true);
table.resetCells(2, 3);
range2 = table.get(0, 0).addParagraph().appendText("学号");
range2 = table.get(0, 1).addParagraph().appendText("姓名");
range2 = table.get(0, 2).addParagraph().appendText("性别");
range2 = table.get(1, 0).addParagraph().appendText("XH001");
range2 = table.get(1, 1).addParagraph().appendText("张三");
range2 = table.get(1, 2).addParagraph().appendText("男");
//移除段落,插入表格
body.getChildObjects().remove(paragraph);
body.getChildObjects().insert(index2, table);
}
/********************* 3.表格替换文字 end *********************/
//保存文档
document.saveToFile("C:/Users/moreyou0426003/Desktop/测试文字-图片-表格模板.docx");
}
代码可能存在很多注释的地方,并不是没用的代码,我将逐步解析!
解析:
Document document = new Document();
document.loadFromFile("C:/Users/moreyou0426003/Desktop/测试文字-图片-表格模板.docx");
以上代码是读取源文件
document.replace("${title}", "水晶之痕", false, true);
document.replace("${currentYear}", "2019", false, true);
document.replace("${currentMonth}", "12", false, true);
document.replace("${currentDate}", "25", false, true);
document.replace("${startYear}", "2010", false, true);
document.replace("${endYear}", "2020", false, true);
document.replace("${name}", "艾欧尼亚", false, true);
以上代码是对读取到的源文件进行文字替换操作
//获取第二段
Paragraph para = document.getSections().get(0).getParagraphs().get(1);
//添加图片,并设置图片高、宽
DocPicture picture = para.appendPicture("C:/Users/moreyou0426003/Desktop/img.jpg");
picture.setHeight(200);
picture.setWidth(300);
以上代码是根据段落进行图片的插入
TextSelection[] selections = document.findAllString("${img}", true, true);
int index = 0;
TextRange range = null;
//遍历文档,移除文本内容,插入图片
for (TextSelection selection : selections) {
DocPicture pic = new DocPicture(document);
pic.loadImage("C:/Users/moreyou0426003/Desktop/img.jpg");
range = selection.getAsOneRange();
index = range.getOwnerParagraph().getChildObjects().indexOf(range);
range.getOwnerParagraph().getChildObjects().insert(index, pic);
range.getOwnerParagraph().getChildObjects().remove(range);
}
以上代码是对读取到的源文件中,包含 ${img} 的文字进行图片替换操作 ,如果如果不需要全局替换,只替换一个,可以使用以下代码块:
//获取第一个section
Section section = document.getSections().get(0);
TextSelection selection = document.findString("${img}", true, true);
//声明数组内容
String[][] data =
{
new String[]{"班级", "姓名", "学号"},
new String[]{"1班", "刘楠", "Y12534"},
new String[]{"2班", "刘莉", "Y12547"},
new String[]{"3班", "方红", "Y12365"},
};
//创建表格
Table table = new Table(document, true);
table.resetCells(4, 3);
for (int i = 0; i < data.length; i++) {
TableRow dataRow = table.getRows().get(i);
for (int j = 0; j < data[i].length; j++) {
TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]);
range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center);
range.getCharacterFormat().setFontName("楷体");
dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center);
dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle);
}
}
//定位到指定书签位置,添加表格
BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document);
bookmarksNavigator.moveToBookmark("bookmark1");
bookmarksNavigator.insertTable(table);
以上代码块是对书签(bookmark1)位置插入表格
Section section = document.getSections().get(0);
TextSelection[] selections2 = document.findAllString("${list}", true, true);
for (TextSelection selection2 : selections2) {
//获取关键字符串所在段落的索引
TextRange range2 = selection2.getAsOneRange();
Paragraph paragraph = range2.getOwnerParagraph();
Body body = paragraph.ownerTextBody();
int index2 = body.getChildObjects().indexOf(paragraph);
//添加一个两行三列的表格
Table table = section.addTable(true);
table.resetCells(2, 3);
range2 = table.get(0, 0).addParagraph().appendText("学号");
range2 = table.get(0, 1).addParagraph().appendText("姓名");
range2 = table.get(0, 2).addParagraph().appendText("性别");
range2 = table.get(1, 0).addParagraph().appendText("XH001");
range2 = table.get(1, 1).addParagraph().appendText("张三");
range2 = table.get(1, 2).addParagraph().appendText("男");
//移除段落,插入表格
body.getChildObjects().remove(paragraph);
body.getChildObjects().insert(index2, table);
}
以上代码是对读取到的源文件中,包含 ${list} 的文字进行表格替换操作 ,如果如果不需要全局替换,只替换一个,请参照上文图片处所备注的方法即可
document.saveToFile("C:/Users/moreyou0426003/Desktop/测试文字-图片-表格模板.docx");
最后对文本进行操作完之后记得对文档进行保存,保存地址可以是源文件 ,也可以指定其他文件