`
uule
  • 浏览: 6357909 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

JAVA生成WORD工具类

 
阅读更多

该方法借助freemarker的JAR包即可。

参考:

使用freemarker生成word

Java Web项目中使用Freemarker生成Word文档(带图片)

Java使用freemark生成word

 

WordXML格式初步分析

doc模板说明文档 

 

所需工具:

JS/HTML格式化工具

 

步骤:

1、在word中编辑好模版样式,设置好占位符,注意图片最好先黏上去



 

 

2、在word中,文件-另存为-XML格式

 

3、使用工具格式化上图的XML文件

a.在表格数据的TR中加入<#list myListData as tmp> 和</#list>

b.将XML文件中图片的BASE64转换为相应的占位符

 

4、在Eclipse中新建文件teample-pic.ftl,将XML的数据粘贴进去

 

5、使用工具类WordUtil.java生成word文件

 

代码:

package com.test;

import java.io.BufferedWriter;
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.util.Map;

import sun.misc.BASE64Encoder;
import freemarker.template.Configuration;
import freemarker.template.Template;

public class WordUtil {

	/**
	 * @param dataMap
	 *            word中需要展示的动态数据,用map集合来保存
	 * @param templateName
	 *            word模板名称,例如:teample.ftl
	 * @param filePath
	 *            文件生成的目标路径,例如:D:/
	 * @param fileName
	 *            生成的文件名称
	 */
	@SuppressWarnings("unchecked")
	public static void createWord(Map dataMap, String templateName,
			String filePath, String fileName) {
		try {
			// 创建配置实例
			Configuration configuration = new Configuration();

			// 设置编码
			configuration.setDefaultEncoding("UTF-8");

			// ftl模板文件
			configuration.setClassForTemplateLoading(WordUtil.class,
					"/com/test/");

			// 获取模板
			Template template = configuration.getTemplate(templateName);

			// 输出文件
			File outFile = new File(filePath + File.separator + fileName);

			// 如果输出目标文件夹不存在,则创建
			if (!outFile.getParentFile().exists()) {
				outFile.getParentFile().mkdirs();
			}

			// 将模板和数据模型合并生成文件
			Writer out = new BufferedWriter(new OutputStreamWriter(
					new FileOutputStream(outFile), "UTF-8"));

			// 生成文件
			template.process(dataMap, out);

			// 关闭流
			out.flush();
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	
	
	/**
	 * 将图片转换为BASE64为字符串
	 * @param filename
	 * @return
	 * @throws IOException
	 */
	public static String getImageString(String filename) throws IOException {  
        InputStream in = null;  
        byte[] data = null;  
        try {  
            in = new FileInputStream(filename);  
            data = new byte[in.available()];  
            in.read(data);  
            in.close();  
        } catch (IOException e) {  
            throw e;  
        } finally {  
            if(in != null) in.close();  
        }  
        BASE64Encoder encoder = new BASE64Encoder();  
        return data != null ? encoder.encode(data) : "";  
   } 

}

 

package com.test;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TestJava2Word {

	public static void main(String[] args) throws IOException {
		createWord();
		//String BASE64 = WordUtil.getImageString("D://doc//friend.jpg");
		//System.out.println(BASE64);
	}
	
	public static void createWord() {
        Map<String, Object> dataMap = new HashMap<String, Object>();
        
        /** 组装数据 */
        dataMap.put("username","张三");
        dataMap.put("address","深圳市南山区西丽镇");
        dataMap.put("num", Math.floor(Math.random()*10));
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
        dataMap.put("date",sdf.format(new Date()));        
        dataMap.put("content","华语天王周杰伦在北京召开周杰伦战略发布会。在发布会上,推出时尚与专业结合的:引起了广泛的关注和讨论。现在终于正式与大家见面,天猫、官网同时上线,首卖期间还有好礼相赠!买就送,就是这么任性!");
        
        List<Map<String, Object>> newsList=new ArrayList<Map<String,Object>>();
        for(int i=1;i<=10;i++){
         Map<String, Object> map=new HashMap<String, Object>();
         map.put("name", "王"+i);
         map.put("tel", "137"+i);
         map.put("age", "年龄"+i);
         map.put("address", System.currentTimeMillis());
         newsList.add(map);
        }
        dataMap.put("myListData",newsList);
        
        String myPic = "";
        String myPic2 = "";
        try {
			 myPic = WordUtil.getImageString("D://doc//ganen.jpg");
			 myPic2 = WordUtil.getImageString("D://doc//friend.jpg");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
       
        dataMap.put("myPic", myPic);
        dataMap.put("myPic2", myPic2);
                
        //文件路径
        String filePath= "D://doc";
        
        //文件名称
        String fileName = System.currentTimeMillis()+".doc";
        
        /** 生成word */
        WordUtil.createWord(dataMap, "teample-pic.ftl", filePath, fileName);
    }
	
	
}


 

模版文件:

teample.ftl等见附件。

 

 

注意两个问题:

1、如果图片是网络图片时,getImageString() 方法中不可使用本地new FileInputStream处理图片,应该使用new URL()获取链接,然后openConnection(),最后connection.getInputStream()获取流

 

2、InputStream流转Byte[]时,使用new byte[in.available]可能会有问题,推荐使用IOUtils.toByteArray(in) 转换为byte数组


java中InputStream转化为byte[]数组

 在commons-io包中org.apache.commons.io.IOUtils类的toByteArray(InputStream input)已经有实现了,我们可以参考下思路,完成我们的方法,我们可以用类似下面的代码实现inputStream转化为byte[]数组

public static byte[] toByteArray(InputStream input) throws IOException {
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    byte[] buffer = new byte[4096];
    int n = 0;
    while (-1 != (n = input.read(buffer))) {
        output.write(buffer, 0, n);
    }
    return output.toByteArray();
}

 

下面是IOUtils中摘录出与toByteArray相关的方法

org.apache.commons.io.IOUtils.toByteArray

方法如下:
public static byte[] toByteArray(InputStream input)
  throws IOException
{
  ByteArrayOutputStream output = new ByteArrayOutputStream();
  copy(input, output);
  return output.toByteArray();
}

public static int copy(InputStream input, OutputStream output)
  throws IOException
{
  long count = copyLarge(input, output);
  if (count > 2147483647L) {
    return -1;
  }
  return (int)count;
}

public static long copyLarge(InputStream input, OutputStream output)
  throws IOException
{
  byte[] buffer = new byte[4096];
  long count = 0L;
  int n = 0;
  while (-1 != (n = input.read(buffer))) {
    output.write(buffer, 0, n);
    count += n;
  }
  return count;
}

 。。。

 

 

 

  • 大小: 100.2 KB
分享到:
评论
1 楼 18335864773 2019-04-16  
推荐用 pageoffice 组件生成 word 文件。

相关推荐

    java操作word文件工具类级dell文件

    Java操作Word文件主要涉及到的是对Microsoft Office文档的处理,这在很多企业级应用中非常常见,比如自动化报告生成、数据导入导出等。在Java中,由于Java本身并不直接支持与Windows API交互,因此需要借助第三方库...

    Java通过word模板配置书签生成word

    "Java通过word模板配置书签生成word"是一个技术方案,它利用了Java的API来处理Microsoft Word文档,特别是Apache POI库,这是一种强大的工具,允许开发者在Java程序中创建、修改和展示MS Office格式的文件。...

    aspose-17.8 Java 生成 pdf 工具类

    在本篇内容中,我们将聚焦于"Aspose-17.8 Java 生成PDF工具类",了解如何利用Aspose库在Java环境中创建PDF文件。 首先,`aspose.pdf-17.8.jar`是Aspose.Pdf组件的核心库,它允许开发者在Java应用中创建、操作和转换...

    java生成word插入图片工具类

    java 利用iText生成word,word中插入图片工具类,自己封装的一个类,有疑问欢迎交流!

    java生成word文件代码

    java中生成word文件,生成固定文件模板的word文件 封装成工具类,可以更方便的实现需求

    java生成word模板详解

    Java生成Word模板是一种常见的技术,尤其在企业级应用中,用于自动生成报告、合同或任何需要格式化的文本文档。这个技术通常涉及到Java的IO流处理、模板引擎以及可能的库如Apache POI或OpenOffice API。 Apache POI...

    java POI生成word.zip

    在本案例中,"java POI生成word.zip"是一个压缩包,包含使用Java POI库生成Word文档的示例代码。以下是基于这个主题的相关知识点: 1. **Java POI库介绍** - Java POI 是一套API,用于处理Microsoft Office格式的...

    aspose生成word、转pdf的java工具类

    2. **Java生成Word**:Aspose.Words for Java是Aspose库的一部分,它允许开发者通过编程方式创建、修改和操作Microsoft Word文档。你可以创建新的文档,插入文本、图片、表格,应用样式,执行复杂的排版任务,以及...

    Java 生成word所需要包(完全,已经测试可用)

    Java生成Word文档是常见的需求,尤其在自动化报告、数据导出或者系统集成中。iText是一个流行的开源Java库,用于创建和修改PDF和RTF文件。在这个压缩包中,我们有iText 2.7.1,iText rtf 2.7.1以及iTextAsian,这些...

    java利用工具生成word文档

    在Java编程环境中,生成Word文档是一项常见的需求,特别是在数据报告、文档自动化或者系统集成的场景中。本篇文章将深入探讨如何使用iText这个强大的库来创建和操作Microsoft Word(.doc或.docx)文档。 首先,我们...

    java代码实现填充word模板生成word合同的实例

    本实例将探讨如何使用Java代码实现填充Word模板并生成Word合同。 首先,我们需要理解Apache POI库。Apache POI是Java平台上的一个开源项目,它允许Java应用程序读取、写入和修改Microsoft Office格式的文件,包括...

    用java生成word文档方法

    ### Apache POI:Java生成Word文档的标准工具 Apache POI是Apache软件基金会的一个开源项目,它提供了一系列的API,用于处理Microsoft Office格式的文件,包括Excel、PowerPoint和Word。对于Word文档的处理,主要...

    java调用PageOffice生成word

    Java调用PageOffice生成Word是一项常见的技术应用,主要用于在服务器端动态创建和编辑Microsoft Office文档。PageOffice是一款专为Java设计的Office文档处理组件,它提供了丰富的API接口,使得开发者可以方便地在...

    java动态生成word文件Demo

    总之,这个"java动态生成word文件Demo"为开发者提供了一个实用的工具,不仅能够方便地生成Word文件,还支持集成二维码,增加了文件的信息化程度。学习并运用这个Demo,有助于提升你在处理类似任务时的效率和质量。

    java生成rtf文档,跟word文档差不多

    Word文档通常使用Microsoft Office套件或者OpenOffice、LibreOffice等开源工具直接编辑,而Java生成的RTF文档则是通过编程实现,适合自动化和批量处理。 在Java中,除了使用特定库如`srw.jar`外,还可以使用Apache ...

    java生成word例子,直接导入eclipse可用

    Java生成Word文档是一种常见的需求,尤其在数据报告、合同生成或者自动化办公场景中。这个例子提供了直接在Eclipse环境中运行的代码,可以帮助开发者快速理解和实现这一功能。下面将详细介绍Java如何操作Word,并...

Global site tag (gtag.js) - Google Analytics