Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
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;
}
}