1.案例分析
2.技术说明
Ps:导出Word还需要关注一个“格式”的问题,否则就没必要用Word了,直接txt更方便。
3.代码流程
4.效果图
5.项目结构图
6.共享代码
// web.xml<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><servlet><servlet-name>indexServlet</servlet-name><servlet-class>org.imooc.servlet.IndexServlet</servlet-class></servlet><servlet-mapping><servlet-name>indexServlet</servlet-name><url-pattern>/index</url-pattern></servlet-mapping><servlet><servlet-name>importExcelInit</servlet-name><servlet-class>org.imooc.servlet.ImportExcelInitServlet</servlet-class></servlet><servlet-mapping><servlet-name>importExcelInit</servlet-name><url-pattern>/importExcelInit</url-pattern></servlet-mapping><servlet><servlet-name>importExcel</servlet-name><servlet-class>org.imooc.servlet.ImportExcelServlet</servlet-class></servlet><servlet-mapping><servlet-name>importExcel</servlet-name><url-pattern>/importExcel</url-pattern></servlet-mapping><servlet><servlet-name>exportExcelInit</servlet-name><servlet-class>org.imooc.servlet.ExportExcelInitServlet</servlet-class></servlet><servlet-mapping><servlet-name>exportExcelInit</servlet-name><url-pattern>/exportExcelInit</url-pattern></servlet-mapping><servlet><servlet-name>exportExcel</servlet-name><servlet-class>org.imooc.servlet.ExportExcelServlet</servlet-class></servlet><servlet-mapping><servlet-name>exportExcel</servlet-name><url-pattern>/exportExcel</url-pattern></servlet-mapping><servlet><servlet-name>importWordInit</servlet-name><servlet-class>org.imooc.servlet.ImportWordInitServlet</servlet-class></servlet><servlet-mapping><servlet-name>importWordInit</servlet-name><url-pattern>/importWordInit</url-pattern></servlet-mapping><servlet><servlet-name>importWord</servlet-name><servlet-class>org.imooc.servlet.ImportWordServlet</servlet-class></servlet><servlet-mapping><servlet-name>importWord</servlet-name><url-pattern>/importWord</url-pattern></servlet-mapping><servlet><servlet-name>exportWordInit</servlet-name><servlet-class>org.imooc.servlet.ExportWordInitServlet</servlet-class></servlet><servlet-mapping><servlet-name>exportWordInit</servlet-name><url-pattern>/exportWordInit</url-pattern></servlet-mapping><servlet><servlet-name>exportWord</servlet-name><servlet-class>org.imooc.servlet.ExportWordServlet</servlet-class></servlet><servlet-mapping><servlet-name>exportWord</servlet-name><url-pattern>/exportWord</url-pattern></servlet-mapping><jsp-config><jsp-property-group><url-pattern>*.jsp</url-pattern><include-prelude>/WEB-INF/jsp/common.jsp</include-prelude></jsp-property-group></jsp-config></web-app>
// common.jsp<%StringbasePath=request.getScheme() +"://"+request.getServerName() +":"+request.getServerPort() +request.getContextPath(); request.setAttribute("basePath", basePath); %>
// index.jsp<divclass="ileft"id="menuDiv"><h3onclick="clickSecondMenu(this,'${basePath}/importExcelInit')"><a>导入Excel</a></h3><h3onclick="clickSecondMenu(this,'${basePath}/exportExcelInit')"><a>导出Excel</a></h3><h3onclick="clickSecondMenu(this,'${basePath}/importWordInit')"><a>导入Word</a></h3><h3onclick="clickSecondMenu(this,'${basePath}/exportWordInit')"><a>导出Word</a></h3></div>
packageorg.imooc.dto; importorg.apache.commons.fileupload.FileItem; importjava.util.HashMap; importjava.util.Map; publicclassParamDto { privateMap<String,String>paramMap; privateMap<String,FileItem>fileMap; publicParamDto() { paramMap=newHashMap<>(); fileMap=newHashMap<>(); } ... } packageorg.imooc.dto; importorg.apache.commons.fileupload.FileItem; publicclassImportExcelParamDto { privateStringtitle; privateFileItemexcel; ... } packageorg.imooc.dto; importorg.imooc.entity.Student; importjava.util.List; publicclassImportExcelResultDto { privateStringtitle; privateList<Student>studentList; privateStringmsg; ... } packageorg.imooc.dto; importorg.apache.commons.fileupload.FileItem; publicclassImportWordParamDto { privateStringtitle; privateFileItemword; ... } packageorg.imooc.dto; publicclassImportWordResultDto { privateStringtitle; privateStringcontent; privateStringmsg; ... } packageorg.imooc.entity; importjava.util.Date; publicclassStudent { privateStringname; privateIntegerage; privateDatetime; ... }
packageorg.imooc.util; importorg.apache.commons.fileupload.FileItem; importorg.apache.commons.fileupload.FileUploadException; importorg.apache.commons.fileupload.disk.DiskFileItemFactory; importorg.apache.commons.fileupload.servlet.ServletFileUpload; importorg.imooc.dto.ParamDto; importjavax.servlet.http.HttpServletRequest; importjava.util.List; publicclassRequestUtil { /*** 从request流中解析参数与上传的文件* @param request*/publicstaticParamDtoparseParam(HttpServletRequestrequest) { ParamDtoresult=newParamDto(); ServletFileUploadupload=newServletFileUpload(newDiskFileItemFactory()); upload.setHeaderEncoding("UTF-8"); try { List<FileItem>fileItemList=upload.parseRequest(request); for(FileItemfileItem : fileItemList) { if(fileItem.isFormField()) { // 普通字段result.getParamMap().put(fileItem.getFieldName(),fileItem.getString("UTF-8")); } else { // 文件字段result.getFileMap().put(fileItem.getFieldName(),fileItem); } } } catch (FileUploadExceptione) { e.printStackTrace(); } catch (Exceptione) { e.printStackTrace(); } returnresult; } }
packageorg.imooc.service; importorg.apache.poi.hssf.usermodel.HSSFWorkbook; importorg.apache.poi.ss.usermodel.Row; importorg.apache.poi.ss.usermodel.Sheet; importorg.apache.poi.ss.usermodel.Workbook; importorg.apache.poi.ss.usermodel.WorkbookFactory; importorg.apache.poi.xssf.usermodel.XSSFWorkbook; importorg.imooc.dto.ImportExcelParamDto; importorg.imooc.dto.ImportExcelResultDto; importorg.imooc.entity.Student; importjava.io.IOException; importjava.util.ArrayList; importjava.util.List; publicclassExcelService { publicImportExcelResultDtoimp(ImportExcelParamDtodto) { ImportExcelResultDtoresult=newImportExcelResultDto(); result.setTitle(dto.getTitle()); List<Student>studentList=newArrayList<>(); result.setStudentList(studentList); Workbookworkbook=null; try { // 整个excel(包含里面很多的sheet)workbook=WorkbookFactory.create(dto.getExcel().getInputStream()); // 第0个sheetSheetsheet=workbook.getSheetAt(0); // 从0开始数,但是这里的 rowNum == len-1introwNum=sheet.getLastRowNum(); for(inti=1; i<=rowNum; i++) { // 第1行,因为第0行是字段名Rowrow=sheet.getRow(i); Studentstudent=newStudent(); studentList.add(student); // 获取单元格cell的内容// 注意:这里的数据类型要与excel的单元格的数据类型对齐,右键【设置单元格格式(F)…】查看student.setName(row.getCell(0).getStringCellValue()); student.setAge((int) row.getCell(1).getNumericCellValue()); student.setTime(row.getCell(2).getDateCellValue()); } } catch (Exceptione) { e.printStackTrace(); result.setMsg("解析Excel失败!"); } finally { if(workbook!=null) { try { workbook.close(); } catch (IOExceptione) { e.printStackTrace(); } } } returnresult; } publicWorkbookexport(booleanisXlsx) { Workbookworkbook; if(isXlsx) { // 07workbook=newXSSFWorkbook(); } else { // 03workbook=newHSSFWorkbook(); } Sheetsheet=workbook.createSheet("My Sheet"); List<List<String>>content=this.getContent(); for(inti=0; i<content.size(); i++) { Rowrow=sheet.createRow(i); List<String>rowData=content.get(i); for(intj=0; j<rowData.size(); j++) { row.createCell(j).setCellValue(rowData.get(j)); } } returnworkbook; } privateList<List<String>>getContent() { List<List<String>>result=newArrayList<>(); List<String>row=newArrayList<>(); result.add(row); row.add("序号"); row.add("姓名"); row.add("年龄"); row.add("时间"); row=newArrayList<>(); result.add(row); row.add("1"); row.add("路人甲"); row.add("18"); row.add("2010-01-01"); row=newArrayList<>(); result.add(row); row.add("2"); row.add("路人乙"); row.add("19"); row.add("2010-01-02"); row=newArrayList<>(); result.add(row); row.add("3"); row.add("路人丙"); row.add("20"); row.add("2010-01-03"); returnresult; } }
packageorg.imooc.service; importorg.apache.poi.hwpf.HWPFDocument; importorg.apache.poi.hwpf.usermodel.Range; importorg.apache.poi.poifs.filesystem.OfficeXmlFileException; importorg.apache.poi.xwpf.usermodel.XWPFDocument; importorg.apache.poi.xwpf.usermodel.XWPFParagraph; importorg.apache.poi.xwpf.usermodel.XWPFRun; importorg.imooc.dto.ImportWordParamDto; importorg.imooc.dto.ImportWordResultDto; importjava.io.FileInputStream; importjava.io.IOException; importjava.util.List; importjava.util.Map; publicclassWordService { /*** 导入*/publicImportWordResultDtoimp(ImportWordParamDtodto) { ImportWordResultDtoresult=newImportWordResultDto(); result.setTitle(dto.getTitle()); HWPFDocumentdoc=null; // 03try { doc=newHWPFDocument(dto.getWord().getInputStream()); // word 中的换行标识符是 \rresult.setContent(doc.getDocumentText().replace("\r","<br/>")); } catch (OfficeXmlFileExceptionoe) { System.out.println("这可能是一个07版的Word"); } catch (Exceptione) { result.setMsg("这可能不是一个Word"); returnresult; } finally { if(doc!=null) { try { doc.close(); returnresult; } catch (IOExceptione) { e.printStackTrace(); } } } // 07XWPFDocumentdocx=null; try { docx=newXWPFDocument(dto.getWord().getInputStream()); List<XWPFParagraph>paragraphList=docx.getParagraphs(); StringBuildercontent=newStringBuilder(); // 07Word 以段落的方式分割,是手动换行才算;而不是空间不够挤到下一行,这不算换行,会当成同一个段落里for (inti=0; i<paragraphList.size(); i++) { if(i!=0) { content.append("<br/>"); } content.append(paragraphList.get(i).getText()); } result.setContent(content.toString()); } catch (IOExceptione) { e.printStackTrace(); } finally { if(docx!=null) { try { docx.close(); } catch (IOExceptione) { e.printStackTrace(); } } } returnresult; } /*** 导出03版Word*/publicHWPFDocumentexport03(Map<String,String>replaceContent) { HWPFDocumentdoc=null; try { // 模板文件地址载入doc=newHWPFDocument(newFileInputStream("D:\\template\\template_03.doc")); Rangerange=doc.getRange(); for(Map.Entry<String,String>entry : replaceContent.entrySet()) { range.replaceText(entry.getKey(),entry.getValue()); } } catch (Exceptione) { returnnull; } returndoc; } /*** 导出07版Word*/publicXWPFDocumentexport07(Map<String,String>replaceContent) { XWPFDocumentdocx=null; try { // 模板文件地址载入,导出一定要有模板文件,否则是不行的。docx=newXWPFDocument(newFileInputStream("D:\\template\\template_07.docx")); List<XWPFParagraph>paragraphList=docx.getParagraphs(); for(XWPFParagraphparagraph : paragraphList) { List<XWPFRun>runs=paragraph.getRuns(); // run 是根据格式不一样来分割for(XWPFRunrun : runs) { Stringstr=run.getText(run.getTextPosition()); for(Map.Entry<String,String>entry : replaceContent.entrySet()) { str=str.replace(entry.getKey(),entry.getValue()); } run.setText(str,0); } } } catch (IOExceptione) { returnnull; } returndocx; } }
7.导入Excel(核心代码)
packageorg.imooc.servlet; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjava.io.IOException; publicclassImportExcelInitServletextendsHttpServlet { @OverrideprotectedvoiddoGet(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException { this.doPost(req, resp); } @OverrideprotectedvoiddoPost(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException { req.getRequestDispatcher("/WEB-INF/jsp/importExcel.jsp").forward(req,resp); } }
// importExcel.jsp<formid="mainForm"method="post"enctype=""action="${basePath}/importExcel"><inputid="title"name="title"type="text"/><inputtype="file"name="excel"/><inputvalue="导入"onclick="document.getElementById('mainForm').submit();"type="button"/></form>
packageorg.imooc.servlet; importorg.apache.commons.fileupload.servlet.ServletFileUpload; importorg.imooc.dto.ImportExcelParamDto; importorg.imooc.dto.ImportExcelResultDto; importorg.imooc.dto.ParamDto; importorg.imooc.service.ExcelService; importorg.imooc.util.RequestUtil; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjava.io.IOException; publicclassImportExcelServletextendsHttpServlet { @OverrideprotectedvoiddoGet(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException { this.doPost(req, resp); } @OverrideprotectedvoiddoPost(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException { if(ServletFileUpload.isMultipartContent(req)) { // enctype="multipart/form-data" 带文件上传的表单ParamDtodto=RequestUtil.parseParam(req); ImportExcelParamDtoparamDto=newImportExcelParamDto(); paramDto.setTitle(dto.getParamMap().get("title")); paramDto.setExcel(dto.getFileMap().get("excel")); ExcelServiceservice=newExcelService(); ImportExcelResultDtoresultDto=service.imp(paramDto); req.setAttribute("result",resultDto); } else { // 普通表单// req.getParameter(""); } req.getRequestDispatcher("/WEB-INF/jsp/importExcelResult.jsp").forward(req,resp); } }
// importExcelResult.jsp<scripttype="text/javascript">functionbodyInit() { // 与EL搭配使用时,必须要加引号,因为读取出来不是字符串,比如:张三,而不是"张三"// if('') --> false; if('有内容') --> trueif('${result.msg}') { alert('${result.msg}'); } } </script><bodyonload="bodyInit();"><tr><td>标题:</td><td>${result.title}</td></tr><c:forEachitems="${result.studentList}"var="item"varStatus="s"><tr><td>${s.count}</td><td>${item.name}</td><td>${item.age}</td><td><fmt:formatDatevalue="${item.time}"pattern="yyyy-MM-dd"/></td></tr></c:forEach></body>
8.导出Excel(核心代码)
packageorg.imooc.servlet; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjava.io.IOException; publicclassExportExcelInitServletextendsHttpServlet { @OverrideprotectedvoiddoGet(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException { this.doPost(req, resp); } @OverrideprotectedvoiddoPost(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException { req.getRequestDispatcher("/WEB-INF/jsp/exportExcel.jsp").forward(req,resp); } }
// exportExcel.jsp<formaction="${basePath}/exportExcel"id="mainForm"method="post"><td>标题:</td><td><inputid="title"value=""type="text"/></td><td><inputvalue="查询"onclick=""type="button"/><inputvalue="导出"onclick="document.getElementById('mainForm').submit();"type="button"/></td></form>
packageorg.imooc.servlet; importorg.apache.poi.ss.usermodel.Workbook; importorg.imooc.service.ExcelService; importjavax.servlet.ServletException; importjavax.servlet.ServletOutputStream; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjava.io.FileInputStream; importjava.io.FileOutputStream; importjava.io.IOException; publicclassExportExcelServletextendsHttpServlet { @OverrideprotectedvoiddoGet(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException { this.doPost(req, resp); } @OverrideprotectedvoiddoPost(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException { ExcelServiceservice=newExcelService(); Workbookworkbook=service.export(true); resp.setHeader("Content-Disposition","attachment;filename=export.xlsx"); ServletOutputStreamoutputStream=resp.getOutputStream(); // 直接将文件输出提供下载导出workbook.write(outputStream); outputStream.flush(); outputStream.close(); workbook.close(); // 把文件先存下来再提供下载导出// 想用这种方法把上边【直接将文件输出提供下载导出】部分注释掉,把下边这部分代码放开运行// FileOutputStream fileOutputStream = new FileOutputStream("d:/upload/export.xlsx");// workbook.write(fileOutputStream);// FileInputStream fileInputStream = new FileInputStream("d:/upload/export.xlsx");// byte[] bytes = new byte[fileInputStream.available()];// fileInputStream.read(bytes);// outputStream.write(bytes);// outputStream.flush();// outputStream.close();// workbook.close(); } } /*第一种:直接将文件输出提供下载导出客户端:我要一个表格服务器:好,我在处理服务器(处理好了)服务器:接着!(直接把处理好的丢给客户端,所以服务端丢完就没了)客户端:拿到了!第二种:把文件先存下来再提供下载导出客户端:我要一个表格服务器:好,我在处理服务器(处理好了)服务器:路径给你,自己下载一份!(把处理好的保存在自己的磁盘,所以服务端还存在)客户端:我下载好了!(是根据服务器提供的下载路径下载下来,相当于服务器是原本,客户端是拷贝本)*/
9.导入Word(核心代码)
packageorg.imooc.servlet; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjava.io.IOException; publicclassImportWordInitServletextendsHttpServlet { @OverrideprotectedvoiddoGet(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException { this.doPost(req, resp); } @OverrideprotectedvoiddoPost(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException { req.getRequestDispatcher("/WEB-INF/jsp/importWord.jsp").forward(req,resp); } }
// importWord.jsp<formid="mainForm"method="post"action="${basePath}/importWord"enctype="multipart/form-data"><inputid="title"name="title"type="text"/><inputtype="file"name="word"/><inputvalue="导入"onclick="document.getElementById('mainForm').submit();"type="button"/></form>
packageorg.imooc.servlet; importorg.apache.commons.fileupload.servlet.ServletFileUpload; importorg.imooc.dto.*; importorg.imooc.service.WordService; importorg.imooc.util.RequestUtil; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjava.io.IOException; publicclassImportWordServletextendsHttpServlet { @OverrideprotectedvoiddoGet(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException { this.doPost(req, resp); } @OverrideprotectedvoiddoPost(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException { if(ServletFileUpload.isMultipartContent(req)) { // 带有文件表单ParamDtodto=RequestUtil.parseParam(req); ImportWordParamDtoparamDto=newImportWordParamDto(); paramDto.setTitle(dto.getParamMap().get("title")); paramDto.setWord(dto.getFileMap().get("word")); WordServiceservice=newWordService(); ImportWordResultDtoresultDto=service.imp(paramDto); req.setAttribute("result",resultDto); } else { // 普通表单// req.getParameter(""); } req.getRequestDispatcher("/WEB-INF/jsp/importWordResult.jsp").forward(req,resp); } }
// importWordResult.jsp<scripttype="text/javascript">functionbodyInit() { if('${result.msg}') { alert('${result.msg}'); } } </script><bodyonload="bodyInit();"><formaction=""id="mainForm"method="post"><tr><td>标题:</td><td>${result.title}</td></tr><tr><td>内容:</td><td>${result.content}</td></tr></form></body>
10.导出Word(核心代码)
packageorg.imooc.servlet; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjava.io.IOException; publicclassExportWordInitServletextendsHttpServlet { @OverrideprotectedvoiddoGet(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException { this.doPost(req, resp); } @OverrideprotectedvoiddoPost(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException { req.getRequestDispatcher("/WEB-INF/jsp/exportWord.jsp").forward(req,resp); } }
// exportWord.jsp<formid="mainForm"method="post"action="${basePath}/exportWord"><inputtype="hidden"name="isDocx"id="isDocx"/><inputname="name"value="张三"type="text"/><inputname="age"value="40"type="text"/><inputname="time"value="2016-01-01"type="text"/><inputvalue="导出03"type="button"onclick="document.getElementById('isDocx').value = '';document.getElementById('mainForm').submit();"/><inputvalue="导出07"type="button"onclick="document.getElementById('isDocx').value = '1';document.getElementById('mainForm').submit();"/></form>
packageorg.imooc.servlet; importorg.apache.poi.hwpf.HWPFDocument; importorg.apache.poi.xwpf.usermodel.XWPFDocument; importorg.imooc.service.WordService; importjavax.servlet.ServletException; importjavax.servlet.ServletOutputStream; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjava.io.IOException; importjava.util.HashMap; importjava.util.Map; publicclassExportWordServletextendsHttpServlet { @OverrideprotectedvoiddoGet(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException { this.doPost(req, resp); } @OverrideprotectedvoiddoPost(HttpServletRequestreq, HttpServletResponseresp) throwsServletException, IOException { // 用流直接输出,服务器没有保存req.setCharacterEncoding("UTF-8"); WordServiceservice=newWordService(); Map<String,String>param=newHashMap<>(); param.put("${name}",req.getParameter("name")); param.put("${age}",req.getParameter("age")); param.put("${time}",req.getParameter("time")); ServletOutputStreamoutputStream=resp.getOutputStream(); if(req.getParameter("isDocx") !=null&&!"".equals(req.getParameter("isDocx"))) { XWPFDocumentdocx=service.export07(param); resp.setHeader("Content-Disposition","attachment;filename=export.docx"); docx.write(outputStream); docx.close(); } else { HWPFDocumentdoc=service.export03(param); resp.setHeader("Content-Disposition","attachment;filename=export.doc"); doc.write(outputStream); doc.close(); } outputStream.flush(); outputStream.close(); } }
11.下载地址:点击进入下载页面
12.待更新...














