alibaba / easyexcel

快速、简洁、解决大文件内存溢出的java处理Excel工具
https://easyexcel.opensource.alibaba.com
Apache License 2.0
31.96k stars 7.49k forks source link

支持从模板中拷贝Sheet #2885

Open chendaoheng opened 1 year ago

chendaoheng commented 1 year ago

背景

最近开发一个多语言业务功能,要实现很多个语言版本的sheet,想着从模板中生成sheet,ps:模板中很多个sheet,一个语言一个。这样我就不用创建很多个excel文件模板了,一个模板多个sheet就行。这样结构清晰也便于维护。

期望

模板.xlsx--->中文sheet,英文sheet--->WriteSheet writeSheet= EasyExcel.writerSheet(sheetName). .withTemplateSheet(template,templateSheetName).build();

template=已读取的模板,这样不用重复请求资源

ljluestc commented 1 year ago

// 导入 EasyExcel 相关的包 import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.builder.ExcelWriterBuilder; import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;

public class MultiLanguageExcelGenerator {

public static void main(String[] args) {
    String templateFilePath = "模板.xlsx"; // 模板文件路径
    String outputFilePath = "生成的多语言文件.xlsx"; // 生成的多语言文件路径

    // 读取模板文件
    ExcelWriterBuilder writerBuilder = EasyExcel.write(outputFilePath);
    ExcelWriterSheetBuilder sheetBuilder = writerBuilder.sheet();
    ExcelWriter excelWriter = sheetBuilder.withTemplate(templateFilePath).build();

    // 添加中文 sheet
    String chineseSheetName = "中文";
    excelWriter.fill(new FillData(chineseSheetName));

    // 添加英文 sheet
    String englishSheetName = "英文";
    excelWriter.fill(new FillData(englishSheetName));

    // 关闭 ExcelWriter
    excelWriter.finish();
}

// 自定义 FillData 类,用于填充每个 sheet 的数据
public static class FillData implements WriteHandler {

    private String sheetName;

    public FillData(String sheetName) {
        this.sheetName = sheetName;
    }

    @Override
    public void beforeSheetCreate(String sheetName, int sheetIndex) {
        if (this.sheetName.equals(sheetName)) {
            // 在这里可以做一些初始化操作
        }
    }

    @Override
    public void afterSheetCreate(String sheetName, int sheetIndex) {
        if (this.sheetName.equals(sheetName)) {
            // 在这里可以做一些后续操作
        }
    }
}

}