3、进阶之Jxls2的公式使用

Jxls2
placeholder image
admin 发布于:2018-04-04 14:42:30
阅读:loading

基本介绍

本章节将引用公式计算来实现计算逻辑,很多时候我们都有需要使用到公式去做计算,虽然在得出一些个结果时可以有别的实现方案,但是使用Excel自带公式计算无疑使最好的一种,生成的导出文件中计算单元格中有按照计算公式填充的数据,同时也会有计算公式在里面,用户可以根据需要手工调整相关的参数去实现数据的重新计算。本示例涉及jxls2jx:each表达式函数,需要自行另外掌握。本示例围绕两个列表数据源的循环展开,同时在循环数据时提供某一字段按公式计算、循环完的合计计算、两个列表的总计计算。

参考代码

package cn.chendd.examples;

 

import java.io.File;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import java.math.BigDecimal;

import java.util.ArrayList;

import java.util.Calendar;

import java.util.Date;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

 

import org.jxls.common.Context;

import org.jxls.util.JxlsHelper;

 

import cn.chendd.examples.vo.Employee;

 

/**

 * 简单列表导出--带统计汇总

 * 循环List<Bean>List<Map>结构的集合

 * @author chendd

 */

public class SimpleEachSumJxls {

 

   public static void main(String[] args) throws Exception {

      //构造集合数据

      List<Employee> employees = new ArrayList<Employee>();

      Calendar time = Calendar.getInstance();

      time.set(2015, 5, 20);

      Date date = time.getTime();

      //------设置数据源一

      employees.add(new Employee("lishengle" , date , new BigDecimal(15000) , new BigDecimal(800)));

      employees.add(new Employee("jiajitao" , date , new BigDecimal(16000) , new BigDecimal(1000)));

      employees.add(new Employee("sunming" , date , new BigDecimal(17000) , new BigDecimal(1500)));

      //------设置数据源二

      List<Map<String , Object>> dataList = new ArrayList<Map<String , Object>>();

      Map<String , Object> map1 = new HashMap<String , Object>();

      map1.put("prop1""曹孟德");map1.put("prop2""");map1.put("prop3", 1800);map1.put("prop4", 180);

      Map<String , Object> map2 = new HashMap<String , Object>();

      map2.put("prop1""吴国太");map2.put("prop2""");map2.put("prop3", 2800);map2.put("prop4", 280);

      Map<String , Object> map3 = new HashMap<String , Object>();

      map3.put("prop1""大嘴");map3.put("prop2""");map3.put("prop3", 3800);map3.put("prop4", 380);

      dataList.add(map1);

      dataList.add(map2);

      dataList.add(map3);

      //载入模板

      InputStream is = SimpleEachSumJxls.class.getClass().getResourceAsStream("/cn/chendd/examples/templates/simpleEachSum.xls");

      Context context = new Context();

      context.putVar("employees", employees);

      context.putVar("title""员工信息列表");

      context.putVar("dataList", dataList);

      OutputStream os = new FileOutputStream(new File("d:\\test\\out_simpleEachSum.xls"));

      //指定Sheet文件解析

      JxlsHelper.getInstance().processTemplate(is, os, context);

      os.flush();

      os.close();

      is.close();

   }

 

}

 

public class Employee {

 

   private String name;

   private Date birthDate;

   private BigDecimal payment;

   private BigDecimal bonus;

  

   public Employee() {

      super();

   }

 

   public Employee(String name, Date birthDate, BigDecimal payment,

         BigDecimal bonus) {

      super();

      this.name = name;

      this.birthDate = birthDate;

      this.payment = payment;

      this.bonus = bonus;

   }

 

   //省略getter/setter

 

}

 

代码说明

上述代码中我们可以看出由后台设置了3个变量分别是“employees”、“title”、“dataList”,其中title是String类型的标题;employees和dataList是集合列表数据结构。

模板介绍

image.png

模板说明

上述模板中定义了4组公式计算,其中显示#VALUE!表示本格子是以计算后为数字的运算,但结果是字符串格式时显示的样式;金额统计和人数统计处则是使用的SUM单元格的区域的公式(单元格设置的有格式);,分别为ExcelSUMCOUNT函数;总金额与总人数则是将两个列表的汇总数据再累计到一起。

运行示例

image.png


image.png


image.png


image.png

运行说明

使用公式时同样可以使用Excel自带的函数,如上述使用到了ExcelSUMCOUNT函数,计算时同时也使用到了=D3*数字的公式。

相关下载

out_simpleEachSum.xls

本示例代码会在后文中提供。

 点赞


 发表评论

当前回复:作者

 评论列表


留言区