最近项目中需要用到数据的导出到Word,本在项目中使用POI将数据导入到Word,和Excel导出类似,先将jar包导入进去(我这里就省去导jar包啦),我直接上实现过程吧!

1、导入POI jar包;

2、创建新的Word模板,如下图:

3、JSP页面按钮定义如下:

<button type="button" οnclick="toInsuranceExcel()" class="button button-primary button-small">导出Word </button>

4、JS中点击事件(包括参数传递、发送请求)代码如下:

/* 导出Word */
function toInsuranceExcel(){var curpagenum = $('#contentGroupOrderTable').getGridParam('page');$("#page").val(curpagenum);var startTime=$('#startTime').val();var endTime=$('#endTime').val();var receiveMode=$('#receiveMode').val();var groupCode=$('#groupCode').val();var supplierName=$('#supplierName').val();var orgIds=$('#orgIds').val();var orgNames=$('#orgNames').val();var operType=$('#operType').val();var saleOperatorIds=$('#saleOperatorIds').val();var saleOperatorName=$('#saleOperatorName').val();var orderMode=$('#dicIds').val();var remark=$('#remark').val();var page=$('#page').val();var pageSize=$('#pageSize').val();var userRightType=$('#userRightType').val();var guestName=$('#guestName').val();var gender=$('#gender').val()var ageFirst=$('#ageFirst').val()var ageSecond=$('#ageSecond').val()var nativePlace=$('#nativePlace').val()window.location ='../taobao/downloadInsure.htm?startTime='+startTime+"&endTime="+endTime+"&receiveMode="+receiveMode+"&groupCode="+groupCode+"&supplierName="+supplierName+"&orgIds="+orgIds+"&orgNames="+orgNames+"&operType="+operType+"&saleOperatorIds="+saleOperatorIds+"&saleOperatorName="+saleOperatorName+"&orderMode="+orderMode+"&remark="+remark+"&page="+page+"&pageSize="+pageSize+"&userRightType="+userRightType+"&guestName="+guestName+"&gender="+gender+"&ageFirst="+ageFirst+"&ageSecond="+ageSecond+"&nativePlace="+nativePlace;
}

5、Java后台Controller代码实现方法如下:

