All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.gitee.beiding.template_excel.Renderer Maven / Gradle / Ivy

package com.gitee.beiding.template_excel;

import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;
import java.util.*;

public final class Renderer {


    private Renderer() {
    }


    /**
     * @param data          被渲染的数据
     * @param templateSheet 模板sheet页
     * @param targetSheet   接收渲染结果的sheet页
     */

    public static void render(Data data, XSSFSheet templateSheet, XSSFSheet targetSheet) {
        render(data.getData(), templateSheet, targetSheet);
    }

    /**
     * 使用Map作为数据源进行渲染
     *
     * @param data          被渲染的数据
     * @param templateSheet 模板sheet页
     * @param targetSheet   接收渲染结果的sheet页
     */
    public static void render(Map data, XSSFSheet templateSheet, XSSFSheet targetSheet) {

        //放入目标数据
        Js.putAll(data);

        //复制样式
        PoiUtils.copySheet(templateSheet, targetSheet);

        //处理列宽
        PoiUtils.handleColumnWidth(templateSheet, targetSheet);

        //读取内容
        Map> templateRow = PoiUtils.readSheet(templateSheet);

        //模板展开为实际数据
        Map>> map = templateRowToValueRows(templateRow);

        //复制数据
        //PoiUtils.copySheetDataWithData(srcSheet, targetSheet, map);

        //TODO 赋值数据
        TemplateUtils.copySheetDataWithData(templateSheet, targetSheet, map);

        Js.recycle();

    }

    /**
     * 使用Data对象渲染生成一个Sheet页
     *
     * @param data               数据源
     * @param template           模板sheet页
     * @param templateSheetNames 需要被渲染的sheet页名称
     * @return 渲染的结果
     * @throws IOException 流读写异常
     */
    public static XSSFWorkbook render(Data data, InputStream template, String... templateSheetNames) throws IOException {
        return render(data.getData(), template, templateSheetNames);
    }

    /**
     * 使用Map对象渲染生成一个Sheet页
     *
     * @param data               数据源
     * @param template           模板sheet页
     * @param templateSheetNames 需要被渲染的sheet页名称
     * @return 渲染的结果
     * @throws IOException 流读写异常
     */
    public static XSSFWorkbook render(Map data, InputStream template, String... templateSheetNames) throws IOException {
        return render(data, PoiUtils.read(template), templateSheetNames);
    }

