1、pom.xml依赖
<dependencies> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
2、读取文件类ReadDoc.java
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、功能测试
public class ReadDocTest { public static void main(String[] args) throws Exception { ReadDoc rd = new ReadDoc(); rd.testReadByDoc("D:\\MaintainCase.doc"); } }
4、写入文件类WriteDoc.java
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 { List<Users> list = new ArrayList<Users>(); list.add(new Users("a","男",10,new SimpleDateFormat("yyyy-MM-dd").parse("2018-08-08"))); list.add(new Users("b","女",20,new SimpleDateFormat("yyyy-MM-dd").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++){ Users 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}", user.getBirthday().toString()); os = new FileOutputStream(new File("D:\\"+user.getName()+".doc")); //把doc输出到输出流中 doc.write(os); } os.close(); is.close(); } }
5、功能测试
Users类
import java.util.Date; public class Users { String name; String sex; int age; Date birthday; public Users() {} public Users(String name, String sex ,int age, Date birthday) { this.name = name; this.sex = sex; this.age = age; this.birthday = birthday; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } 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 int getAge() { return age; } public void setAge(int age) { this.age = age; } }
6、测试类
public class WriteDocTest { public static void main(String[] args) throws Exception { WriteDoc wd = new WriteDoc(); wd.testWrite(); } }