11、进阶之Jxls2的自定义函数

http://www.chendd.cn/information/viewInformation/other/234.a

本章节将在导出逻辑中演示使用Jxls2时在模板中使用自定义的函数来处理相关逻辑。自定义函数的功能是我认为这是Jxls2的最出色的亮点了,当然了有些人不知道它能替我们做什么,比如我们可以将后台返回的数据进行格式化,常常是将日期类型、金额类型格式化;将一些格子按其值的大小显示不同的背景及颜色;特殊逻辑的值的解析;单元格的特殊处理;单元格合并等等等等,为什么它可以做这么多失去了,实际上最最核心的还是它的自定义函数的解析,在link章节我已经提到了,它可以让一个普通的单元格转换成Poi的Cell单元格(就是这个特点我们可以非常简单的进行特殊逻辑的实现),我们使用Poi的Api去*作相对应的单元格,实现各种各样的效果。本示例章节主要实现单元格根据文本值显示文本颜色及背景色、格式化金额数字、单元格显示下拉框、自定义逻辑去两个数中的大数、自定义超链接(这个超链接非util中的调用方式)……等。

Java代码参考为:

package cn.chendd.examples;



import java.io.File;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;



import org.jxls.area.Area;

import org.jxls.builder.AreaBuilder;

import org.jxls.builder.xls.XlsCommentAreaBuilder;

import org.jxls.common.CellRef;

import org.jxls.common.Context;

import org.jxls.expression.JexlExpressionEvaluator;

import org.jxls.transform.Transformer;

import org.jxls.transform.poi.WritableCellValue;

import org.jxls.transform.poi.WritableHyperlink;

import org.jxls.util.TransformerFactory;



import cn.chendd.examples.custom.functions.ColorCellValue;

import cn.chendd.examples.custom.functions.DropdownCellValue;

import cn.chendd.examples.vo.User;



/**

 * 自定义function

 */

public class SimpleCustomFunctionJxls {



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

     

      //模板文件

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

      Context context = new Context();

      //设置参数变量

      context.putVar("x", 10);

      context.putVar("y", 5);

      //设置绑定集合

      List dataList = new ArrayList();

      dataList.add(new User("zhangchunhua" , "女" , 120D));

      dataList.add(new User("zhouyu" , "男" , 100D));

      dataList.add(new User("sunce" , "男" , 110D));

      dataList.add(new User("machao" , "男" , 130D));

      dataList.add(new User("caifuren" , "女" , 120D));

      dataList.add(new User("zuoci" , "保密" , 150D));

      context.putVar("dataList", dataList);

     

      Map myFunction = new HashMap();

      myFunction.put("my", new SimpleCustomFunctionJxls());

     

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

      Transformer trans = TransformerFactory.createTransformer(is, os);

      JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) trans.getTransformationConfig().getExpressionEvaluator();

      evaluator.getJexlEngine().setFunctions(myFunction);

      //载入模板、处理导出

      AreaBuilder areaBuilder = new XlsCommentAreaBuilder(trans);

      List areaList = areaBuilder.build();

      areaList.get(0).applyAt(new CellRef("Hello!A1"), context);

      trans.write();

      //释放资源

      os.flush();

      os.close();

      is.close();

     

   }

  

   //返回大的数

   public Integer max(Integer x , Integer y){

      return x > y ? x : y;

   }

  

   //给金额前面显示个货币符号

   public Object formatMoney(Object a){

      Object result = null;

      if(a != null){

         return "¥" + a;

      }

      return result;

   }

  

   //超链接

   public WritableCellValue myHyperlink(String address, String title) {

      return new WritableHyperlink(address, title);

   }

  

   //按值显示背景色

   public WritableCellValue showColor(Integer value) {

      return new ColorCellValue(value);

   }

  

   //生成下拉菜单

   public WritableCellValue downlist(String splitItem , String value){

      return new DropdownCellValue(splitItem, value);

   }

  

}

代码说明

代码中设置了解析自定义的函数类为本身,相关的public方法即为支持自定义调用的方法,参数均为模板文件进行传递,如上所定义的相关函数分别为:max比大小取大数、格式化金额加¥、超链接、根据值显示文本、根据值生成下拉框,至于其它关联的类后文中专门提供下载。

模板参考为:

blob.png

模板说明

模板中x、y为直接显示的变量,dataList为集合类型使用each循环显示。

运行示例为:

blob.png

运行说明

示例分别显示了不同的自定义函数解析效果。

相关下载

 

icon_txt.gifout_simpleCustomFunction.xls

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

 

转载于:https://my.oschina.net/haiyangyiba/blog/2246043

你可能感兴趣的:(java,人工智能)