`
FirstBlood
  • 浏览: 162131 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

使用Aspose.Words for Java完成复杂Word与PDF的导出

    博客分类:
  • java
阅读更多
使用Aspose.Words for Java完成复杂Word与PDF的导出

使用Aspose.Words for Java 可以导出复杂WORD PDF HTML 多种数据格式
官方下载地址:http://www.aspose.com/java/word-component.aspx
我所用的版本是Aspose.Words.jdk16.jar


先看效果图


1-对数据行的导出,分别是PDF与WORD格式










2-对类似于个人简历的数据导出带图片,分别是PDF与WORD格式








[size=large]
使用该组件一共分为4个步骤
1-定义模板
2-加载模板
3-填充数据
4-设置导出格式并导出
接下来我们按照以上4个步骤进行报表的导出

首先定义模板(可以再附件中下载)这里只介绍最后一个个人简历的模板
一个普通的自定义word就可以

«TableStart:Employees»
«TableEnd:Employees»
这一对标记代表一个数据单元 Employees 是可以自定义的 填充数据源时要对应上

其他的就好理解了 比如«FirstName» 就是数据源中的属性



接下来开始我们的导出之旅吧!!!!

第一步定义一个导出的抽象类
package com.epkj.words;

import org.springframework.stereotype.Component;

import com.aspose.words.Document;

@Component("ProcessWord")
public abstract class ProcessWord {

	public abstract Document execute(String templatePath) throws Exception;
	
}

第二部写一个具体的实现类
package com.epkj.words;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Component;

import com.aspose.words.Document;

/**
 * 带图片的导出
 */
@Component("EmployeesReportDemo")
public class EmployeesReportDemo extends ProcessWord {

	@Override
	public Document execute(String templatePath) throws Exception {
//1 读取模板
		Document doc = new Document(templatePath + "/" + "EmployeesReportDemo.doc");
		String imagePath = templatePath + "/" + "employees.jpg";
//2 填充数据源
		doc.getMailMerge().executeWithRegions(new MapMailMergeDataSource(getMapList(imagePath), "Employees"));
		return doc;
	}
	
	private List<Map<String, Object>> getMapList(String imagePath) throws IOException {
		List<Map<String, Object>> dataList = new ArrayList<Map<String,Object>>();
		
		//读取一个二进制图片
		FileInputStream fis = new FileInputStream(imagePath);
		byte[] image = new byte[fis.available()];
		fis.read(image);
		fis.close();
		
		for (int i = 0; i < 20; i++) {
			Map<String, Object> record = new HashMap<String, Object>();
//这里的key要与模板中的<<xxxxx>>对应
			record.put("FirstName", "欧阳");
			record.put("LastName", "夏丹");
			record.put("Title", "个人简历导出Word PDF");
			record.put("Address", "中国 北京市 东城区");
			record.put("City", "北京");
			record.put("Country", "辽宁沈阳");
			//二进制数据
			record.put("PhotoBLOB", image);
			dataList.add(record);
		}
		return dataList;
	}
	
}



!!!因为Aspose.Words for Java不支持HashMap的数据格式,需要我们自己实现
好在它提供了IMailMergeDataSource接口
package com.epkj.words;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.aspose.words.IMailMergeDataSource;

/**
 * 实现对HashMap的支持
 */
public class MapMailMergeDataSource implements IMailMergeDataSource {

	private List<Map<String, Object>> dataList;
	
	private int index;
	
	//word模板中的«TableStart:tableName»«TableEnd:tableName»对应
	private String tableName = null;
	
	/**
	 * @param dataList 数据集
	 * @param tableName 与模板中的Name对应
	 */
	public MapMailMergeDataSource(List<Map<String, Object>> dataList, String tableName) {
		this.dataList = dataList;
		this.tableName = tableName;
		index = -1;
	}
	
	/**
	 * @param data 单个数据集
	 * @param tableName 与模板中的Name对应
	 */
	public MapMailMergeDataSource(Map<String, Object> data, String tableName) {
		if(this.dataList == null) {
			this.dataList = new ArrayList<Map<String,Object>>();
			this.dataList.add(data);
		}
		this.tableName = tableName;
		index = -1;
	}
	
	/**
	 * 获取结果集总数
	 * @return
	 */
	private int getCount() {
		return this.dataList.size();
	}
	
	@Override
	public IMailMergeDataSource getChildDataSource(String arg0)
			throws Exception {
		return null;
	}

	@Override
	public String getTableName() throws Exception {
		return this.tableName;
	}

	/**
	 * 实现接口
	 * 获取当前index指向数据行的数据
	 * 将数据存入args数组中即可
	 * @return ***返回false则不绑定数据***
	 */
	@Override
	public boolean getValue(String key, Object[] args) throws Exception {
		if(index < 0 || index >= this.getCount()) {
            return false;
        }
		if(args != null && args.length > 0) {
			args[0] = this.dataList.get(index).get(key);
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 实现接口
	 * 判断是否还有下一条记录
	 */
	@Override
	public boolean moveNext() throws Exception {
		index += 1;
		if(index >= this.getCount())
        {
            return false;
        }
        return true;
	}

}



这样我们就把数据填充好了。接下来就是导出了
package com.epkj.words;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.aspose.words.Document;
import com.aspose.words.SaveFormat;

/**
 * 所有导出功能由该类完成
 */
@Controller
@RequestMapping("/DemoBaseController.do")
public class DemoBaseController {

	@RequestMapping(params = "method=exportDoc")
	public Object exportDoc(HttpServletRequest request, HttpServletResponse response) {
		
		ServletContext sc = request.getSession().getServletContext();
		
		//加载对应的模板
		String command = request.getParameter("command");
		
		//下载的文件名
		String docName = request.getParameter("docName");
		
		if(docName == null) {
			docName = System.currentTimeMillis() + "";
		}
		
		//返回到客户端的格式(DOC DOCX PDF)
		String formatType = request.getParameter("formatType");
		
		if(formatType == null) {
			formatType = "DOCX";
		}
		
		ProcessWord pw = getProcessWordByName(command, sc);
		
		try {
			Document doc = pw.execute(sc.getRealPath("/Designer"));
			sendToBrowser(doc, docName, formatType, true, response);
			response.flushBuffer();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		return null;
	}
	
	public WebApplicationContext getWebApplicationContext(ServletContext sc) {
		return WebApplicationContextUtils.getRequiredWebApplicationContext(sc);
	}
	
	private ProcessWord getProcessWordByName(String name, ServletContext sc) {
		return (ProcessWord) this.getWebApplicationContext(sc).getBean(name);
	}
	
	/**
	 * 向客户端发送数据
	 * @param doc com.aspose.words.Document
	 * @param docName 返回客户端的word文件名
	 * @param formatType DOC 或者 DOCX
	 * @param openNewWindow 在线打开或者下载
	 * @param response
	 * @throws Exception
	 */
	private void sendToBrowser(Document doc, String docName, String formatType,
			boolean openNewWindow, HttpServletResponse response)
			throws Exception {
		String extension = formatType;

		if (formatType.equals("WML") || formatType.equals("FOPC"))
			extension = "XML";

		String fileName = docName + "." + extension;

		if (openNewWindow)
			response.setHeader("content-disposition", "attachment; filename="
					+ fileName);
		else
			response.addHeader("content-disposition", "inline; filename="
					+ fileName);

		if ("DOC".equals(formatType)) {
			response.setContentType("application/msword");
			doc.save(response.getOutputStream(), SaveFormat.DOC);
		} else if ("DOCX".equals(formatType)) {
			response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
			doc.save(response.getOutputStream(), SaveFormat.DOCX);
		} else if ("PDF".equals(formatType)) {
			response.setContentType("application/pdf");
			doc.save(response.getOutputStream(), SaveFormat.PDF);
		} 
	}
	
}

[/size]


由于源码比较大 所以没办法上传,所以有需要的朋友可以留下邮箱 我发给大家
  • 大小: 87 KB
  • 大小: 139.1 KB
  • 大小: 79.8 KB
  • 大小: 121.9 KB
  • 大小: 39.9 KB
分享到:
评论
50 楼 jacana 2018-03-21  
774929815@qq.com


谢谢
49 楼 冬有暖阳 2018-01-19  
楼主,能把源码发给我一份吗?非常感谢!邮箱:799937753@qq.com  
48 楼 _Yggd 2017-07-20  
楼主,请问这个源码还在吗?在的话发我一份可以吗?非常感谢!邮箱:605053127@qq.com
47 楼 danStart 2017-06-29  
楼主,发一份给我,谢谢了。邮箱:1274608282@qq.com
46 楼 lzllzzl 2017-04-26  
L_Y_Sky 写道
楼主,可否还有这个的源码,可否发一份给我,谢谢。
manyayayang@163.com  

45 楼 lzllzzl 2017-04-21  
楼主能发下源码吗??772924852@qq.com
44 楼 L_Y_Sky 2017-04-18  
楼主,可否还有这个的源码,可否发一份给我,谢谢。
manyayayang@163.com  
43 楼 alafqq 2017-03-02  
楼主 还在吗???发一份给我,谢谢,
42 楼 hahaha6101 2017-01-12  
3095663251@qq.com 楼主还在么,麻烦发份源码 谢谢!!!!!
41 楼 yaoyu73100 2016-10-18  
楼主还在不,源码发一份谢谢 363027825@qq.com
40 楼 chenhaoming_8 2016-10-17  
343535819@qq.com
麻烦博主发一下源码 谢谢。
39 楼 儿歌丶Eason 2016-09-27  
18651018439@163.com
麻烦博主发一下源码 谢谢。
38 楼 贝塔ZQ 2016-09-27  
java实现复杂word导出,看看PageOffice插件吧,或许可以解决问题,官网上查查
37 楼 zhuguominglove 2016-07-19  
楼主谢谢了,给我发一份244536362@qq.com
36 楼 lBovinl 2016-06-22  
楼主,请问这个遇到过吗?Evaluation Only. Created with Aspose.Words. Copyright 2003-2014 Aspose Pty Ltd,如何解决呢?
35 楼 RebeccaZhong 2016-05-30  
RebeccaZhong 写道
楼主,源码麻烦发我一份,谢谢

zhongyanr@126.com
34 楼 RebeccaZhong 2016-05-30  
楼主,源码麻烦发我一份,谢谢
33 楼 lufazhi 2016-05-10  
楼主,求源码 53962071@qq.com  谢谢!!!!!
32 楼 q667393 2016-03-03  
command是什么
31 楼 涛l涛o心v情e 2016-03-01  
求源码 753095023@qq.com 谢谢

相关推荐

    使用Aspose.Words for Java完成复杂Word与PDF的导出Demo

    使用Aspose.Words for Java完成复杂Word与PDF的导出Demo使用Aspose.Words for Java完成复杂Word与PDF的导出Demo使用Aspose.Words for Java完成复杂Word与PDF的导出Demo

    Aspose.Words导出到word

    以下是一个简单的示例,演示如何使用Aspose.Words将现有Word文档导出为PDF: ```csharp using Aspose.Words; class Program { static void Main(string[] args) { // 加载Word文档 Document doc = new ...

    Aspose.Words通过模板导出pdf和word示例

    在这个示例中,我们关注的是如何利用Aspose.Words通过模板来导出PDF和Word文档。Aspose.Words提供了丰富的API,使得开发者能够方便地处理Word文档的各种需求,包括操作文本、表格、图像、页眉页脚以及邮件合并等功能...

    aspose-words-21.1-jdk17(去水印).jar

    使用Aspose.Words for Java完成复杂Word与PDF的导出Demo使用Aspose.Words for Java完成复杂Word与PDF的导出Demo使用Aspose.Words for Java完成复杂Word与PDF的导出Demo

    Aspose.Words 转图片后打印模糊 解决思路.zip

    Aspose.Words是一款强大的文档处理库,用于在.NET环境中操作Word文档,如创建、编辑、转换和打印等。在实际应用中,用户可能会遇到将Word文档转换为图片格式的需求,以便于网页展示或打印。然而,在进行这种转换后,...

    Aspose.Words 11.7 去水印版

    去除了“Evaluation Only. Created with Aspose.Words. Copyright 2003-2011 Aspose Pty Ltd.”水印 word,pdf等相互转换,相信对需要的朋友有帮组

    Aspose.Cells for Java Jar

    Aspose.Cells for Java不仅限于转换,还提供了其他功能,比如邮件合并、数据导入导出、PDF表单处理等,为Java开发者在处理Office文档时提供了全方位的支持。由于其强大的功能和灵活性,Aspose.Cells广泛应用于企业级...

    aspose-words.zip

    Aspose.Words是一款强大的文档处理库,主要用于在.NET、Java和其他多种平台上创建、编辑和转换Microsoft Word文档。这个“aspose-words.zip”压缩包很可能包含了Aspose.Words的资源和示例,特别是与XML相关的功能。...

    Aspose.Words For JAVA 2024.01 无水印版本,加载模板.docx

    Aspose.Words for Java 是一个强大的文档处理库,专门用于在Java环境中创建、编辑和操作Microsoft Word文档。这个工具允许开发者无需使用Microsoft Word本身就能处理DOCX格式的文件,极大地提高了自动化文档处理的...

    Aspose.words for java v13.12.0破解

    aspose,通过模板导出漂亮的word格式,并且可以直接转成pdf等其他格式。

    aspose-words的license和jar

    Aspose.Words是一款强大的文档处理库,主要用于在Java、.NET、Android等平台上进行Microsoft Word文档的操作。这个压缩包文件包含的"aspose-words"是该库的相关组件,主要功能在于无须安装Microsoft Office环境就能...

    Aspose.Words for Java 17.11

    Aspose.Words for Java 17.11是一款强大的文档处理库,专为Java开发者设计,使得在Java应用程序中创建、编辑、转换和呈现复杂的Microsoft Word文档变得简单易行。这款库提供了丰富的功能,使开发者无需依赖Microsoft...

    aspose-words所用jar包

    Aspose.Words是一款强大的Java库,专为处理Microsoft Word文档而设计。这个库允许开发者在不依赖Microsoft Office的情况下,进行创建、编辑、转换和显示DOC、DOCX、RTF、HTML等多种格式的文档。在本案例中,我们关注...

    java aspose文件转化-去水印(保证可用)

    `Doc2pdf.java`是一个示例代码文件,展示了如何使用Aspose.Words将Word文档转换为PDF。在Java程序中,你需要导入Aspose库,然后加载Word文档,创建一个PdfSaveOptions对象,设置相关选项,最后调用save方法,将Word...

    Aspose.Words例子

    Aspose.Words是一款强大的文档处理库,主要用于在.NET、Java和其他多种平台上创建、编辑和操作Microsoft Word文档。这个例子提供了一个基础的指南,适合初学者理解如何利用Aspose.Words来生成Word文档。 1. **...

    aspose-words-21.5.0-java.zip

    Word处理控件Aspose.Words for Java 最新版更新 ;word转pdf在实际工作中经常需要遇到,我在工作中最常见遇到的需求就是,不仅要导出word文档,还要可以预览word文档。对于这种需求最简单的方式,就是讲word转成pdf

    aspose-words-18.4-java.zip

    在Aspose.Words for Java 18.4中,这些文档可能详细介绍了各种方法、类和接口,以及如何使用它们来实现各种文档处理任务,如格式化文本、插入图像、创建复杂的表格、处理宏、合并文档等。 4. **license**:此文件...

    Aspose.Words.dll 最新版本

    使用Mail Merge功能,Aspose.Words可以与数据源(如数据库或CSV文件)结合,批量生成个性化文档。这对于批量报告、合同生成等场景非常实用。 5. **宏支持** 对于包含宏的Word文档,Aspose.Words可以读取、保存和...

Global site tag (gtag.js) - Google Analytics