JXLS生成Excel图表

2014-11-24 07:53:33 · 作者: · 浏览: 0

很多时候,项目会要求我们在导出的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
  
    staffs = new ArrayList
   
    (); 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
    
     > beanParams = new HashMap
     
      >(); 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,其他版本应该差距不大。< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICAgICAgICDS1MnPyvbEo7DlzqrA/aOsytfPyKOssNGz/c28se3N4rXExKOw5bWl1KomIzI2Njg0O8n6s8mz9sC0o6y94bn7yOfPwsv5yr6jujwvcD4KPHA+PGltZyBzcmM9"https://www.cppentry.com/upload_files/article/76/1_lasyc__.jpg" alt="\">

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

\

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

\

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

\

此时弹出如下弹出框:

\

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

\

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

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

\

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

\

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

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

\

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


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

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