前台js只须要一个方法,css
1.Action:说明:dataMap是须要展现的数据,java
String rootPath = SaveFileUtil.FILE_PATH;此处是为了判断盘符的,win系统和linux系统状况linux
/** * * @Description: 生成单 * @date 2017年4月10日 下午4:29:04 * @version 1.0 * @param */ public void makeDispatch(){ try { String weekuuid=request.getParameter("weekuuid"); String dayuuid=request.getParameter("dayuuid"); String doflag="sh"; String mondaygroupper=weekPlanTaskService.queryPerson(dayuuid,doflag); String checkPer=weekPlanTaskService.queryCheckById(dayuuid); String puuid = UserUtil.getPersonUuid(); Map person = getPerson(puuid); String userDeptName = (String)person.get("DEPT_NAME");//机构 //获取编号---编号 String BUILD_NO=weekPlanTaskService.queryBuildNo(); //路径 String rootPath = SaveAndroidSubmitFileUtil.FILE_PATH; String dispatchPath = Configuration.getString("dispatch") + DateUtil.getCurrentDate("yyyyMMdd") + "/dispatch/"; String path=rootPath+dispatchPath;//路径 String template = "", fileName = ""; // 模版名和文件名 Map<String, Object> dataMap = new HashMap<String, Object>(); // 要导出到word的数据 dataMap.clear(); template = "checkDispatchDoc.ftl"; fileName = "么么单.doc"; dataMap.put("CLIENTNAME", mondaygroupper); dataMap.put("CHECKPER", checkPer); dataMap.put("ORGNAME", userDeptName); dataMap.put("NO", BUILD_NO); // 导出word DocumentHandler doc = new DocumentHandler(); String docFlag = doc.createDocNew(dataMap, path, fileName, template); elog.debug("hughman: " + docFlag); //保存到数据库 String wordPath = dispatchPath + fileName; Map m=new HashMap(); m.put("BUILD_PERSON", puuid); m.put("DOC_URL", wordPath); m.put("BUILD_NO", BUILD_NO); m.put("dayuuid", dayuuid); weekPlanTaskService.ModifyDispatch(m); //返回路径 String filepath=dispatchPath+fileName; response.getWriter().write("{\"filepath\":\""+ filepath + "\"}"); } catch (Exception e) { LogUtil.error(e); e.printStackTrace(); } }
2.判断盘符:web
/** * 保存台上传到的文件 */ public class SaveFileUtil { public static String FILE_PATH = ""; //文件地址 public static String IMAGE_DEFAULT = "/include/images/default.jpg"; static { Properties prop = System.getProperties(); String os = prop.getProperty("os.name"); if (os.indexOf("win") >= 0 || os.indexOf("Win") >= 0) { FILE_PATH = Configuration.getString("WIN_FILE_UPLOAD_PATH"); } else { FILE_PATH = Configuration.getString("FILE_UPLOAD_PATH"); } }
3.这里涉及获取编码:首先去库里查询 最大编码,而后再次基础上+1,编码的格式的 当前年与文件数的之和数据库
//生成编码 public String queryBuildNo(){ String BuildNo=weekPlanTaskMapper.queryBuildNo(); String year=DateUtil.getCurrentDate("yyyy"); if(BuildNo.isEmpty()||BuildNo==""||BuildNo.equals("")){ BuildNo=year+"0001"; }else{ String Peryear=BuildNo.substring(0, 4); String num=BuildNo.substring(4, 8); int endNum = Integer.parseInt(num); //年份是当年 就加1 不是的话换年份 if(Peryear.equals(year)){ endNum=endNum+1; String NUM=String.valueOf(endNum); if(NUM.length()==1){ NUM="000"+NUM; }else if(NUM.length()==1){ NUM="00"+NUM; }else if(NUM.length()==1){ NUM="0"+NUM; } BuildNo=Peryear+NUM; }else{ BuildNo=year+"0001"; } } return BuildNo; }
4.模板的生成,首先将本身须要的word模板制做好,而后,须要导出的部门使用dataMap的字段写好,而后另存为xml格式,更名为ftl,而后搜索刚刚的字段,所有写成${字段} 便可,将ftl文件放到java的src的路径下,便可;app
5.生成word的方法ui
import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.io.Writer; import java.util.Map; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; /** * @description 导出word文档的公共类 * @author * @date */ public class DocumentHandler { private Configuration configuration = null; public DocumentHandler() { configuration = new Configuration(); configuration.setDefaultEncoding("utf-8"); } /** * * @param dataMap 要填入模本的数据文件 * @param path 输出文档的路径 * @param fileName 输出文档的名称 * @param templateName 模版文件名称 * @return flag 0000导出成功 0001模版不存在 0002文件编码异常 0003模版异常 0004导出异常 */ public String createDocNew(Map<String, Object> dataMap, String path, String fileName, String templateName) { String flag = "0000"; try { // 设置模本装置方法和路径,包名 configuration.setClassForTemplateLoading(this.getClass(), "/com/icss/apcd/util/template"); // .ftl为要装载的模板 Template template = configuration.getTemplate(templateName); // 输出文档路径及名称 File outFile = new File(path); if (!outFile.exists()) { outFile.mkdirs(); } outFile = new File(path + fileName); /* * 此处对流的编码不可或缺,使用main()单独调用时,应该能够 * 可是若是是web请求导出时导出后word文档就会打不开,而且报XML文件错误,主要是编码格式不正确,没法解析 */ FileOutputStream fos = new FileOutputStream(outFile); OutputStreamWriter osWriter = new OutputStreamWriter(fos, "UTF-8"); Writer writer = new BufferedWriter(osWriter); template.process(dataMap, writer); writer.close(); fos.close(); } catch (FileNotFoundException e) { flag = "0001"; e.printStackTrace(); } catch (UnsupportedEncodingException e) { flag = "0002"; e.printStackTrace(); } catch (TemplateException e) { flag = "0003"; e.printStackTrace(); } catch (IOException e) { flag = "0004"; e.printStackTrace(); } return flag; } }
完结--生成word就此结束this
下面的下载该word编码
/** * 下载文件 */ public String downLoadFile() { String fileName="么么单.doc";//fileName的后缀名决定下载的文件类型 String dayuuid=request.getParameter("dayuuid"); String url=weekPlanTaskService.getURLById(dayuuid); response.setContentType( "application/msword"); //response.setContentType("images/x-dcx"); response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); try { // 这个就就是弹出下载对话框的关键代码 response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); String rootPath = SaveAndroidSubmitFileUtil.FILE_PATH; File resFile = new File(rootPath + url); InputStream input = new FileInputStream(resFile); ServletOutputStream out = response.getOutputStream(); byte[] buffer = new byte[1024]; int i = 0; while ((i = input.read(buffer)) != -1) { out.write(buffer, 0, i); } input.close(); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } return null; }