JXLS生成Excel图表

        很多时候,项目会要求我们在导出的Excel中显示图表,例如饼图、拆线图和柱状图,JXLS可以导出图表,不过显示,如果我的使用方法没错的话,使用JXLS导出柱状图会比较麻烦,或者说,比较不灵活。

        先看下面的Java代码:

/**
 * 
 */
package com.geloin.jxls.main;

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

import net.sf.jxls.transformer.XLSTransformer;

import com.geloin.jxls.beans.Staff;

/**
 * @author Geloin
 *
 */
public class ChartTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		List<Staff> staffs = new ArrayList<Staff>();
		
		Staff s1 = new Staff("张三", 6000D, 3000D);
		staffs.add(s1);
		
		Staff s2 = new Staff("李四", 5000D, 2000D);
		staffs.add(s2);
		
		Staff s3 = new Staff("王五", 4000D, 1000D);
		staffs.add(s3);
		
		String srcFilePath = "d:/work/proTmp/jxls/图表模板.xlsx";
		String destFilePath = "d:/work/proTmp/jxls/output/图表.xlsx";
		Map<String, List<Staff>> beanParams = new HashMap<String, List<Staff>>();
		beanParams.put("staffs", staffs);
		
		XLSTransformer former = new XLSTransformer();
		former.transformXLS(srcFilePath, beanParams, destFilePath);
	}

}

        Staff类的代码如下所示:

/**
 * 
 */
package com.geloin.jxls.beans;

/**
 * @author Geloin
 * 
 */
public class Staff {

	public Staff(String name, Double payment, Double bonus) {
		super();
		this.name = name;
		this.payment = payment;
		this.bonus = bonus;
	}

	/**
	 * 名称
	 */
	private String name;

	/**
	 * 薪资
	 */
	private Double payment;

	/**
	 * 年终奖
	 */
	private Double bonus;

	public String getName() {
		return name;
	}

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

	public Double getPayment() {
		return payment;
	}

	public void setPayment(Double payment) {
		this.payment = payment;
	}

	public Double getBonus() {
		return bonus;
	}

	public void setBonus(Double bonus) {
		this.bonus = bonus;
	}

}

        之所以要先把代码列出来,是因为在JXLS中有一个比较不灵活的步骤——你得先知道有几条数据,例如上文件中,List的size是多大,才能够达到生成图表的目的。

        先来看模板:



        老实说,我在生成模板这一关困了相当久,最后是分析官方给的Excel模板才知道怎么做的,这边还是把我做模板的过程描述一下以供参考,我用的是office2010,其他版本应该差距不大

        以上述模板为例,首先,把除图表外的模板单元格生成出来,结果如下所示:


        第二步,点击插入-->柱形图-->选择一个图表(当然,要生成饼图等也类似),如下图所示:


        现在Excel中有了一个空白图表,如下图所示:


        第三步,右键点击空白图表,选择“选择数据”:


        此时弹出如下弹出框:


        点击上图中的添加,在下图的弹出框中,系列名称选择B1单元格,即汉字薪资,系列值选择B2、B3、B4:


        这是我们要说明的地方:为什么系列名称要选择B1?——名称嘛,不是数据,选择一个汉字所在单元格就行了,只要能够通过名称知道系列值是什么内容就行。为什么系列值要选择B2、B3、B4?——因为上文代码中提供的List<Staff>的size为3,而我们可以预见,根据模板生成的数据中,payment的值肯定会被放到B2、B3、B4里面,嗯,我就是一直卡在这一步的。

        上一步操作完成后,点击确定,返回选择数据源弹出框,接下来,点击下图中的编辑按钮:


        在弹出的“轴标签”弹出框中,选择A2、A3、A4,理由嘛,跟payment一样:


        点击确定后完成模板,不出意外的话,该模板与我上文中提到的模板是一样的。

        模板做完了,接着直接运行ChartTest,得到如下结果:


        注:好像小计有点问题,不过并不影响此文章的主题,只需要将模板改成如下即可:


        加一个//staffs,表示per staff。

        据说为了更加方便,避免JXLS的灵活性问题,可以使用JXLS+POI集成创建图表,目前暂未研究,如果有空,后面再补上。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值