    /**
     * 使用Map对象渲染生成一个Sheet页
     *
     * @param data               数据源
     * @param template           模板sheet页
     * @param templateSheetNames 需要被渲染的sheet页名称
     * @return 渲染的结果
     */
    public static XSSFWorkbook render(Map data, XSSFWorkbook template, String... templateSheetNames) {

        Js.putAll(data);
        XSSFWorkbook src = template;


        //复制一份作为输出
        XSSFWorkbook target = null;

        try {

            //TODO  可以断言Io异常不会出现
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            template.write(byteArrayOutputStream);
            target = PoiUtils.read(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
        } catch (IOException ignore) {
        }

        List list = Arrays.asList(templateSheetNames);

        //遍历所有的sheet页
        for (int i = 0; i < src.getNumberOfSheets(); i++) {
            XSSFSheet srcSheet = src.getSheetAt(i);

            XSSFSheet targetSheet = target.getSheet(srcSheet.getSheetName());

            if (list.size() > 0 && !list.contains(srcSheet.getSheetName())) {
                continue;
            }

            if (targetSheet == null) {
                target.createSheet(srcSheet.getSheetName());
            } else {
                for (int j = 0; j <= targetSheet.getLastRowNum(); j++) {
                    XSSFRow row = targetSheet.getRow(j);
                    if (row != null) {
                        targetSheet.removeRow(row);
                    }
                }
            }

            //复制样式
            PoiUtils.copySheet(srcSheet, targetSheet);

            //处理列宽
            PoiUtils.handleColumnWidth(srcSheet, targetSheet);

            //读取内容
            Map> templateRow = PoiUtils.readSheet(srcSheet);


            //模板展开为实际数据
            Map>> map = templateRowToValueRows(templateRow);

            //复制数据
            //PoiUtils.copySheetDataWithData(srcSheet, targetSheet, map);

            //TODO 复制数据
            TemplateUtils.copySheetDataWithData(srcSheet, targetSheet, map);

        }


        Js.recycle();

        return target;

    }

    /**
     * 使用Map作为源数据,将数据渲染到目标文件中
     *
     * @param data               源数据
     * @param template           模板Excel文件
     * @param target             目标Excel文件
     * @param templateSheetNames 模板文件中需要被渲染的Sheet页名称,如果未指定则渲染全部
     * @throws IOException 流读写异常
     */
    public static void render(Map data, InputStream template, OutputStream target, String... templateSheetNames) throws IOException {
        XSSFWorkbook render = render(data, template, templateSheetNames);
        PoiUtils.write(render, target);
    }

    /**
     * 使用Data作为源数据,将数据渲染到目标文件中
     *
     * @param data               源数据
     * @param template           模板Excel文件
     * @param target             目标Excel文件
     * @param templateSheetNames 模板文件中需要被渲染的Sheet页名称,如果未指定则渲染全部
     * @throws IOException 流读写异常
     */
    public static void render(Data data, InputStream template, OutputStream target, String... templateSheetNames) throws IOException {
        render(data.getData(), template, target, templateSheetNames);
    }


    private static Map>> templateRowToValueRows(Map> templateRow) {

        int[] globalIndex = new int[1];

        globalIndex[0] = 0;

        Map>> map = new HashMap<>();

        templateRow.forEach((rowNumber, row) -> {

            Map max = new HashMap<>();

            Map values = new HashMap<>();

            //遍历一行模板
            row.forEach((colNumber, col) -> {

                //解析结果
                TemplateCell parse = TemplateCell.parse(col);
                parse.exe();

                values.put(colNumber, parse);

                Map indexMax = parse.getIndexMax();


                if (indexMax != null) {
                    indexMax.forEach((name, maxValue) -> {
                        Integer integer = max.get(name);
                        if (integer == null || maxValue > integer) {
                            max.put(name, maxValue);
                        }
                    });
                }

            });


            int index = 0;

            if (max.size() > 0) {
                AutoIncrementNumber autoIncrementNumber = new AutoIncrementNumber();
                autoIncrementNumber.init(max);

                List> list = new ArrayList<>();
                //自增
                out:
                while (autoIncrementNumber.autoIncrement()) {

                    Js.set("_index", index);

                    Map line = new HashMap<>();

                    Js.set("_globalIndex", globalIndex[0]);

                    //如果有一个元素是无效的就直接返回
                    for (Integer colValue : values.keySet()) {

                        TemplateCell tc = values.get(colValue);
                        try {
                            Js.set("_col", colValue);
                            line.put(colValue, tc.get(autoIncrementNumber.getValues()));
                        } catch (InvalidIndexException e) {

                        //    System.out.println("无效索引:" + autoIncrementNumber.getValues());

                            continue out;
                        }
                    }


                    if (line.size() > 0) {
                        index++;
                        globalIndex[0]++;
                        list.add(line);
                    }
                }

                if (list.size() > 0) {
                    map.put(rowNumber, list);
                }

            } else {
                List> list = new ArrayList<>();
                Map line = new HashMap<>();
                values.forEach((colValue, tc) -> {
                    line.put(colValue, tc.getSingleResult());
                });
                if (line.size() > 0) {
                    list.add(line);
                    map.put(rowNumber, list);
                }
            }

            try {

                //清空缓存,防止内存溢出
                Js.call("_clearCache");
            } catch (Exception e) {

            }

        });

        Js.remove("_globalIndex");
        Js.remove("_index");
        Js.remove("_col");


        return map;
    }


}





© 2015 - 2024 Weber Informatics LLC | Privacy Policy