很多时候,项目会要求我们在导出的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); } }
/** * */ 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; } }
先来看模板:
老实说,我在生成模板这一关困了相当久,最后是分析官方给的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集成创建图表,目前暂未研究,如果有空,后面再补上。