Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

根据现有代码进行M种分类组合使用N个模板的方式生成Excel文档 #38

Open
qq272936993 opened this issue Apr 24, 2019 · 0 comments

Comments

@qq272936993
Copy link

qq272936993 commented Apr 24, 2019

ExcelHelper不能继承的情况下,当然可以有修改源码的方式,我使用了以下方式,不知道有没什么更好的办法

`

public class ExcelExpandHelper {

private static volatile ExcelExpandHelper mExcelExpandHelper;

//实现单模板,多sheet的方式
private ExcelExpandHelper() {

}

public static ExcelExpandHelper getInstance() {
    if (null == mExcelExpandHelper) {
        synchronized(ExcelExpandHelper.class) {
            if (null == mExcelExpandHelper) {
                mExcelExpandHelper = new ExcelExpandHelper();
            }
        }
    }

    return mExcelExpandHelper;
}

public void normalSheet2Excel(List<NormalSheetExpandWrapper> sheetWrappers, String templatePath, OutputStream os ) throws Excel4JException {
    try {
        SheetTemplate sheetTemplate = this.exportExcelByModuleHandler(templatePath, sheetWrappers);
        Throwable var5 = null;

        try {
            sheetTemplate.write2Stream(os);
        } catch (Throwable var15) {
            var5 = var15;
            throw var15;
        } finally {
            if (sheetTemplate != null) {
                if (var5 != null) {
                    try {
                        sheetTemplate.close();
                    } catch (Throwable var14) {
                        var5.addSuppressed(var14);
                    }
                } else {
                    sheetTemplate.close();
                }
            }

        }
    } catch (IOException | Excel4JException var17) {
        throw new Excel4JException(var17);
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    }
}


private SheetTemplate exportExcelByModuleHandler(String templatePath, List<NormalSheetExpandWrapper> sheets) throws Excel4JException, NoSuchFieldException {
    //读取模板文件
    SheetTemplate template = SheetTemplateHandler.sheetTemplateBuilder(templatePath);
    //克隆模板
    cloneSheet(template , sheets);
    //这是用户配置的有多少sheet
    Iterator var4 = sheets.iterator();
    while(var4.hasNext()) {
        NormalSheetExpandWrapper sheet = (NormalSheetExpandWrapper)var4.next();
        //生成sheet
        this.generateSheet(sheet.getSheetIndex() , sheet.getData(), sheet.getExtendMap(), sheet.getClazz(), sheet.isWriteHeader(), template);
    }

    return template;
}

private void generateSheet(int sheetIndex ,List<?> data, Map<String, String> extendMap, Class clazz, boolean isWriteHeader, SheetTemplate template) throws Excel4JException, NoSuchFieldException {
    //加载模板
    SheetTemplateHandler.loadTemplate(template, sheetIndex);
    //将值设置到模板中
    SheetTemplateHandler.extendData(template, extendMap);

    //设置标题
    List<ExcelHeader> headers = Utils.getHeaderList(clazz);
    Iterator var8;
    //如果需要重新构建header
    if (isWriteHeader) {
        SheetTemplateHandler.createNewRow(template);
        var8 = headers.iterator();

        while(var8.hasNext()) {
            ExcelHeader header = (ExcelHeader)var8.next();
            SheetTemplateHandler.createCell(template, header.getTitle(), (String)null);
        }
    }

    var8 = data.iterator();

    while(var8.hasNext()) {
        Object object = var8.next();
        SheetTemplateHandler.createNewRow(template);
        SheetTemplateHandler.insertSerial(template, (String)null);
        Iterator var10 = headers.iterator();

        while(var10.hasNext()) {
            ExcelHeader header = (ExcelHeader)var10.next();
            SheetTemplateHandler.createCell(template, Utils.getProperty(object, header.getFiled(), header.getWriteConverter()), (String)null);
        }
    }

}

/***
 * 使用反射的原理
 * */
private void cloneSheet(SheetTemplate template ,  List<NormalSheetExpandWrapper> sheets) throws NoSuchFieldException {
    Class cls = template.getClass();
    Field field = cls.getDeclaredField("workbook");
    try {
        field.setAccessible(true);
        Workbook workbook = (Workbook) field.get(template);
        Iterator<Sheet> it = workbook.sheetIterator();
        int len = 0;
        Sheet defSheet = null;
        while(it.hasNext()){
            Sheet sheet = it.next();
            if(len == 0){
                defSheet = sheet;
            }
            len ++;
        }

        int sheetSize = sheets.size();
        //有模板文件后,进行克隆
        if(defSheet != null){
            Set<Integer> usedIndexSet = new HashSet<>();
            for(int i = 0; i < sheetSize ; i++){
                NormalSheetExpandWrapper normalSheetExpandWrapper = sheets.get(i);
                //这里需要判断是getSheet还是cloneSheet(第一次使用为get,否则为clone)
                Integer cloneIndexSheet = normalSheetExpandWrapper.getCloneIndexSheet();
                Sheet sheet = null;
                if(usedIndexSet.contains(cloneIndexSheet)){
                    sheet = workbook.cloneSheet(cloneIndexSheet);
                }else{
                    sheet = workbook.getSheetAt(cloneIndexSheet);
                     usedIndexSet.add(cloneIndexSheet);
                }

                workbook.setSheetOrder(sheet.getSheetName() , i);
                String sheetName = normalSheetExpandWrapper.getSheetName();
                workbook.setSheetName(i , sheetName);
            }
        }
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}

  }

`

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant