JXLS java模板导出excel

刚做完项目稍微总结一下。

我们遇到一个功能的时候常常面临选择技术,选不好就掉到坑里面去了就特么折腾半天不满足要求所以很难受,所以对于自己重新接触的技术真的要了解全面了之后再下手,我写这个文章是来告诉大家我项目中用到的技术

word导出使用freemarker 模板

优点:满足所有可能的需求

缺点:导出的其实是xml文件而已,只是word高版本支持xml类型的word ,手机是无法打开的,打开就是xml文件。解决办法网上有一堆,安装office 使用jacob的jar包加上jacob-1.19-x64.dll文件来调用windows的office转换成真的word(效率慢的一批),如果哪位大哥知道怎么解决麻烦告知一下啊。

还有坑巨多,freemarker的语法贼坑,没有数据就报错,然后就是你得把word先整理成xml数据(基本上网上的教程不靠谱,你得自己去摸索这个xml的含义)

综上如果是linux系统部署那你最好还是老老实实用poi吧。

代码:网上一堆,看不懂那你基本告别这个行业了。

效果:

自己上网去查查这个文档多复杂,单选,多选,图片,分页,页眉,页脚(这个是word自带的功能),都可以满足你的需求。(就是这个模板你自己得好好看看)


excel导出用jxls模板技术

优点:快,爽

缺点:暂时没发现,反正比poi爽多了

我以前也一直用poi导出excel,调整间距,excel导出不好看各种麻烦事,直到我发现jxls模板一切变得简单起来。技术很简单,几乎可以满足你所有excel的需求,所以不要怕大胆用。

贴一个官网http://jxls.sourceforge.net/samples/object_collection_xmlbuilder.html

导入导出我都写了,导入还是用的poi我觉得导入还是很简单的。我稍微封装了一下,代码贴一下。部分业务代码不贴。

说一下代码思路:读取字段属性,反射设置对象值,并判断是否为字典数据,字典数据通过注解判断,自己在类上面写个注解,字典数据替换完事。

jar包贴一下,注意版本,低版本有坑。

<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls-poi</artifactId>
    <version>1.0.16</version>
</dependency>
package com.wenbao.vitwbcrm.utility;


import com.ruoyi.common.config.Global;
import com.wenbao.vitwbcrm.aop.annotation.PoiImportData;
import com.wenbao.vitwbcrm.bkydww.mapper.BaseToolMapper;
import com.wenbao.vitwbcrm.bwg.entity.BaseRelic;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellType;
import org.jxls.common.Context;
import org.jxls.transform.Transformer;
import org.jxls.transform.poi.PoiTransformer;
import org.jxls.util.JxlsHelper;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Jxls 模板导入导出
 * Created by jhwang
 * Date 2019/3/25 15:54
 */
public class JxlsUtils {

    /**
     * xml文件名称
     */
    private String xmlName;


    /**
     * xml文件地址
     */
    private String xmlPath;

    /**
     * 数据所在行
     */
    private Integer rowNumber;

    /**
     * 数据所在工作表
     */
    private Integer sheetNumber = 0;


    /**
     * 设置是否生成主键,默认true
     */
    private boolean ifcreateId = true;


    /**
     * 主键默认字段
     */
    private String id = "id";


    public BaseToolMapper baseToolMapper;


    public JxlsUtils() {}

    /**
     * @param xmlName 模板名称
     * @param rowNumber 对应数据开始行
     */
    public JxlsUtils(String xmlName,Integer rowNumber) {
        this.xmlName = xmlName;
        this.rowNumber = rowNumber;
        //获取默认文件夹下的文件
        this.xmlPath = FileUtils.getPath("jxlsxml"+"/"+xmlName.replace(File.separator,""));
    }

    /**
     * 读取office表格中的数据
     * @param xmlName 模板名称
     * @return
     */
    private static Object readOfficeDataStatic(String xmlName, String tableName,Integer rowNumber,Class cls, InputStream inp){
        JxlsUtils jxlsUtils = new JxlsUtils(xmlName,tableName,rowNumber);
        return jxlsUtils.readPoiOfficeData(cls,inp);
    }



