文档章节

java生成word文档到服务器,并下载

R
 RookieFang
发布于 2017/04/11 16:26
字数 990
阅读 465
收藏 1

前台js只需要一个方法,

1.Action:说明:dataMap是需要展示的数据,

String rootPath = SaveFileUtil.FILE_PATH;此处是为了判断盘符的,win系统和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.判断盘符:

/**
 * 保存台上传到的文件
 */
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的路径下,即可;

5.生成word的方法

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就此结束

 

 

下面的下载该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;
	}

 

© 著作权归作者所有

R
粉丝 3
博文 30
码字总数 49093
作品 0
合肥
私信 提问
java动态填充word文档并上传到服务器

一、 需求背景   在一些特殊应用场合,客户希望在服务器上生成文档的同时并填充数据,客户端的页面不显示打开文档,但是服务器上生成文档对服务器压力很大,目前服务器上生成文档第一种就是方式...

山里的红杏
2018/05/07
66
0
java导出、打印、下载word文档的最佳方法?

有个需求,就是将数据生成word文档,然后导出下载打印。word文档是设计师做的一套非常漂亮的模板,我尝试以下几个方法,都不够完美。 1.无非是java操作word,使用POI等,参见http://stackove...

Just-Me
2015/07/13
11.1K
9
使用 Apache POI 和 OpenOffice API 在 Linux 中统计 Office 文档的页数

简介: 在实际的项目开发中经常会遇到需要在不同的操作系统平台上统计 Microsoft Office 系列文档页数的要求。Apache POI 提供了一套完整的用于访问微软格式文档的 Java API。但是 Apache P...

IBMdW
2012/10/26
1K
0
Android根据word模板文档将表单数据生成word文档的方案整理

版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 尝试的方案包括以下几种: freemarker 只能在java项目上运行,无法在Android项目上运行; 参考资料:《FreemarkerJavaDemo【And...

HaiyuKing
04/29
0
0
FreemarkerJavaDemo【Android将表单数据生成Word文档的方案之一(基于freemarker2.3.28,只能java生成)】

版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个方案只能在java中运行,无法在Android项目中运行。所以此方案是:APP将表单数据发送给后台,后台通过freemarker将表单数据根...

HaiyuKing
04/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
5
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
6
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
4
0
OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
1K
11
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部