一,添加jar包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.17</version>
</dependency>
二,准备好word文档,要doc格式。template.doc内容如下:
个人简历
姓名 |
${name} |
性别 |
${sex} |
年龄 |
${age} |
出生日期 |
${date} |
三,java编写:
1,实体类:
package dkha.pojo;
import java.util.Date;
public class User {
private String name;
private String sex;
private Integer age;
private Date date;
public User(String name, String sex, Integer age, Date date) {
this.name = name;
this.sex = sex;
this.age = age;
this.date = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
2,读取word文件:
package dkha.tools;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
//读取文件类
public class ReadDoc {
public void testReadByDoc(String path) throws Exception{
InputStream is = new FileInputStream(path);
HWPFDocument doc = new HWPFDocument(is);
//输出书签信息
this.printInfo(doc.getBookmarks());
//输出文本
System.out.println(doc.getDocumentText());
Range range = doc.getRange();
this.printInfo(range);
//读表格
this.readTable(range);
//读列表
this.readList(range);
//把当前HWPFDocument写到输出流中
doc.write(new FileOutputStream("D:\\test.doc"));
is.close();
}
/**
* 输出书签信息
* @param bookmarks
*/
private void printInfo(Bookmarks bookmarks) {
int count = bookmarks.getBookmarksCount();
System.out.println("书签数量:" + count);
Bookmark bookmark;
for (int i=0; i<count; i++) {
bookmark = bookmarks.getBookmark(i);
System.out.println("书签" + (i+1) + "的名称是:" + bookmark.getName());
System.out.println("开始位置:" + bookmark.getStart());
System.out.println("结束位置:" + bookmark.getEnd());
}
}
/**
* 读表格
* 每一个回车符代表一个段落,所以对于表格而言,每一个单元格至少包含一个段落,每行结束都是一个段落。
* @param range
*/
private void readTable(Range range) {
//遍历range范围内的table。
TableIterator tableIter = new TableIterator(range);
Table table;
TableRow row;
TableCell cell;
while (tableIter.hasNext()) {
table = tableIter.next();
int rowNum = table.numRows();
for (int j=0; j<rowNum; j++) {
row = table.getRow(j);
int cellNum = row.numCells();
for (int k=0; k<cellNum; k++) {
cell = row.getCell(k);
//输出单元格的文本
System.out.println(cell.text().trim());
}
}
}
}
/**
* 读列表
* @param range
*/
private void readList(Range range) {
int num = range.numParagraphs();
Paragraph para;
for (int i=0; i<num; i++) {
para = range.getParagraph(i);
if (para.isInList()) {
System.out.println("list: " + para.text());
}
}
}
/**
* 输出Range
* @param range
*/
private void printInfo(Range range) {
//获取段落数
int paraNum = range.numParagraphs();
System.out.println(paraNum);
for (int i=0; i<paraNum; i++) {
System.out.println("段落" + (i+1) + ":" + range.getParagraph(i).text());
}
int secNum = range.numSections();
System.out.println(secNum);
Section section;
for (int i=0; i<secNum; i++) {
section = range.getSection(i);
System.out.println(section.getMarginLeft());
System.out.println(section.getMarginRight());
System.out.println(section.getMarginTop());
System.out.println(section.getMarginBottom());
System.out.println(section.getPageHeight());
System.out.println(section.text());
}
}
}
3,写入word文件:
package dkha.tools;
import dkha.pojo.User;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Range;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
//写入文件
public class WriteDoc {
public void testWrite() throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<User> list = new ArrayList<User>();
list.add(new User("a","男",10,sdf.parse("2018-08-08")));
list.add(new User("b","女",20,sdf.parse("2017-07-07")));
String templatePath = "D:\\template.doc";
InputStream is = new FileInputStream(templatePath);
OutputStream os = null;
HWPFDocument doc = new HWPFDocument(is);
Range range = doc.getRange();
for(int i=0;i<list.size();i++){
User user = list.get(i);
//把range范围内的${reportDate}替换为当前的日期
range.replaceText("${name}", user.getName());
range.replaceText("${sex}", user.getSex());
range.replaceText("${age}", String.valueOf(user.getAge()));
range.replaceText("${date}", sdf.format(user.getDate()));
os = new FileOutputStream(new File("D:\\"+user.getName()+".doc"));
//把doc输出到输出流中
doc.write(os);
}
os.close();
is.close();
}
}
4,测试:
package dkha.controller;
import dkha.tools.ReadDoc;
import dkha.tools.WriteDoc;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
@Controller
@RequestMapping("/user")
public class IndexController {
//读取文件
@RequestMapping("/index")
public String index(HttpServletRequest request){
String str = request.getSession().getServletContext().getRealPath("/")+"WEB-INF"+File.separator+"JS";
String path = str.replace("\\",File.separator)+File.separator+"template.doc";
ReadDoc rd = new ReadDoc();
try {
rd.testReadByDoc(path);
} catch (Exception e) {
e.printStackTrace();
}
return "jsp/user";
}
//写入文件
@RequestMapping("/index1")
public void index1(HttpServletRequest request){
String str = request.getSession().getServletContext().getRealPath("/")+"WEB-INF"+File.separator+"JS";
String path = str.replace("\\",File.separator)+File.separator+"template.doc";
WriteDoc wd = new WriteDoc();
try {
wd.testWrite();
} catch (Exception e) {
e.printStackTrace();
}
}
}