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

使用Aspose.Cells for java完成复杂Excel报表导出

    博客分类:
  • java
 
阅读更多

使用Aspose.cells for java 完成对复杂EXCEL的导出功能


使用Aspose.cells导出Excel非常方便,而且可以自定义EXCEL样式.
官方下载地址:http://www.aspose.com/java/excel-component.aspx

我使用的是最新版本的7.4.3
需要jar包如下
aspose-cells-7.4.3.jar
bcprov-jdk16-146.jar
dom4j-1.6.1.jar
stax2-api-3.0.2.jar
woodstox-core-asl-4.1.1.jar

第一步需要自定义模板

定义模板



excel样式完全自定义,比用程序直接生成excel要方便.
在固定的位置使用 &=Person.name(bean)占位即可



导出后




1定义实体类,用来填充模板
package com.epkj.bean;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 该实体类用于填充excel模板
 */
public class Person {

	private String name;
	
	private Date birthday;
	
	private int age;
	
	private double salary;

	private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
	
	public Person() {}
	
	public Person(String name, Date birthday, int age, double salary) {
		super();
		this.name = name;
		this.birthday = birthday;
		this.age = age;
		this.salary = salary;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	/**
	 * 值得注意的是 
	 * 由于不知道怎么在Aspose框架上处理导出时间格式的问题
	 * 只好在这里处理了,算是一个变通的解决方案吧
	 */
	public String getBirthday() {
		return format.format(birthday);
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public double getSalary() {
		return salary;
	}

	public void setSalary(double salary) {
		this.salary = salary;
	}
}


package com.epkj.bean;

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

public class InitData {

	public static List<Person> getPersons() {
		List<Person> persons = new ArrayList<Person>();
		persons.add(new Person("张三", new Date(), 25, 4022.34));
		persons.add(new Person("李四", new Date(), 56, 3580.3));
		persons.add(new Person("王宇", new Date(), 45, 5454.34));
		persons.add(new Person("小强", new Date(), 57, 5876.24));
		persons.add(new Person("微微", new Date(), 54, 4022.68));
		persons.add(new Person("丽丽", new Date(), 12, 5878.12));
		persons.add(new Person("张娜", new Date(), 37, 5454.00));
		persons.add(new Person("王华", new Date(), 60, 2221));
		persons.add(new Person("阿超", new Date(), 55, 4587));
		persons.add(new Person("黑子", new Date(), 22, 9788));
		persons.add(new Person("小王", new Date(), 37, 2212.24));
		persons.add(new Person("剌剌", new Date(), 27, 8785.24));
		persons.add(new Person("荷花", new Date(), 18, 5454.34));
		return persons;
	}
	
	public static Map<String, Object> getHashMap() {
		Map<String, Object> data = new HashMap<String, Object>();
		data.put("name", "张三");
		data.put("age", 35);
		data.put("birthday", "1985-01-03");
		data.put("address", "辽宁沈阳");
		data.put("phone", "13988888888");
		return data;
	}
}




package com.epkj.cells;

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

import com.aspose.cells.Workbook;

/**
 * 自定义模板导出基类
 */
public abstract class DemoBase {

	protected abstract Workbook createReport(HttpServletRequest request) throws Exception;
	
	/**
	 * 设置HTTP响应头
	 * @param response 
	 * @param fileName
	 * @param formatSuffix
	 */
    protected void setResponseHeader(HttpServletResponse response, String fileName, String formatSuffix) {
        String contentType = "application/vnd.ms-excel";
        formatSuffix = formatSuffix.toLowerCase();
        if(formatSuffix.endsWith(".xlsx")
		        || formatSuffix.endsWith(".xlsb")
		        || formatSuffix.endsWith(".xlsm")
		        || formatSuffix.endsWith(".xltm")
		        || formatSuffix.endsWith(".xltx")) {
            contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        }
        response.setContentType(contentType);
        response.addHeader("content-disposition", "inline;filename=" + fileName);
    }
    
    /**
     * 向客户端返回excel
     * @param request
     * @param response
     * @param wb
     * @throws Exception
     */
    protected void sendReport(HttpServletRequest request,
			HttpServletResponse response, Workbook wb) throws Exception {
		wb.save(response.getOutputStream(), wb.getFileFormat());
	}
}



package com.epkj.cells;

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 com.aspose.cells.Workbook;
import com.aspose.cells.WorkbookDesigner;
import com.epkj.bean.InitData;

/**
 * 根据自定义的Excel模板进行导出
 */
@Controller
@RequestMapping("/SmartMarkerController.do")
public class SmartMarkerController extends DemoBase {
	
	//存放Excel模板的位置
	private static final String TEMPLATE_FILE_PATH_PART = "/Designer/SmartMarkerDesigner.xls";

	/**
	 * 对客户端开发的方法
	 */
	@RequestMapping(params = "method=getReport")
	public Object getReport(HttpServletRequest request,
			HttpServletResponse response) {
		try {
			//创建工作薄
			Workbook wb = createReport(request);
			//设置输出响应头
            setResponseHeader(response, "SmartMarker.xls", ".xlsx");
            //向客户端输出
            sendReport(request, response, wb);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 向自定义模板中填充数据
	 */
	protected Workbook createReport(HttpServletRequest request) throws Exception {
		
		ServletContext sc = request.getSession().getServletContext();
        String template_file_path = sc.getRealPath(TEMPLATE_FILE_PATH_PART);
        
        //创建工作薄加载模板(SmartMarkerDesigner.xls)
		Workbook wb = new Workbook(template_file_path);
		createSmart(wb);
		
		return wb;
	}
	
	private static void createSmart(Workbook wb) throws Exception {
		WorkbookDesigner designer = new WorkbookDesigner();
		designer.setWorkbook(wb);
		designer.setDataSource("Person", InitData.getPersons());
		//这个框架默认不支持HashMap(查了好多资料都没找到直接支持的方法)
		//所以我实现了ICellsDataTable接口 使其可以支持HashMap
		//designer.setDataSource("Map", new HashMapDataTable(InitData.getHashMap()));
		designer.process(true);
	}
	
}



实现ICellsDataTable接口,支持HashMap

package com.epkj.cells;

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

import com.aspose.cells.ICellsDataTable;

/**
 * 实现ICellsDataTable接口
 * 以便支持对HashMap的支持
 */
public class HashMapDataTable implements ICellsDataTable {

	//数据集合
	private List<Map<String, Object>> dataList = null;
	
	//索引
	private int index;
	
	//存放dataList当中Map<String, Object>的key
	private String[] columns = null;

	public HashMapDataTable(Map<String, Object> data) {
		if(this.dataList == null) {
			this.dataList = new ArrayList<Map<String,Object>>();
		}
		dataList.add(data);
	}
	
	public HashMapDataTable(List<Map<String, Object>> data) {
		this.dataList = data;
	}
	
	/**
	 * 初始化方法
	 */
	@Override
	public void beforeFirst() {
		index = -1;
		columns = this.getColumns();
	}

	/**
	 * WorkbookDesigner自动调用
	 * 会将this.getColumns()方法所返回的列 按照顺序调用改方法
	 */
	@Override
	public Object get(int columnIndex) {
		if(index < 0 || index >= this.getCount()) {
            return null;
        }
		Map<String, Object> record = this.dataList.get(index);
		String columnName = this.columns[columnIndex];
		return record.get(columnName);
	}

	/**
	 * 根据columnName返回数据
	 */
	@Override
	public Object get(String columnName) {
		Map<String, Object> record = this.dataList.get(index);
		return record.get(columnName);
	}

	/**
	 * 获得列集合
	 */
	@Override
	public String[] getColumns() {
		Map<String, Object> temp = this.dataList.get(0);
		Set<Entry<String, Object>> entrys = temp.entrySet();
		List<String> columns = new ArrayList<String>();
		for (Entry<String, Object> e : entrys) {
			columns.add(e.getKey());
		}
		String[] s = new String[entrys.size()];
		columns.toArray(s);
		return s;
	}

	@Override
	public int getCount() {
		return this.dataList.size();
	}

	@Override
	public boolean next() {
		index += 1;
		if(index >= this.getCount())
        {
            return false;
        }
        return true;
	}

}

  • 大小: 133.8 KB
  • 大小: 199.5 KB
分享到:
评论
3 楼 FirstBlood 2014-10-14  
hechaoanddingna 写道
可以传个aspose-cells-7.4.3.jar 包的吗?谢谢541597214@qq.com

官网就有 建议你下个最新的8.几的
2 楼 hechaoanddingna 2014-10-14  
可以传个aspose-cells-7.4.3.jar 包的吗?谢谢541597214@qq.com
1 楼 dbvqht 2013-05-14  
该软件好像是收费注册的,用起来可能有些不变,不过可以学习一下

相关推荐

    Aspose.Cells for Java Jar

    【Aspose.Cells for Java Jar】是一款强大的Java库,专门用于处理Microsoft Office文件格式,特别是Excel和Word文档。这款工具能够帮助开发者实现文件格式之间的转换,例如将Excel工作簿(.xlsx)转换为PDF文档,...

    Aspose.Cells7.0.4.6

    Aspose.Cells是一款强大的编程库,专门用于处理电子表格文件,如Microsoft Excel的XLS、XLSX、CSV、HTML等多种格式。...无论是在报表生成、数据分析还是数据迁移的场景下,Aspose.Cells都能成为开发者不可或缺的利器。

    Aspose-Cells-8.5.2.jar附带文档说明

    在实际项目中,开发者可以利用Aspose.Cells的API,结合Java编程,构建出强大的Excel处理工具,如数据导入导出、报表生成、数据分析等。例如,一个电商系统可能需要将销售数据导出为格式化的Excel文件,或者根据模板...

    aspose-words-21.11 aspose-cells-21.11 无水印jar以及使用说明

    总之,Aspose.Words和Aspose.Cells是强大且功能丰富的Java库,能够帮助开发者高效地处理Word文档和Excel表格,而无水印jar文件则提供了无限制的商业使用体验。配合详细的使用说明,可以快速地将这些功能集成到你的...

    aspose的导出 和合并 和设置单元格样式

    综上所述,Aspose.Cells是一个强大的工具,可以帮助开发者高效地处理Excel文件,无论是创建新的文件、合并单元格还是设置复杂的样式,都能轻松应对。在实际项目中,结合Aspose的这些功能,可以极大地提升开发效率和...

    Aspose.Cells8.9.2 201608版无限制

    2. **公式和函数支持**:Aspose.Cells能够处理Excel中的各种公式和内置函数,允许在程序中进行复杂的计算和数据分析。 3. **样式和格式设置**:允许自定义单元格、行、列的样式,包括字体、颜色、边框、填充、对齐...

    aspose,cells,slides,words.zip

    Aspose 是一个强大的Java库,它提供了多种API,如Aspose.Cells、Aspose.Slides和Aspose.Words,用于处理各种文件格式,包括Excel工作簿、PowerPoint演示文稿和Word文档。这些API允许开发者在没有安装Microsoft ...

    Aspose.Cells API 中文版文档.zip

    总之,Aspose.Cells API为Java开发者提供了强大且全面的电子表格处理能力,无论是简单的数据导入导出,还是复杂的报表生成和数据分析,都能得心应手。通过深入学习和实践,开发者可以充分利用这个工具提高工作效率,...

    java中读取Excel例子

    在Java编程环境中,处理Excel文件是一项常见的任务,特别是在数据分析、报表生成或数据导入导出等场景下。本文将深入探讨如何使用Java来读取和写入Excel文件,以"java中读取Excel例子"为例,结合提供的文件...

    Aspose无需模板导出Excel带Chart

    在描述中提到的“无需模板,导出Excel带chart图表”,意味着开发者可以使用Aspose.Cells API动态创建和编辑Excel文件,包括添加各种类型的图表,如柱状图、饼图、折线图等,而无需预先设计模板。这样可以极大地提高...

    aspose.jar包java api合集

    2. **Aspose.Cells for Java** Aspose.Cells专注于处理Excel工作簿。它允许开发者创建、读取和修改XLS、XLSX、CSV、ODS、XLTM等格式的电子表格。通过Aspose.Cells,你可以操作单元格、公式、图表、数据透视表、图像...

    aspose-cells-19.2.rar

    【标题】"aspose-cells-19.2.rar" 提供的是Aspose.Cells的19.2版本,这是一个强大的Java库,专用于处理Excel电子表格。Aspose.Cells允许开发者在Java应用程序中创建、编辑、格式化和转换Excel工作簿,而无需依赖...

    aspose cells

    1. **创建和编辑电子表格**:使用Aspose.Cells,开发者可以创建全新的Excel工作簿,添加工作表,设置单元格值,调整样式,插入公式,以及应用各种复杂的格式设置。 2. **读取和解析Excel文件**:组件支持读取多种...

    aspose-words-15.8.0.jar和aspose-cells-8.2.1.jar

    除此之外,它还允许你在程序中实现Excel报表的生成,进行数据导出、导入,以及将Excel文件转换为其他格式,如CSV、PDF或HTML。 在实际开发中,这两个库的应用场景非常广泛。比如,在企业级应用中,可以用来自动化...

    aspose-cells-9.0.0 - aspose-pdf-11.8.0

    使用这个库,开发者可以方便地在应用程序中生成报表、数据分析、数据导入导出等功能,同时支持复杂的公式计算和图表操作。 Aspose.Pdf则是处理PDF文档的API,版本11.8.0同样可能引入了一些新特性、性能优化和错误...

    Aspose.cell使用Demo

    Aspose.Cells是一款强大的商业组件,用于处理Microsoft Excel文件,无需依赖Excel应用程序即可在.NET、Java、Android、iOS等平台上操作Excel工作簿。本Demo将详细介绍如何使用Aspose.Cells进行各种Excel操作,包括...

    Aspose转pdf相关jar

    3. **Aspose.Cells**:Aspose.Cells专注于处理Excel工作簿文件,支持XLS、XLSX、CSV等格式。9.0.0版本提供了对电子表格的强大操作,包括公式计算、数据导入导出、图表处理等。该库可以将Excel表格转换为PDF格式,...

    导出数据库数据

    对于数据库数据的导出,Aspose.Cells允许开发者将数据库查询结果直接转换为Excel格式,方便进一步的数据分析或报表生成。 要将数据从数据库导出到Excel,首先需要连接到数据库。在C#或Java等编程语言中,可以使用...

    Aspose.Total for JasperReports试用版:一款多功能的文档管理控件,帮助JasperReports报表开发人员导出Ja

    Aspose.Total for ...Aspose.Total for JasperReports是一款多功能的文档管理控件,帮助JasperReports报表开发人员导出JasperReports报表为Wrod、Excel、PPT和PDF文档,而且可以添加条码功能到导出的文档里。

Global site tag (gtag.js) - Google Analytics