很多时候,项目会要求我们在导出的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集成创建图表,目前暂未研究,如果有空,后面再补上。