packagecom.why.main;importorg.apache.poi.xwpf.usermodel.XWPFDocument;importorg.apache.poi.xwpf.usermodel.XWPFParagraph;importorg.apache.poi.xwpf.usermodel.XWPFRun;importorg.apache.poi.xwpf.usermodel.XWPFTable;importorg.apache.poi.xwpf.usermodel.XWPFTableCell;importorg.apache.poi.xwpf.usermodel.XWPFTableRow;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;public classPoiUtils {//测试
public static voidmain(String[] args) {
String templetDocPath= "D:/temp/请假单模板1.docx";
String targetDocPath= "D:/temp/请假单1.docx";
Map dataMap = new HashMap();
dataMap.put("writeDate", "2018年10月14日");
dataMap.put("name", "HaiyuKing");
dataMap.put("dept", "移动开发组");
dataMap.put("leaveType", "☑倒休 √年假 ✔事假 ☐病假 ☐婚假 ☐产假 ☐其他");
dataMap.put("leaveReason", "倒休一天。");
dataMap.put("leaveStartDate", "2018年10月14日上午");
dataMap.put("leaveEndDate", "2018年10月14日下午");
dataMap.put("leaveDay", "1");
dataMap.put("leaveLeader", "同意");
dataMap.put("leaveDeptLeaderImg", "同意!");
PoiUtils.writeToDocx(templetDocPath,targetDocPath,dataMap);try{
PoiUtils.readDocx(targetDocPath);
}catch(Exception e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}/*** 通过XWPFDocument对内容进行访问。对于XWPF文档而言,用这种方式进行读操作更佳。
*@throwsException*/
public static void readDocx(String templetDocPath) throwsException {
InputStream is= newFileInputStream(templetDocPath);
XWPFDocument doc= newXWPFDocument(is);
List paras =doc.getParagraphs();for(XWPFParagraph para : paras) {//当前段落的属性
System.out.println("para=="+para.getText());
}//获取文档中所有的表格
List tables =doc.getTables();
Listrows;
Listcells;for(XWPFTable table : tables) {//获取表格对应的行
rows =table.getRows();for(XWPFTableRow row : rows) {//获取行对应的单元格
cells =row.getTableCells();for(XWPFTableCell cell : cells) {
System.out.println("cell=="+cell.getText());;
}
}
}if (is != null) {try{
is.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}/*** 生成一个docx文件
*@paramtempletDocPath 模板文件的完整路径
*@paramtargetDocPath 生成的目标文件的完整路径
*@paramdataMap 替换的数据*/
public static void writeToDocx(String templetDocPath, String targetDocPath, MapdataMap){try{//得到模板doc文件的HWPFDocument对象
InputStream in = newFileInputStream(templetDocPath);
writeToDocx(in,targetDocPath,dataMap);
}catch(IOException e)
{
e.printStackTrace();
}
}/*** 生成一个docx文件,主要用于直接读取asset目录下的模板文件,不用先复制到sd卡中
*@paramtempletDocInStream 模板文件的InputStream
*@paramtargetDocPath 生成的目标文件的完整路径
*@paramdataMap 替换的数据*/
public static void writeToDocx(InputStream templetDocInStream, String targetDocPath, MapdataMap){try{//得到模板doc文件的HWPFDocument对象
XWPFDocument HDocx = newXWPFDocument(templetDocInStream);//替换段落里面的变量
replaceInPara(HDocx, dataMap);//替换表格里面的变量
replaceInTable(HDocx, dataMap);//写到另一个文件中
OutputStream os = newFileOutputStream(targetDocPath);//把doc输出到输出流中
HDocx.write(os);
os.close();
templetDocInStream.close();
}catch(IOException e)
{
e.printStackTrace();
}catch(Exception e)
{
e.printStackTrace();
}
}/*** 替换段落里面的变量
*@paramdoc 要替换的文档
*@paramparams 参数*/
private static void replaceInPara(XWPFDocument doc, Mapparams) {
Iterator iterator =doc.getParagraphsIterator();
XWPFParagraph para;while(iterator.hasNext()) {
para=iterator.next();
replaceInPara(para, params);
}
}/*** 替换段落里面的变量
*@parampara 要替换的段落
*@paramparams 参数*/
private static void replaceInPara(XWPFParagraph para, Mapparams) {
Listruns;
System.out.println("para.getParagraphText()=="+para.getParagraphText());
runs=para.getRuns();for (int i=0; i
XWPFRun run=runs.get(i);
String runText=run.toString();
System.out.println("runText=="+runText);//替换文本内容,将自定义的$xxx$替换成实际文本
for(Map.Entryentry : params.entrySet())
{
runText= runText.replace(entry.getKey(), entry.getValue()+"");//直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun,把文本附加在当前文本后面,//所以我们不能直接设值,需要先删除当前run,然后再自己手动插入一个新的run。
para.removeRun(i);
para.insertNewRun(i).setText(runText);
}
}
}/*** 替换表格里面的变量
*@paramdoc 要替换的文档
*@paramparams 参数*/
private static void replaceInTable(XWPFDocument doc, Mapparams) {
Iterator iterator =doc.getTablesIterator();
XWPFTable table;
Listrows;
Listcells;
Listparas;while(iterator.hasNext()) {
table=iterator.next();
rows=table.getRows();for(XWPFTableRow row : rows) {
cells=row.getTableCells();for(XWPFTableCell cell : cells) {
paras=cell.getParagraphs();for(XWPFParagraph para : paras) {
replaceInPara(para, params);
}
}
}
}
}
}