/*** 投保单* * @param groupId* @param request* @param response*/@RequestMapping("downloadInsure.htm")public void downloadInsureFile(HttpServletRequest request, HttpServletResponse response,     String startTime,String endTime,String receiveMode,String groupCode,String supplierName,String orgIds,String orgNames,String operType,String saleOperatorIds,String saleOperatorName,String orderMode,String remark,Integer page,Integer pageSize,Integer userRightType,String guestName,Integer gender,Integer ageFirst,Integer ageSecond,String nativePlace){try {// 处理中文文件名下载乱码request.setCharacterEncoding("UTF-8");} catch (UnsupportedEncodingException e1) {e1.printStackTrace();}String path = "";String fileName = "";// 投保书try {fileName = new String("投保书.doc".getBytes("UTF-8"), "iso-8859-1");} catch (UnsupportedEncodingException e) {e.printStackTrace();}path = saleInsurance( request,  response,   startTime, endTime, receiveMode, groupCode, supplierName,orgIds, orgNames, operType, saleOperatorIds, saleOperatorName,orderMode, remark, page, pageSize, userRightType,guestName, gender, ageFirst, ageSecond, nativePlace);response.setCharacterEncoding("utf-8");response.setContentType("application/msword"); // word格式try {response.setHeader("Content-Disposition", "attachment; filename=" + fileName);File file = new File(path);InputStream inputStream = new FileInputStream(file);OutputStream os = response.getOutputStream();byte[] b = new byte[10240];int length;while ((length = inputStream.read(b)) > 0) {os.write(b, 0, length);}inputStream.close();os.flush();os.close();file.delete();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

调用的saleInsurance方法如下:

 /***投保书* * @param request* @param orderId* @return*/public String saleInsurance(HttpServletRequest request, HttpServletResponse response,     String startTime,String endTime,String receiveMode,String groupCode,String supplierName,String orgIds,String orgNames,String operType,String saleOperatorIds,String saleOperatorName,String orderMode,String remark,Integer page,Integer pageSize,Integer userRightType,String guestName,Integer gender,Integer ageFirst,Integer ageSecond,String nativePlace){// TourGroup tg = tourGroupService.findByGroupCode(groupCode);String url = request.getSession().getServletContext().getRealPath("/") + "/download/"+ System.currentTimeMillis() + ".doc";String realPath = request.getSession().getServletContext().getRealPath("/template/guestInsurances.docx");WordReporter export = new WordReporter(realPath);try {export.init();} catch (IOException e) {e.printStackTrace();}GroupOrder vo = new GroupOrder();vo.setPage(page);vo.setPageSize(pageSize);vo.setStartTime(startTime);vo.setEndTime(endTime);vo.setRemark(remark);vo.setGuestName(guestName);vo.setOrderNo(orderMode);vo.setGroupCode(groupCode);vo.setSaleOperatorIds(saleOperatorIds);vo.setOrgIds(orgIds);vo.setOperType(Integer.valueOf(operType));vo.setReceiveMode(receiveMode);vo.setOrgNames(orgNames);vo.setSaleOperatorName(saleOperatorName);vo.setSupplierName(supplierName);vo.setGender(gender);vo.setAgeFirst(ageFirst);vo.setAgeSecond(ageSecond);vo.setNativePlace(nativePlace);if (StringUtils.isBlank(vo.getSaleOperatorIds()) && StringUtils.isNotBlank(vo.getOrgIds())) {Set<Integer> set = new HashSet<Integer>();String[] orgIdArr = vo.getOrgIds().split(",");for (String orgIdStr : orgIdArr) {set.add(Integer.valueOf(orgIdStr));}set = platformEmployeeService.getUserIdListByOrgIdList(WebUtils.getCurBizId(request), set);String salesOperatorIds = "";for (Integer usrId : set) {salesOperatorIds += usrId + ",";}if (!salesOperatorIds.equals("")) {vo.setSaleOperatorIds(salesOperatorIds.substring(0, salesOperatorIds.length() - 1));}}PageBean pageBean = new PageBean();if (page == null) {pageBean.setPage(1);} else {pageBean.setPage(page);}if (pageSize == null) {pageBean.setPageSize(10000);} else {pageBean.setPageSize(10000);}pageBean.setParameter(vo);pageBean.setPage(page);pageBean = groupOrderService.selectGroupOrderGuestListPage(pageBean, WebUtils.getCurBizId(request),WebUtils.getDataUserIdSet(request),userRightType);List<Map<String, String>> guestList = new ArrayList<Map<String, String>>();Map<String, String> map = null, mapTemp = null;int index = 0;if (pageBean.getResult() != null && pageBean.getResult().size() > 0) {int firstSum = pageBean.getResult().size() / 2;for (int i = 0; i < firstSum; i++) {map = (HashMap) pageBean.getResult().get(i);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");mapTemp = new HashMap<String, String>();mapTemp.put("number", index + 1 + "");mapTemp.put("code", (String) map.get("receive_mode"));mapTemp.put("guestName", (String) map.get("name"));mapTemp.put("cerNum", (String) map.get("certificate_num"));mapTemp.put("snumber", "");mapTemp.put("scode", "");mapTemp.put("sguestName", "");mapTemp.put("scerNum", "");guestList.add(mapTemp);index++;}for (int i = firstSum; i < pageBean.getResult().size(); i++) {map = (HashMap) pageBean.getResult().get(i);mapTemp = isAddNewRow(guestList);if (mapTemp == null) {mapTemp = new HashMap<String, String>();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");mapTemp.put("number", index + 1 + "");mapTemp.put("code", (String) map.get("receive_mode"));mapTemp.put("guestName", (String) map.get("name"));mapTemp.put("cerNum", (String) map.get("certificate_num"));guestList.add(mapTemp);} else {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");mapTemp.put("snumber", index + 1 + "");mapTemp.put("scode", (String) map.get("receive_mode"));mapTemp.put("sguestName", (String) map.get("name"));mapTemp.put("scerNum", (String) map.get("certificate_num"));}index++;}}Map<String, Object> mapHeader = new HashMap<String, Object>();mapHeader.put("company", WebUtils.getCurBizInfo(request).getName()); // 当前单位mapHeader.put("operator", WebUtils.getCurUser(request).getName());mapHeader.put("printTime", DateUtils.format(new Date()));mapHeader.put("opTel", WebUtils.getCurUser(request).getMobile());mapHeader.put("groupCode", "");mapHeader.put("person", String.valueOf(pageBean.getTotalCount()));mapHeader.put("guide", "");mapHeader.put("departureDate", "");mapHeader.put("maxDay", "");mapHeader.put("numDay", "");try {export.export(mapHeader, 0);export.export(guestList, 1);export.generate(url);} catch (Exception e) {e.printStackTrace();}return url;}

创建的WordReporter类代码如下:


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.math.BigDecimal;import org.apache.commons.lang.StringUtils;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.openxmlformats.schemas.officeDocument.x2006.docPropsVTypes.DecimalDocument;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTInd;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSpacing;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class WordReporter {private static final Logger logger = LoggerFactory.getLogger(WordReporter.class);private String templatePath;private XWPFDocument doc = null;private FileInputStream is = null;private OutputStream os = null;public WordReporter(String templatePath) {this.templatePath = templatePath;}public void init() throws IOException {is = new FileInputStream(new File(this.templatePath));doc = new XWPFDocument(is);}/*** 替换掉占位符* @param params* @return* @throws Exception */public boolean export(Map<String,Object> params) throws Exception{this.replaceInPara(doc, params);return true;}/*** 替换掉表格中的占位符* @param params* @param tableIndex* @return* @throws Exception */public boolean export(Map<String,Object> params,int tableIndex) throws Exception{this.replaceInTable(doc, params,tableIndex);return true;}/*** 循环生成表格* @param params* @param tableIndex* @return* @throws Exception*/public boolean export(List<Map<String,String>> params,int tableIndex) throws Exception{return export(params,tableIndex,false);}public boolean export(List<Map<String,String>> params,int tableIndex,Boolean hasTotalRow) throws Exception{this.insertValueToTable(doc, params, tableIndex,hasTotalRow);return true;}/*** 导出图片* @param params* @return* @throws Exception*/public boolean exportImg(Map<String,Object> params) throws Exception{/*List<XWPFParagraph> list = doc.getParagraphs();for(XWPFParagraph para : list){logger.info(para.getText());}*/List<XWPFTable> list = doc.getTables();System.out.print(list.size());return true;}/*** 生成word文档* @param outDocPath* @return* @throws IOException*/public boolean generate(String outDocPath) throws IOException{        os = new FileOutputStream(outDocPath);doc.write(os);this.close(os);this.close(is);return true;}/*** 替换表格里面的变量* * @param doc*            要替换的文档* @param params*            参数* @throws Exception */private void replaceInTable(XWPFDocument doc, Map<String, Object> params,int tableIndex) throws Exception {List<XWPFTable> tableList = doc.getTables();if(tableList.size()<=tableIndex){throw new Exception("tableIndex对应的表格不存在");}XWPFTable table = tableList.get(tableIndex);List<XWPFTableRow> rows;List<XWPFTableCell> cells;List<XWPFParagraph> paras;rows = table.getRows();for (XWPFTableRow row : rows) {cells = row.getTableCells();for (XWPFTableCell cell : cells) {paras = cell.getParagraphs();for (XWPFParagraph para : paras) {this.replaceInPara(para, params);}}}}/*** 替换段落里面的变量* * @param doc*            要替换的文档* @param params*            参数* @throws Exception */private void replaceInPara(XWPFDocument doc, Map<String, Object> params) throws Exception {Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();XWPFParagraph para;while (iterator.hasNext()) {para = iterator.next();this.replaceInPara(para, params);}}/*** 替换段落里面的变量* * @param para*            要替换的段落* @param params*            参数* @throws Exception * @throws IOException * @throws InvalidFormatException */private boolean replaceInPara(XWPFParagraph para, Map<String, Object> params) throws Exception {boolean data = false;List<XWPFRun> runs;//有符合条件的占位符if (this.matcher(para.getParagraphText()).find()) {runs = para.getRuns();data = true;Map<Integer,String> tempMap = new HashMap<Integer,String>();for (int i = 0; i < runs.size(); i++) {              XWPFRun run = runs.get(i);         String runText = run.toString();               //以"$"开头boolean begin = runText.indexOf("$")>-1;boolean end = runText.indexOf("}")>-1;                if(begin && end){tempMap.put(i, runText);fillBlock(para, params, tempMap, i);continue;}else if(begin && !end){tempMap.put(i, runText);continue;}else if(!begin && end){tempMap.put(i, runText);fillBlock(para, params, tempMap, i);continue;}else{if(tempMap.size()>0){tempMap.put(i, runText);continue;}continue;}}} else if (this.matcherRow(para.getParagraphText())) {runs = para.getRuns();data = true;}return data;}/*** 填充run内容* @param para* @param params* @param tempMap* @param i* @param runText* @throws InvalidFormatException* @throws IOException* @throws Exception*/private void fillBlock(XWPFParagraph para, Map<String, Object> params,Map<Integer, String> tempMap, int index)throws InvalidFormatException, IOException, Exception {Matcher matcher;if(tempMap!=null&&tempMap.size()>0){String wholeText = "";List<Integer> tempIndexList = new ArrayList<Integer>();for(Map.Entry<Integer, String> entry :tempMap.entrySet()){tempIndexList.add(entry.getKey());wholeText+=entry.getValue();}if(wholeText.equals("")){return;}matcher = this.matcher(wholeText);                    if (matcher.find()) {boolean isPic = false;int width = 0;int height = 0;int picType = 0;String path = null;                String keyText = matcher.group().substring(2,matcher.group().length()-1); Object value = params.get(keyText);String newRunText = "";if(value instanceof String){newRunText = matcher.replaceFirst(String.valueOf(value));                                                     }else if(value instanceof Map){//插入图片isPic = true;                         Map pic = (Map)value;  width = Integer.parseInt(pic.get("width").toString());  height = Integer.parseInt(pic.get("height").toString());  picType = getPictureType(pic.get("type").toString());                            path = pic.get("path").toString();}                      //模板样式              XWPFRun tempRun = null;// 直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun,把文本附加在当前文本后面,// 所以我们不能直接设值,需要先删除当前run,然后再自己手动插入一个新的run。for(Integer pos : tempIndexList){tempRun = para.getRuns().get(pos);tempRun.setText("", 0);}             if(isPic){//addPicture方法的最后两个参数必须用Units.toEMU转化一下//para.insertNewRun(index).addPicture(getPicStream(path), picType, "测试",Units.toEMU(width), Units.toEMU(height));tempRun.addPicture(getPicStream(path), picType, "测试",Units.toEMU(width), Units.toEMU(height));}else{//样式继承if(newRunText.indexOf("\n")>-1){String[] textArr = newRunText.split("\n");if(textArr.length>0){//设置字体信息String fontFamily = tempRun.getFontFamily();int fontSize = tempRun.getFontSize();//logger.info("------------------"+fontSize);for(int i=0;i<textArr.length;i++){if(i==0){tempRun.setText(textArr[0],0);}else{if(StringUtils.isNotEmpty(textArr[i])){                                     XWPFRun newRun=para.createRun();//设置新的run的字体信息newRun.setFontFamily(fontFamily);if(fontSize==-1){newRun.setFontSize(10);}else{newRun.setFontSize(fontSize);}newRun.addBreak();newRun.setText(textArr[i], 0);}}}}}else{tempRun.setText(newRunText,0);  }                   }}tempMap.clear();}}/*** Clone Object* @param obj* @return* @throws Exception*/private Object cloneObject(Object obj) throws Exception{ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(obj); ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray()); ObjectInputStream in =new ObjectInputStream(byteIn);return in.readObject();}private void insertValueToTable(XWPFDocument doc,List<Map<String, String>> params,int tableIndex) throws Exception {insertValueToTable(doc,params,tableIndex,false);}private void insertValueToTable(XWPFDocument doc,List<Map<String, String>> params,int tableIndex,Boolean hasTotalRow) throws Exception {List<XWPFTable> tableList = doc.getTables();if(tableList.size()<=tableIndex){throw new Exception("tableIndex对应的表格不存在");}XWPFTable table = tableList.get(tableIndex);List<XWPFTableRow> rows = table.getRows();if(rows.size()<2){throw new Exception("tableIndex对应表格应该为2行");}//模板行XWPFTableRow tmpRow = rows.get(1);List<XWPFTableCell> tmpCells = null;List<XWPFTableCell> cells = null;XWPFTableCell tmpCell = null;tmpCells = tmpRow.getTableCells();String cellText = null;String cellTextKey = null;Map<String,Object> totalMap = null; for (int i = 0, len = params.size(); i < len; i++) {Map<String,String> map = params.get(i);if(map.containsKey("total")){totalMap = new HashMap<String,Object>();totalMap.put("total", map.get("total"));continue;}XWPFTableRow row = table.createRow();          row.setHeight(tmpRow.getHeight());cells = row.getTableCells();// 插入的行会填充与表格第一行相同的列数for (int k = 0, klen = cells.size(); k < klen; k++) {tmpCell = tmpCells.get(k);XWPFTableCell cell = cells.get(k);              cellText = tmpCell.getText();if(StringUtils.isNotBlank(cellText)){//转换为mapkey对应的字段cellTextKey = cellText.replace("$", "").replace("{", "").replace("}","");                   if(map.containsKey(cellTextKey)){setCellText(tmpCell, cell, map.get(cellTextKey));                  }                   }}          }// 删除模版行table.removeRow(1);if(hasTotalRow && totalMap!=null){XWPFTableRow row = table.getRow(1);         //cell.setText("11111");XWPFTableCell cell = row.getCell(0);replaceInPara(cell.getParagraphs().get(0),totalMap);/*String wholeText = cell.getText();Matcher matcher = this.matcher(wholeText);if(matcher.find()){*//*List<XWPFParagraph> paras = cell.getParagraphs();          for (XWPFParagraph para : paras) {this.replaceInPara(para, totalMap);}*/                //}     table.addRow(row);      table.removeRow(1);         }}private void setCellText(XWPFTableCell tmpCell, XWPFTableCell cell,String text) throws Exception {    CTTc cttc2 = tmpCell.getCTTc();CTTcPr ctPr2 = cttc2.getTcPr();CTTc cttc = cell.getCTTc();CTTcPr ctPr = cttc.addNewTcPr();//cell.setColor(tmpCell.getColor());// cell.setVerticalAlignment(tmpCell.getVerticalAlignment());if (ctPr2.getTcW() != null) {ctPr.addNewTcW().setW(ctPr2.getTcW().getW());}if (ctPr2.getVAlign() != null) {ctPr.addNewVAlign().setVal(ctPr2.getVAlign().getVal());}if (cttc2.getPList().size() > 0) {CTP ctp = cttc2.getPList().get(0);if (ctp.getPPr() != null) {if (ctp.getPPr().getJc() != null) {cttc.getPList().get(0).addNewPPr().addNewJc().setVal(ctp.getPPr().getJc().getVal());}}}if (ctPr2.getTcBorders() != null) {ctPr.setTcBorders(ctPr2.getTcBorders());}XWPFParagraph tmpP = tmpCell.getParagraphs().get(0);XWPFParagraph cellP = cell.getParagraphs().get(0);XWPFRun tmpR = null;if (tmpP.getRuns() != null && tmpP.getRuns().size() > 0) {tmpR = tmpP.getRuns().get(0);}List<XWPFRun> runList = new ArrayList<XWPFRun>();if(text==null){XWPFRun cellR = cellP.createRun(); runList.add(cellR);cellR.setText("");}else{//这里的处理思路是:$b认为是段落的分隔符,分隔后第一个段落认为是要加粗的if(text.indexOf("\b") > -1){//段落,加粗,主要用于产品行程String[] bArr = text.split("\b");for(int b=0;b<bArr.length;b++){XWPFRun cellR = cellP.createRun();                    runList.add(cellR);if(b==0){//默认第一个段落加粗cellR.setBold(true);                       }if(bArr[b].indexOf("\n") > -1){String[] arr = bArr[b].split("\n");for(int i = 0; i < arr.length; i++){if(i > 0){cellR.addBreak();}                cellR.setText(arr[i]);}}else{               cellR.setText(bArr[b]);}}                   }else{XWPFRun cellR = cellP.createRun();   runList.add(cellR);if(text.indexOf("\n") > -1){String[] arr = text.split("\n");for(int i = 0; i < arr.length; i++){if(i > 0){cellR.addBreak();}                cellR.setText(arr[i]);}}else{               cellR.setText(text);}}}// 复制字体信息if (tmpR != null) {//cellR.setBold(tmpR.isBold());//cellR.setBold(true);for(XWPFRun cellR : runList){if(!cellR.isBold()){cellR.setBold(tmpR.isBold());}cellR.setItalic(tmpR.isItalic());cellR.setStrike(tmpR.isStrike());cellR.setUnderline(tmpR.getUnderline());cellR.setColor(tmpR.getColor());cellR.setTextPosition(tmpR.getTextPosition());if (tmpR.getFontSize() != -1) {cellR.setFontSize(tmpR.getFontSize());}if (tmpR.getFontFamily() != null) {cellR.setFontFamily(tmpR.getFontFamily());}if (tmpR.getCTR() != null) {if (tmpR.getCTR().isSetRPr()) {CTRPr tmpRPr = tmpR.getCTR().getRPr();if (tmpRPr.isSetRFonts()) {CTFonts tmpFonts = tmpRPr.getRFonts();CTRPr cellRPr = cellR.getCTR().isSetRPr() ? cellR.getCTR().getRPr() : cellR.getCTR().addNewRPr();CTFonts cellFonts = cellRPr.isSetRFonts() ? cellRPr.getRFonts() : cellRPr.addNewRFonts();cellFonts.setAscii(tmpFonts.getAscii());cellFonts.setAsciiTheme(tmpFonts.getAsciiTheme());cellFonts.setCs(tmpFonts.getCs());cellFonts.setCstheme(tmpFonts.getCstheme());cellFonts.setEastAsia(tmpFonts.getEastAsia());cellFonts.setEastAsiaTheme(tmpFonts.getEastAsiaTheme());cellFonts.setHAnsi(tmpFonts.getHAnsi());cellFonts.setHAnsiTheme(tmpFonts.getHAnsiTheme());}}}}}// 复制段落信息cellP.setAlignment(tmpP.getAlignment());cellP.setVerticalAlignment(tmpP.getVerticalAlignment());cellP.setBorderBetween(tmpP.getBorderBetween());cellP.setBorderBottom(tmpP.getBorderBottom());cellP.setBorderLeft(tmpP.getBorderLeft());cellP.setBorderRight(tmpP.getBorderRight());cellP.setBorderTop(tmpP.getBorderTop());cellP.setPageBreak(tmpP.isPageBreak());if (tmpP.getCTP() != null) {if (tmpP.getCTP().getPPr() != null) {CTPPr tmpPPr = tmpP.getCTP().getPPr();CTPPr cellPPr = cellP.getCTP().getPPr() != null ? cellP.getCTP().getPPr() : cellP.getCTP().addNewPPr();// 复制段落间距信息CTSpacing tmpSpacing = tmpPPr.getSpacing();if (tmpSpacing != null) {CTSpacing cellSpacing = cellPPr.getSpacing() != null ? cellPPr.getSpacing() : cellPPr.addNewSpacing();if (tmpSpacing.getAfter() != null) {cellSpacing.setAfter(tmpSpacing.getAfter());}if (tmpSpacing.getAfterAutospacing() != null) {cellSpacing.setAfterAutospacing(tmpSpacing.getAfterAutospacing());}if (tmpSpacing.getAfterLines() != null) {cellSpacing.setAfterLines(tmpSpacing.getAfterLines());}if (tmpSpacing.getBefore() != null) {cellSpacing.setBefore(tmpSpacing.getBefore());}if (tmpSpacing.getBeforeAutospacing() != null) {cellSpacing.setBeforeAutospacing(tmpSpacing.getBeforeAutospacing());}if (tmpSpacing.getBeforeLines() != null) {cellSpacing.setBeforeLines(tmpSpacing.getBeforeLines());}if (tmpSpacing.getLine() != null) {cellSpacing.setLine(tmpSpacing.getLine());}if (tmpSpacing.getLineRule() != null) {cellSpacing.setLineRule(tmpSpacing.getLineRule());}}// 复制段落缩进信息CTInd tmpInd = tmpPPr.getInd();if (tmpInd != null) {CTInd cellInd = cellPPr.getInd() != null ? cellPPr.getInd(): cellPPr.addNewInd();if (tmpInd.getFirstLine() != null) {cellInd.setFirstLine(tmpInd.getFirstLine());}if (tmpInd.getFirstLineChars() != null) {cellInd.setFirstLineChars(tmpInd.getFirstLineChars());}if (tmpInd.getHanging() != null) {cellInd.setHanging(tmpInd.getHanging());}if (tmpInd.getHangingChars() != null) {cellInd.setHangingChars(tmpInd.getHangingChars());}if (tmpInd.getLeft() != null) {cellInd.setLeft(tmpInd.getLeft());}if (tmpInd.getLeftChars() != null) {cellInd.setLeftChars(tmpInd.getLeftChars());}if (tmpInd.getRight() != null) {cellInd.setRight(tmpInd.getRight());}if (tmpInd.getRightChars() != null) {cellInd.setRightChars(tmpInd.getRightChars());}}}}}/*** 删除表中的行* @param tableAndRowsIdxMap 表的索引和行索引集合*/public void deleteRow(Map<Integer,List<Integer>> tableAndRowsIdxMap){if(tableAndRowsIdxMap!=null && !tableAndRowsIdxMap.isEmpty()){List<XWPFTable> tableList = doc.getTables();for(Map.Entry<Integer, List<Integer>> map : tableAndRowsIdxMap.entrySet()){Integer tableIdx = map.getKey();List<Integer> rowIdxList = map.getValue();if(rowIdxList!=null && rowIdxList.size()>0){if(tableList.size()<=tableIdx){logger.error("表格"+tableIdx+"不存在");continue;}XWPFTable table = tableList.get(tableIdx);List<XWPFTableRow> rowList = table.getRows();for(int i=rowList.size()-1;i>=0;i--){if(rowIdxList.contains(i)){table.removeRow(i);}}}}}}/*** 正则匹配字符串* * @param str* @return*/private Matcher matcher(String str) {Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}",Pattern.CASE_INSENSITIVE);Matcher matcher = pattern.matcher(str);return matcher;}/*** 正则匹配字符串* * @param str* @return*/private boolean matcherRow(String str) {Pattern pattern = Pattern.compile("\\$\\[(.+?)\\]",Pattern.CASE_INSENSITIVE);Matcher matcher = pattern.matcher(str);return matcher.find();}/** * 根据图片类型,取得对应的图片类型代码 * @param picType * @return int */  private int getPictureType(String picType){  int res = XWPFDocument.PICTURE_TYPE_PICT;  if(picType != null){  if(picType.equalsIgnoreCase("png")){  res = XWPFDocument.PICTURE_TYPE_PNG;  }else if(picType.equalsIgnoreCase("dib")){  res = XWPFDocument.PICTURE_TYPE_DIB;  }else if(picType.equalsIgnoreCase("emf")){  res = XWPFDocument.PICTURE_TYPE_EMF;  }else if(picType.equalsIgnoreCase("jpg") || picType.equalsIgnoreCase("jpeg")){  res = XWPFDocument.PICTURE_TYPE_JPEG;  }else if(picType.equalsIgnoreCase("wmf")){  res = XWPFDocument.PICTURE_TYPE_WMF;  }  }  return res;  }  private InputStream getPicStream(String picPath) throws Exception{URL url = new URL(picPath);  //打开链接  HttpURLConnection conn = (HttpURLConnection)url.openConnection();  //设置请求方式为"GET"  conn.setRequestMethod("GET");  //超时响应时间为5秒  conn.setConnectTimeout(5 * 1000);  //通过输入流获取图片数据  InputStream is = conn.getInputStream();return is;  }/*** 关闭输入流* * @param is*/private void close(InputStream is) {if (is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}}/*** 关闭输出流* * @param os*/private void close(OutputStream os) {if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}// public static void main(String[] args) throws Exception{
//      //WordReporter exporter = new WordReporter("c:\\booking_delivery.docx");
//      //exporter.init();
//      /*Map<String,Object> params1 = new HashMap<String,Object>();
//      params1.put("myTable", "怡美假日旅行社");
//      params1.put("username", "张三");
//      params1.put("Title", "昆大丽5天4晚休闲游");
//      Map<String,String> picMap = new HashMap<String,String>();
//      picMap.put("width", "416");//经测试416可以占一行
//      picMap.put("height", "120");
//      picMap.put("type", "jpg");
//      picMap.put("path", "http://192.168.1.81/p2/group1/M00/00/02/wKgBWVWBJF2AfcrKAAJnyycNFME158.jpg");
//      params1.put("logo", picMap);
//
//      exporter.export(params1);
//      List<Map<String,String>> list = new ArrayList<Map<String,String>>();
//      Map<String,String> m1 = new HashMap<String,String>();
//      m1.put("name", "李四1");
//      m1.put("age", "20");
//      m1.put("sex", "男");
//      m1.put("job", "攻城狮1");
//      m1.put("hobby", "篮球1");
//      m1.put("phone", "1231231");
//      list.add(m1);
//      Map<String,String> m2 = new HashMap<String,String>();
//      m2.put("name", "李四2");
//      m2.put("age", "22");
//      m2.put("sex", "女");
//      m2.put("job", "攻城狮2");
//      m2.put("hobby", "篮球2");
//      m2.put("phone", "1231232");
//      list.add(m2);
//      Map<String,String> m3 = new HashMap<String,String>();
//      m3.put("name", "李四3");
//      m3.put("age", "23");
//      m3.put("sex", "男3");
//      m3.put("job", "攻城狮3");
//      m3.put("hobby", "篮球3");
//      m3.put("phone", "1231233");
//      list.add(m3);
//      exporter.export(list,0);*/
//      Map<String,Object> m4 = new HashMap<String,Object>();
//      m4.put("name", "李四4");
//      m4.put("age", "24");
//      m4.put("sex", "男4");
//      /*Map<String,String> headMap = new HashMap<String,String>();
//      headMap.put("width", "170");
//      headMap.put("height", "170");
//      headMap.put("type", "jpg");
//      headMap.put("path", "http://192.168.1.81/p2/group1/M00/00/02/wKgBWVWBJF2AfcrKAAJnyycNFME158.jpg");
//      m4.put("head", headMap);*/
//      //exporter.export(m4, 2);
//
//      //exporter.exportImg(m4);
//      //exporter.generate("c:\\"+System.currentTimeMillis()+".doc");
//
//      String text = "test"+"\n"+"test\n";
//
//      String[] arr = text.split("\n");
//for(String str : arr){
//  System.out.println(str);
//}
//
//  }/*** 保留小数点后两位* @param d* @return*/public static String getPoint2(Double d){DecimalFormat df =new DecimalFormat("0.00");return df.format(d);}public static void main(String[] args) {/*BigDecimal b=new BigDecimal("56.244555");System.out.println(":"+getPoint2(b.doubleValue()));*/Integer b = new Integer(1);Integer a = 1000;Integer d = 1000;int c = 1;System.out.println(a==d);}/*** 判断字符串是否都为数字* @param str* @return*/public static boolean isNumeric(String str){ Pattern pattern = Pattern.compile("[0-9]*"); Matcher isNum = pattern.matcher(str);if( !isNum.matches() ){return false; } return true; }/*** 数字转换为汉语中人民币的大写<br>* * @author hongten* @contact hongtenzone@foxmail.com* @create 2013-08-13*/public static class NumberToCN {/*** 汉语中数字大写*/private static final String[] CN_UPPER_NUMBER = { "零", "壹", "贰", "叁", "肆","伍", "陆", "柒", "捌", "玖" };/*** 汉语中货币单位大写,这样的设计类似于占位符*/private static final String[] CN_UPPER_MONETRAY_UNIT = { "分", "角", "元","拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾","佰", "仟" };/*** 特殊字符:整*/private static final String CN_FULL = "整";/*** 特殊字符:负*/private static final String CN_NEGATIVE = "负";/*** 金额的精度,默认值为2*/private static final int MONEY_PRECISION = 2;/*** 特殊字符:零元整*/private static final String CN_ZEOR_FULL = "零元" + CN_FULL;/*** 把输入的金额转换为汉语中人民币的大写* * @param numberOfMoney*            输入的金额* @return 对应的汉语大写*/public static String number2CNMontrayUnit(BigDecimal numberOfMoney) {StringBuffer sb = new StringBuffer();// -1, 0, or 1 as the value of this BigDecimal is negative, zero, or// positive.int signum = numberOfMoney.signum();// 零元整的情况if (signum == 0) {return CN_ZEOR_FULL;}//这里会进行金额的四舍五入long number = numberOfMoney.movePointRight(MONEY_PRECISION).setScale(0, 4).abs().longValue();// 得到小数点后两位值long scale = number % 100;int numUnit = 0;int numIndex = 0;boolean getZero = false;// 判断最后两位数,一共有四中情况:00 = 0, 01 = 1, 10, 11if (!(scale > 0)) {numIndex = 2;number = number / 100;getZero = true;}if ((scale > 0) && (!(scale % 10 > 0))) {numIndex = 1;number = number / 10;getZero = true;}int zeroSize = 0;while (true) {if (number <= 0) {break;}// 每次获取到最后一个数numUnit = (int) (number % 10);if (numUnit > 0) {if ((numIndex == 9) && (zeroSize >= 3)) {sb.insert(0, CN_UPPER_MONETRAY_UNIT[6]);}if ((numIndex == 13) && (zeroSize >= 3)) {sb.insert(0, CN_UPPER_MONETRAY_UNIT[10]);}sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);sb.insert(0, CN_UPPER_NUMBER[numUnit]);getZero = false;zeroSize = 0;} else {++zeroSize;if (!(getZero)) {sb.insert(0, CN_UPPER_NUMBER[numUnit]);}if (numIndex == 2) {if (number > 0) {sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);}} else if (((numIndex - 2) % 4 == 0) && (number % 1000 > 0)) {sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);}getZero = true;}// 让number每次都去掉最后一个数number = number / 10;++numIndex;}// 如果signum == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负if (signum == -1) {sb.insert(0, CN_NEGATIVE);}// 输入的数字小数点后两位为"00"的情况,则要在最后追加特殊字符:整if (!(scale > 0)) {sb.append(CN_FULL);}return sb.toString();}}
}

到这里代码就写完了,点击【导出Word】按钮就会下载了。如图所示:

下载好后直接打开即可。Word部分内容如下:

【项目实战】Java POI之Word导出经典案例一相关推荐

  1. java poi实现word导出(包括word模板的使用、复制表格、复制行、插入图片的使用)

    java poi实现数据的word导出(包括word模板的使用.复制表格.复制行.插入图片的使用) 1.实现的效果 实现病人基本信息.多条病历数据.多项检查项图片的动态插入(网络图片) 2.模板 把w ...

  2. java POI对word中的表格动态插入固定数据,以及插入不确定数量的的数据

    java POI对word中的表格动态插入固定数据,以及插入不具体的数据 遇到个项目本来是用Execl导出的,相对简单,客户要求用Word导出,并按照他们给的模板进行导出: 从网上百度了一下,然后自己 ...

  3. java poi 操作word遇到的问题

    java poi 操作word文本,图表,遇到的问题 直接上问题 模板字段匹配问题 图表问题 图表导出 问题:模板找不到对应图表 问题:数据填充后效果不达目标 图表中为零的数值去掉(!!!模板层面解决 ...

  4. 视频教程-Springboot+Vue前后的分离整合项目实战-Java

    Springboot+Vue前后的分离整合项目实战 10多年互联网一线实战经验,现就职于大型知名互联网企业,架构师, 有丰富实战经验和企业面试经验:曾就职于某上市培训机构数年,独特的培训思路,培训体系 ...

  5. 项目实战 Java读取Excel数据

    项目实战 Java读取Excel数据 前言 实现步骤 导入POI依赖 示例Excel表结构 编写读取Excel工具类 实现思路 读取Excel数据工具类实现代码 取出从excel中获取的数据,并插入到 ...

  6. Java POI 生成Word文档

    在开发中有时候我们需要导出 word文档.最近因为需要做一个生成word文件的功能.就将这块拿出来和大家分享. 生成word文件和我们写word文档是相同的概念,只不过在这里我们换成了用代码来操作.下 ...

  7. JAVA POI处理WORD

    JAVA POI处理WORD 转载:http://w26.iteye.com/blog/974442 JavaApacheSVN 关键字:POI WORD HWPF WORD文本组成:文本.图.表和宏 ...

  8. 视频教程-Vue、Spring Boot开发小而完整的Web前后端分离项目实战-Java

    Vue.Spring Boot开发小而完整的Web前后端分离项目实战 3年多.net开发经验:5年的java后端开发经验,熟悉行.net,java流行技术,拥有多个.net,java web企业级应; ...

  9. 视频教程-SpringBoot2+Vue+AntV前后端分离开发项目实战-Java

    SpringBoot2+Vue+AntV前后端分离开发项目实战 10多年互联网一线实战经验,现就职于大型知名互联网企业,架构师, 有丰富实战经验和企业面试经验:曾就职于某上市培训机构数年,独特的培训思 ...

最新文章

  1. java 常用正则表达式
  2. 吐血,经过4个小时,终于发现这个可以解决虚拟机ubuntu不能联网的问题
  3. 【美文】接受生活的无力感,才能更好的出发
  4. 后端系统开发之白名单机制
  5. 云专网和云专线的区别_传统IDC行业与云计算的区别?
  6. mw315r 虚拟服务器,水星MW315R桥接设置教程
  7. [Chrome]查看内存使用命令
  8. 博客园修改页面显示样式
  9. with open as f用法_UE4精品教程 | C++Tuple元组的详细用法
  10. dispaly 的block与inline-block的用法
  11. Atitti.java android反编译解决方案-----虚拟机方案
  12. html显示实时时间_珠海体育场LED显示屏实时播放比赛时间
  13. 自组织特征映射网络(SOFM)
  14. Android模拟器黑屏
  15. 国家集训队论文集题目
  16. Python灰帽子pdf
  17. 【AI周报】2021图灵奖揭晓;字节开源veGiantModel;阿里开源EPL;谷歌AI框架Pathways论文放出
  18. iview 表单验证问题 Select 已经选择 还是弹验证提示
  19. 印章如何去蜡_印章抛光上蜡保养【图解】
  20. 苹果微信多开,苹果手机为什么不支持

热门文章

  1. 【web素材】16—激发你开发灵感的十大创意网站菜单示例效果
  2. 为什么微信小程序里的图片在电脑上显示在手机上不显示?
  3. Android 一体机研发之修改系统设置————声音
  4. Linux简介与安装
  5. 计算机本科毕业论文要求,计算机科学与技术学院本科毕业设计(论文)规范(试行)...
  6. asm磁盘头自动备份19c-au11
  7. 实内积空间和欧式空间的定义
  8. Microsoft Office 2016 VOL版下载
  9. MySQL installer直接解决安装(包括不想安在c盘也OK)、更新、卸载问题
  10. amd linux显卡驱动,AMD Radeon系列显卡催化剂驱动14.4 正式版For Linux AMD Radeon系列显卡催化剂驱动14.4 正式版 显卡驱动 超威半导体...