精华内容
下载资源
问答
  • word模板,将其另存为xml格式,模板的文件名最好是英文,可以设置生成的文件名成。然后将xml文件的后缀名修改为ftl格式,就变成了freemarker的标准格式(xml格式的其实也可以)。比较繁琐的就对格式的搜索,动则几...

    用word模板,将其另存为xml格式,模板的文件名最好是英文,可以设置生成的文件名成。然后将xml文件的后缀名修改为ftl格式,就变成了freemarker的标准格式(xml格式的其实也可以)。比较繁琐的就对格式的搜索,动则几万行费眼,博主曾半个月对一个word模板修改十多次,心累,最好确定好最终的模板格式,记录下我的word生成工具和调用,freemarker语法这里就不说了,过程就是搬砖的过程,跟jsp页面其实没太大区别。

    之前的项目比较老,有时间在调整一份springboot的版本吧

     

    调用 并返回导出模板路径

    //导出模板路径
    String path=WordUtils.exprotWordToLocal(param,"MorningMeetingDaily.xml","XX会日报");

     

    工具类

    package com.sgcc.common.util;
    
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.util.Map;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import com.common.BaseUtils;
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    /**
     * 
     * @ClassName: WordUtils
     * @描述: word工具类,提供导出方法
     * @@author: jinyihao
     * @date: 2019-7-16 下午3:01:51
     */
    @SuppressWarnings({ "rawtypes", "deprecation" })
    public class WordUtils {
    	private static final Logger logger = Logger.getLogger(WordUtils.class.getName());
    	
    	private static Configuration configuration = null;
    	private static String code = "UTF-8";
    	private static String upload_url;
    	static {
    		try {
    			logger.log(Level.INFO,"WordUtils 初始化开始");
    			configuration = new Configuration();
    			configuration.setDefaultEncoding(code);
    			upload_url = BaseUtils.getProperties("upload_url");
    			configuration.setDirectoryForTemplateLoading(new File(upload_url));
    		} catch (Exception e) {
    			logger.log(Level.SEVERE,"WordUtils 初始化异常    upload_url: "+upload_url ,e);
    		}
    	}
    
    	private WordUtils() {
    		throw new AssertionError();
    	}
    
    	/**
    	 * 获取网络图片的流
    	 * 
    	 * @param imgURL
    	 * @return
    	 * @throws IOException
    	 */
    	@SuppressWarnings("unused")
    	private static InputStream getUrlInputStream(String imgURL) {
    		try {
    			// 创建URL
    			URL url = new URL(imgURL);
    			// 创建链接
    			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    			conn.setRequestMethod("GET");
    			conn.setConnectTimeout(5 * 1000);
    			InputStream is = conn.getInputStream();
    			return is;
    		} catch (IOException e) {
    			logger.log(Level.SEVERE,"WordUtils 获取网络图片异常 ",e);
    			return null;
    		}
    
    	}
    
    	/**
    	 * 从输入流中获取数据
    	 * 
    	 * @param inStream
    	 *            输入流
    	 * @return
    	 * @throws IOException
    	 * @throws Exception
    	 */
    	@SuppressWarnings("unused")
    	private static byte[] readInputStream(InputStream inStream)
    			throws IOException {
    		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
    		byte[] buffer = new byte[10240];
    		int len = 0;
    		while ((len = inStream.read(buffer)) != -1) {
    			outStream.write(buffer, 0, len);
    		}
    		inStream.close();
    		return outStream.toByteArray();
    	};
    
    	/**
    	 * 处理转义字符
    	 * @param str
    	 * @return
    	 */
    	public static String transform(String str) {
    		if (str.contains("<") || str.contains(">") || str.contains("&")) {
    			str = str.replaceAll("<", "&lt;").replaceAll(">", "&gt;")
    					.replaceAll("&", "&amp;");
    		}
    		return str;
    	}
    
    	/**
    	 * 创建文件路径
    	 * @param destFileName  字符串格式的 文件路径
    	 * @return
    	 */
    	  public static boolean createFile(String destFileName) {  
    	        File file = new File(destFileName);  
    	        if(file.exists()) {  
    	            return false;  
    	        }  
    	        if (destFileName.endsWith(File.separator)) {   
    	            return false;  
    	        }  
    	        //判断目标文件所在的目录是否存在  
    	        if(!file.getParentFile().exists()) {  
    	            //如果目标文件所在的目录不存在,则创建父目录  
    	            if(!file.getParentFile().mkdirs()) {  
    	                return false;  
    	            }  
    	        }  
    	        //创建目标文件  
    	        try {  
    	            if (file.createNewFile()) {  
    	                return true;  
    	            } else {  
    	                return false;  
    	            }  
    	        } catch (IOException e) {  
    	            logger.log(Level.SEVERE,"word 导出文件生成异常" + destFileName + "  :",e);
    	            return false;  
    	        }  
    	}  
    
    	private static File createDoc(Map<?, ?> dataMap, Template t){
    		return createDoc(dataMap, t,"test.doc") ;
    	}
    	private static File createDoc(Map<?, ?> dataMap, Template t,String name) {
    		createFile(name);
    		File f = new File(name);
    		// 生成文件路径
    		try {
    			Writer w = new OutputStreamWriter(new FileOutputStream(f), code);
    			t.process(dataMap, w);
    			w.close();
    		} catch (Exception e) {
    			logger.log(Level.SEVERE,"word 导出文件异常" + name + "  :",e);
    		}
    		return f;
    	}
    
    	public static void exprotWord(HttpServletRequest request,
    			HttpServletResponse response, Map map, String modleName,
    			String fileName) throws IOException {
    		Template template = configuration.getTemplate(modleName);
    		File file = null;
    		InputStream inputStream = null;
    		ServletOutputStream servletOutputStream = null;
    		try {
    			// 调用工具类的方法生成Word文档
    			file = createDoc(map, template);
    			inputStream = new FileInputStream(file);
    			response.setCharacterEncoding(code);
    			response.setContentType("application/msword");
    			// 设置浏览器以下载的方式处理该文件名
    			fileName.concat(".doc");
    			response.setHeader("Content-Disposition", "attachmentfilename="
    					.concat(String.valueOf(URLEncoder.encode(fileName, code))));
    			servletOutputStream = response.getOutputStream();
    			byte[] buffer = new byte[512];// 缓冲区
    			int bufferToRead = -1;
    			// 通过循环讲读入的Word文件的内容输出到浏览器中
    			while ((bufferToRead = inputStream.read(buffer)) != -1) {
    				servletOutputStream.write(buffer, 0, bufferToRead);
    			}
    		} catch (Exception e) {
    			logger.log(Level.SEVERE,"word 导出异常" + fileName + "  :",e);
    		} finally {
    			if (inputStream != null)
    				inputStream.close();
    			if (servletOutputStream != null)
    				servletOutputStream.close();
    			if (file != null)
    				file.delete();// 删除临时文件
    		}
    	}
    
    	/**
    	 * 
    	 * @描述: TODO(导出word到本地)   
    	 * @param: @param map         导出数据
    	 * @param: @param modleName   模版名称
    	 * @param: @param fileName    文件名称: 早例会日报
    	 * @param: @return      
    	 * @return: String      
    	 * @throws
    	 */
    	public static String exprotWordToLocal(Map map, String modleName,
    			String fileName) {
    		fileName += DateUtil.getDate("yyyyMMddHHmmss") + ".doc";
    		String filePath = upload_url;
    		try {
    			Template template = configuration.getTemplate(modleName);
    			File file = createDoc(map, template,filePath+fileName);
    			if(file==null){
    				return null;// 文件生成异常
    			}
    		} catch (Exception e) {
    			logger.log(Level.SEVERE,"WordUtils 初始化异常",e);
    			return null;// 文件生成异常
    		}
    		return fileName ;
    	}
    
    }

     

    展开全文
  • 先贴一段代码,这是根据网上的代码稍作修改后可以直接运行 需要下载freemarker.jar maven的项目直接引用 org.freemarker freemarker ...import java.io.BufferedWriter;...import java.io.File;...import java.i

    先贴一段代码,这是根据网上的代码稍作修改后可以直接运行

    需要下载freemarker.jar

    maven的项目直接引用

    <dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.23</version>
    </dependency>


    package com.yh.ibd.web;
    
    
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    import java.lang.reflect.Method;
    import java.util.HashMap;
    import java.util.Map;
    
    
    import com.yh.ibd.model.HL;
    
    
    import freemarker.template.Configuration;
    import freemarker.template.DefaultObjectWrapper;
    import freemarker.template.Template;
    import freemarker.template.TemplateExceptionHandler;
    import sun.misc.BASE64Encoder;
    
    
    public class WordGenrate {
    	public static void main(String [] args) throws IOException{
    		HL hl = new HL();
    		hl.setIhlCode("aaaaa");
    		hl.setIhlId("123");
    		Map<String, Object> dataMap = getDataMap(hl);
    		createDoc(dataMap);
    	}
    	
    	 public static void createDoc(Map<String, Object> dataMap){
             try{
            	 	Configuration configure = null;
            	 	configure= new Configuration();
                    configure.setDefaultEncoding("utf-8");
                    //加载需要装填的模板
                    Template template  = null;
                    
                    //加载模板文件
                    configure.setClassForTemplateLoading(WordGenrate.class,"");//这里是指定模板的位置,“”为空说明是在当前类的同级目录下
                    //设置对象包装器
                    configure.setObjectWrapper(new DefaultObjectWrapper());
                    //设置异常处理器
                    configure.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
                    //定义Template对象,注意模板类型名字与downloadType要一致
                    template= configure.getTemplate("hlTemplate2.xml","UTF-8");//调用整理好的模板文件
                    //输出文档
                    File outFile = new File("E:\\wenjian\\hlTemplate.doc");//这里是生成好的word文档的输出地址
                    Writer out = null;
                    out= new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"utf-8"));                                   
                    template.process(dataMap,out);
                    outFile.delete();
             }catch (Exception e) {
                    e.printStackTrace();
             }
    	 }
    	
    	private static Map<String, Object> getDataMap(HL hl){
    		Map<String, Object> dataMap = new HashMap<String, Object>();
    		dataMap = setObjToMap(hl);
    		return dataMap;
    	}
    	
    	public static Map<String,Object> setObjToMap(Object obj){
    		Map<String,Object> dataMap = new HashMap<String,Object>();
            Class c;
            try {
                c = Class.forName(obj.getClass().getName());
                Method[] methods = c.getMethods();
                for(int i=0,l=methods.length;i<l;i++){
                    String method = methods[i].getName();
                    System.out.println("The method is:" + method);
                    if(method.startsWith("get")){
                        Object value = methods[i].invoke(obj);
                        if(value != null){
                            if(value.getClass().getClassLoader() != null){  //处理自定义的对象类型
                                setObjToMap(value);
                            }
                            String key = method.substring(3);
                            key = key.substring(0, 1).toLowerCase() + key.substring(1);
                            /*if("java.util.Date".equals(value.getClass().getName())){
                                value = DateUtil.dateToString((Date)value);
                            }*/
                            dataMap.put(key, value);
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return dataMap;
        }
    }


    展开全文
  • 最近在开发一个功能,就是通过JAVA生成word文档,调研了很多开源框架,最终决定通过freemarker实现。具体实现方式如下:先用word做个模板出来,然后保存为XML形式,再将需要替换的地方更换为freemarker标签,然后在...

    最近在开发一个功能,就是通过JAVA生成word文档,调研了很多开源框架,最终决定通过freemarker实现。具体实现方式如下:

    先用word做个模板出来,然后保存为XML形式,再将需要替换的地方更换为freemarker标签,然后在JAVA中将模板读入在写出。

    调试的时候,是用main方法弄的,没有任何问题,生成的word文档打开正常。

    问题就出在将代码通过web形式调用时,JSP上点击按钮,然后调用代码,最后生成的word文档提示无法打开,系统无异常。

    请问问题可能会出在哪块?

    一下是部分代码:

    public class DocumentHandler {

    public static void createDoc(Map dataMap, String templateName, String wordPathName) {

    Writer out = null;

    try {

    Configuration configuration = new Configuration();

    configuration.setDefaultEncoding("utf-8");

    System.out.println(configuration.getDefaultEncoding());

    configuration.setClassForTemplateLoading(DocumentHandler.class, ResourcesUtil.getProperties(Constants.TEMPLATE_PATH));

    // 加载模板

    Template template = configuration.getTemplate(templateName);

    File outFile = new File(wordPathName);

    out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));

    template.process(dataMap, out);

    } catch (FileNotFoundException e) {

    e.printStackTrace();

    } catch (TemplateException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    } finally {

    if (out != null) {

    try {

    out.close();

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    }

    }

    调用方法:

    Map dataMap = new HashMap();

    dataMap.put("aaa", 111);

    dataMap.put("bbb", "ddd");

    dataMap.put("ccc", 33);

    createDoc(dataMap, "test.ftl", "d:\\test.doc");

    展开全文
  • 通过程序输出的word文档的格式是固定的,例如建立一个表格,将表格的标题写好,表格的内容使用不同的标记标好,设计好word后,将word文档另存为xml文件(注:只有word2003 以上的版本可以),使用xml工具打开文件,...

    1、原料

    开源jar包freemarker、eclipse、一份模板word文档

    2、首先设计模板word文档

    一般,通过程序输出的word文档的格式是固定的,例如建立一个表格,将表格的标题写好,表格的内容使用不同的标记标好,设计好word后,将word文档另存为xml文件(注:只有word2003 以上的版本可以),使用xml工具打开文件,将要输出到word的内容使用${XX}替换,保存后将文件直接改为tdl后缀

    3、使用eclipse编写程序

    1)获得一个Configuration实例,并为他设置字符集

    configuration = new Configuration();

    configuration.setDefaultEncoding("UTF-8");

    2)解析出word模板

    //获得类解析器,解析地址templatePath,该地址存放模板    我将模板放在该类的包下即/com/welv/this

    configuration.setClassForTemplateLoading(this.getClass(), templatePath);

    Template t = configuration.getTemplate(templateName);

    t.setEncoding("UTF-8");

    3) 将内容输出到word,并生成文件

    Write out = new OutputStreamWrite(new FileOutputStream("输出的地址"),"utf-8");

    //dataMap为map容器用于存放

    t.process(dataMap, out);

    out.close();

    展开全文
  • 如下代码可以实现使用Java的POI进行Word文档的解析并生成XML格式文档功能,此代码编译通过,但是运行有问题,读者可以亲自试试并能否改bug:import java.io.FileInputStream;import java.io.FileOutputStream;import...
  • Java POI 生成Word文档

    2017-10-28 13:54:46
    Java POI 生成Word文档,支持图片插入,关键是修改XML部分,本人已测试通过
  • Java通过FreeMarker.jar模板生成word文档 原理:通过word的另存为xml文件,将xml文件转成freemarker模板文件,然后通过freemarker.jar将数据填充至模板,然后生成doc文件
  • 一般,通过程序输出的word文档的格式是固定的,例如建立一个表格,将表格的标题写好,表格的内容使用不同的标记标好,设计好word后,将word文档另存为xml文件(注:只有word2003 以上的版本可以),使用xml工具打开...
  • 本文就将介绍如何使用Free Spire.Doc for JavaJava应用程序中创建Word文档,插入图片,并且设置段落的字体格式、对齐方式、段首缩进以及段落间距等。Jar包导入方法一:下载方法二:通过Maven仓库安装JAR包,配置...
  • java通过模板生成 word

    2014-04-02 18:09:43
    最近项目要导出world的报告, 在网上查阅了下相关资料。发现使用模板方式比较... 使用模板生成 word文档. 这里简单说下另存为后的xml模板(我使用的是word2007.) 如果存在图片,模板中会有类似这样语法 &lt;R...
  • JAVA通过模板生成DOC文档

    千次阅读 2016-12-02 16:54:52
    word文档另存为xml文件 接下来,上面写的拼音就起到作用了. 打开xml文件.搜索 要替换的内容. 改为 ${内容} 改完后,把文件的后缀名直接改成ftl。 代码: package com.hentor.apps.bestsign.util; import ...
  • JAVA通过模板生成DOCX文档

    千次阅读 热门讨论 2016-12-15 10:30:30
    大致流程: ...2.用winrar打开test_template.docx,取出word/document.xmlxml文件格式化一下看起来更清晰,并且把要替换的内容用freemarker的指令代替,最后将文件重命名为test.xml放在D盘下面
  • word替换原理:通过顺序查找word模板中的特殊字符标记,找到一个或多个就替换出响应的值,而表格的替换或者说生成是根据word中表格定义的序列来定位查找的,比如第一个表格的序列就是0,以此类推1,2,3...,所以...
  • 2.将word模板另存为xml文件(为了兼容,最好使用Word 2003 XML文档)3.替换标记。使用xml编辑工具(我用的NotePad++)打开该xml文件,将标记的部分改为${tagName},如上文的number改为${number}。注意:1.xml文件样式可能...
  • 利用FreeMarker模板生成word文档,其它格式文档同理,如pdf,txt,java,xml等等 需要向项目中加入freemarker的JAR文件,可以通过下面的链接获得Freemarker的最新版本: ...1、把要生成的模板文件填入freemarker...
  • 完美解决方案:Java生成复杂Word文档

    热门讨论 2011-07-18 19:31:06
    客户要求用程序生成标准的word文档,要能打印,而且不能变形,以前用过很多解决方案,都在客户严格要求下牺牲的无比惨烈。  POI读word文档还行,写文档实在不敢恭维,复杂的样式很难控制不提,想象一下一个20多页,...
  • 利用java通过freemarker模板文件生成带格式的word文档 最近做了个小项目,需要在线生成起诉状且带格式。做了个小工具分享给大家,也借鉴了网络上的东西,废话不多说,上干货 1.把需要生成固定格式的文件保存为word...
  • 把需要生成固定格式的文件保存为word文档(图1)2.把word另存为xml格式,并且格式化,好修改里面的东西3.修改好后保存,格式改为ftl模板下面代码:public final static String createWord(HttpServletResponse respons...
  • word替换原理:通过顺序查找word模板中的特殊字符标记,找到一个或多个就替换出响应的值,而表格的替换或者说生成是根据word中表格定义的序列来定位查找的,比如第一个表格的序列就是0,以此类推1,2,3...,所以...
  • word另存为xml,然后通过freemarker来生成文档,处理图片时,把图片转成base64码放入xml,但导出的word一直打不开。 各种分析后,通过文本比较工具发现原生含图片的word生成word,字符完全一样,但生成的...
  • 要利用freemarker生成word文档,首先需要创建word文档模板(即.doc文档),word模板中要动态生成的文字都使用占位符${string}代替,如下图 将word模板另存为xml文件 这里有一个坑,生成得xml文件...
  • 下面贴出生成图片的方法类,实际上是通过传入解析过的xml数据到这个工具类进行处理,并调用生成jfreechar的工具类生成。 import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; ...
  • 1、使用Open XML SDK的文档2、Nuget安装引用DocumentFormat.OpenXml1)使用Nuget界面管理器搜索"DocumentFormat.OpenXml",在列表中找到它,点击"安装"2)使用Package Manager命令安装PM> Install-Package ...
  • JavaGenWord-根据模板生成word文档

    热门讨论 2013-02-20 10:52:13
    通过模板和freemaker利用java语言生成对应的word文档。 其中模板来源:word模板,另存为xml文件,把需要替换的内容用${XX}形式替换。
  • 一、创建word文档模板 生成想要生成的word样式,保存为xml文件 2.修改为ftl文件,并用编辑器打开,将需要填入的地方用占位符表示 3.需要一些语法操作的地方,要使用ftl语法,具体参考ftl基础语法 这次用到了...
  • iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档和word文档的一个java类库。通过iText不仅可以生成PDF或rtf 的文档,而且可以将XML、Html文件转化为PDF文件。我们看下如何使用itext插入表格。要...
  • 了解libreoffice的朋友都知道,freemarker是用xml生成word文档,libreoffice打开这些文档会不兼容,会直接显示xml代码或排版差别很大,尤其是文档中包含一些复杂表格的时候 一开始的时候我用office的doc做模板,生成...
  • java实现的导出word文档

    万次阅读 2016-11-24 12:53:49
    需要先用office2013做一个word模板,就是你想要生成word的模板,保存为xml格式。然后在线格式化一下,这样生成的代码比较规范,然后将后缀修改为ftl,内容为一下格式:、 我使用的方法是通过Action跳转的方法来...
  • 后面两篇对导出做出来改进以及详细操作:第二篇: java通过模板生成docx(2)第三篇:java 导出word 利用freemarker指令更改xml 导出word docx文档 (3)本篇思路:通过模板导出word doc容易,网上资料很多,大概就是将...

空空如也

空空如也

1 2 3 4 5 6
收藏数 116
精华内容 46
关键字:

java通过xml生成word文档

java 订阅