    /**
     * 基于poi读取office表格中的数据
     * @param  inputStream 读取的文件流数据,
     * @return
     */
    public Object readPoiOfficeData(Class cls,InputStream inputStream){
        List<Object> list = new ArrayList<Object>();
        //获取所有的字段
        Map xmlMap = getXmlMap();
        HSSFWorkbook workbook = null;
        try {
            workbook = new HSSFWorkbook(inputStream);
            HSSFSheet hssfSheet = workbook.getSheetAt(this.sheetNumber);
            //循环行
            for (int rowNum = this.rowNumber; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
                HSSFRow hssfRow = hssfSheet.getRow(rowNum);
                if (hssfRow == null ) {
                    continue;
                }
                Object o = cls.newInstance();
                for (int rowi = 0; rowi <= hssfRow.getLastCellNum(); rowi++) {
                    HSSFCell cell = hssfRow.getCell(rowi);
                    if (cell == null) {
                        continue;
                    }
                    //读取数据前设置单元格类型
                    cell.setCellType(CellType.STRING);
                    String value = cell.getStringCellValue();
                    if(xmlMap.get(rowi) != null){
                        BeanUtils.setProperty(o, (String) xmlMap.get(rowi), value);
                    }
                }
                //如果为null则结束循环
                if(ifBenanNull(o)){
                    return list;
                }
                //是否生成主键
                if(ifcreateId){
                    BeanUtils.setProperty(o, this.id, Uuid.AddUUid());
                }
                list.add(o);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return list;
    }

    /**
     * 基于jxls模板导出数据
     * @param  list 导出数据集合
     * @return
     */
    public String exportExcel(List list) throws IOException {
        //模板遍历对象
        String examList = "examList";
        //文件临时存放地址
        String fileName = DateUtils.getYYYYMMDD()+".xlsx";
        File out = new File( Global.getDownloadPath()+fileName);
        Context context =  PoiTransformer.createInitialContext();
        context.putVar(examList, list);
        JxlsHelper jxlsHelper = JxlsHelper.getInstance();
        Transformer transformer  = jxlsHelper.createTransformer(new FileInputStream(this.xmlPath), new FileOutputStream(out));
        jxlsHelper.processTemplate(context, transformer);
        return fileName;
    }



    /**
     * 基于jxls模板导出数据 横向数据导出
     * @param rowlist 横向数据
     * @param datalist 集合数据
     * @return
     */
    public String exportExcelRow(List rowlist,List datalist) throws IOException {
//        try(InputStream is = GridCommandDemo.class.getResourceAsStream("grid_template.xls")) {
//            try(OutputStream os = new FileOutputStream("target/grid_output2.xls")) {
//                Context context = new Context();
//                context.putVar("rowlist", Arrays.asList("Name", "Birthday", "Payment"));
//                context.putVar("datalist", employees);
//                JxlsHelper.getInstance().processGridTemplateAtCell(is, os, context, "name,birthDate,payment", "Sheet2!A1");
//            }
//        }
        return null;
    }



    /**
     * 判断对象是否全部为null 或者“”,如果是返回true 否返回false
     * @param obj
     * @return
     * @throws IllegalAccessException
     */
    private boolean ifBenanNull(Object obj)  {
        boolean flag = true;
        Field[] declaredFields = obj.getClass().getDeclaredFields();
        for(Field f : declaredFields){
            f.setAccessible(true);
            try {
                if("serialVersionUID".equals(f.getName())){
                    continue;
                }
                if(BeanUtils.getProperty(obj,f.getName()) != null && !"".equals(BeanUtils.getProperty(obj,f.getName()))){
                    return false;
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
        }
        return flag;
    }


    /**
     * 获取xml文件中所设置的字段返回map
     * key - 字段名称
     * value - 字段所属位置
     */
    private Map getXmlMap(){
        Map<Integer, String> map = new HashMap<>();
        HSSFWorkbook workbook = null;
        try {
            // 读取Excel文件
            FileInputStream fileInputStream = new FileInputStream(this.xmlPath);
            workbook = new HSSFWorkbook(fileInputStream);
            HSSFSheet hssfSheet = workbook.getSheetAt(this.sheetNumber);
            HSSFRow row = hssfSheet.getRow(this.rowNumber);
            // 循环列
            for (int rowNum = 0; rowNum <= row.getLastCellNum(); rowNum++) {
                HSSFCell cell = row.getCell(rowNum);
                if (cell == null) {
                    continue;
                }
                cell.setCellType(CellType.STRING);
                if(cell.getStringCellValue() != null && !"".equals(cell.getStringCellValue())){
                    String value = formatParamCode(cell.getStringCellValue()).split("\\.")[1];
                    if(value!=null && !"".equals(value)){
                        map.put(rowNum,value);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }

    /**
     * 取出${}中的数据
     * @param paramCode
     * @return
     */
    public String formatParamCode(String paramCode){
        return paramCode.replaceAll("\\$", "").replaceAll("\\{", "").replaceAll("\\}", "");
    }


    /**
     * 根据导出对象上的注解 PoiImportData 设置转换成对应的字典数据
     */
    public void processingCodeData(List list, BaseToolMapper baseToolMapper) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        for (Object obj:list) {
            Map<String, Object> describe = PropertyUtils.describe(obj);
            for (String key : describe.keySet()) {
                //排除掉默认的class
                if(key.equals("class")){
                    continue;
                }
                if(describe.get(key) != null && !describe.get(key).toString().trim().equals("")){
                    //获取注解
                    PoiImportData annotation = obj.getClass().getDeclaredField(key).getAnnotation(PoiImportData.class);
                    if(annotation != null){
                        //表名
                        String tableName = annotation.tableName();
                        //主键
                        String id = annotation.id();
                        //value、
                        String value = annotation.value();
                        String s = baseToolMapper.selectCodeID(tableName, id, value, (String) describe.get(key));
                        BeanUtils.setProperty(obj,key,s);
                    }
                }
                
            }
        }
    }


    public static void main(String[] ags) throws IllegalAccessException, Exception {
        JxlsUtils jxlsUtils = new JxlsUtils("可移动文物标准模板.xls",  3);
        try {
            FileInputStream fileInputStream = new FileInputStream("D:\\青海项目\\各市州一普资料\\63232441900003河南蒙古族自治县拉卡寺.xls");
            //导入
            List<BaseRelic> list = (List<BaseRelic>)jxlsUtils.readPoiOfficeData(BaseRelic.class, fileInputStream);
            //导出
            jxlsUtils.exportExcel(list);
        } catch (Exception e) {
            e.printStackTrace();
        }
//        JxlsUtils jxlsUtils = new JxlsUtils();
//        BaseRelic baseRelic = new BaseRelic();
//        //baseRelic.setgId("11");
//        boolean b = jxlsUtils.ifBenanNull(baseRelic);
//        System.out.println(b);
    }


}

猜你喜欢

转载自blog.csdn.net/qq_37891961/article/details/88849490