poi 根据模板填充数据生成excl文件
本文中是对于xlsx文件
第一步
获取要填充的数据
第二步
把模板中的值及对数据的操作存放到MAP中
Map<String, String> tempNameList = new HashMap<String, String>();
tempNameList.put(“{年月}” "1");
第三步
读取模板
InputStream in = new FileInputStream(file);
第四步
对模板进行操作
Workbook wb = new XSSFWorkbook(in);
// 一页的数量
int pageNum = (int) wb.getSheetAt(1).getRow(15).getCell(16).getNumericCellValue();
// sheet的总个数
int sheetZnum = list.size() / pageNum;
if (list.size() % pageNum > 0) {
sheetZnum += 1;
}
wb.removeSheetAt(1);
XSSFSheet sheet = (XSSFSheet) wb.getSheetAt(0);
// 获得总列数
int coloumZnum = sheet.getRow(0).getLastCellNum();
// 获得总行数
int rowZnum = sheet.getLastRowNum();
// 生成sheet
for (int iPage = 0; iPage < sheetZnum; iPage++) {
XSSFSheet sheetNew = null;
if (iPage > 0) {
sheetNew = (XSSFSheet) wb.cloneSheet(0);
} else {
sheetNew = (XSSFSheet) wb.getSheetAt(0);
}
// 设置展示的百分比
sheetNew.setZoom(70);
// 是否自适应界面
sheetNew.setFitToPage(true);
}
第五步
为做好的模板填充数据
// 循环赋值
for (int sheetNum = 0; sheetNum < sheetZnum; sheetNum++) {
XSSFSheet sheet1 = (XSSFSheet) wb.getSheetAt(sheetNum);
for (int rowNum = 0; rowNum < rowZnum; rowNum++) {
XSSFRow row = sheet1.getRow(rowNum);
for (int coloumNum = 0; coloumNum < coloumZnum; coloumNum++) {
XSSFCell cell = row.getCell(coloumNum);
String value = cell.getStringCellValue();
if (StringUtils.isNotBlank(value)) {
int index = sheetNum * pageNum + Integer.valueOf(value.split("_")[1]);
setCell(cell, wb, list, value.split("_")[0], index, tempNameList);
}
}
}
}
/**
* 填充数据
*
* @param cell 单元格
* @param wb 工作空间
* @param list 获取的数据集
* @param name 模板单元格中的数据
* @param index 对应的数据集合的数据位置
* @param tempNameList 获取数据对应的方法集
* @throws Exception 异常
*/
private void setCell(XSSFCell cell, Workbook wb, List<WChouriSyokusatu> list, String name, int index,
Map<String, String> tempNameList) throws Exception {
if (index <= list.size()) {
WChouriSyokusatu w = list.get(index - 1);
setValue(w, tempNameList.get(name), cell, wb);
} else {
cell.setCellValue("");
}
}
/**
* 设置值 不同的显示格式可以创建多个方式
*
* @param w 数据集
* @param map 获取数据对应的方法
* @param cell 单元格
* @param wb 工作空间
* @throws Exception 异常
*/
private void setValue(WChouriSyokusatu w, String map, XSSFCell cell, Workbook wb) throws Exception {
String val = "";
switch (map.split(",")[0]) {
case "2" :
val = getVal1(w, map.split(",")[1]);
break;
case "3" ://根据数据中的rgb参数设置背景样色和字体颜色
String kbn = getVal1(w, map.split(",")[1]);
if (kbn.equals("2")) {
forColor(getVal1(w, map.split(",")[2]), 0, cell, wb);
forColor(getVal1(w, map.split(",")[3]), 1, cell, wb);
val = getVal1(w, map.split(",")[4]);
}
break;
}
cell.setCellValue(val);
}
/**
* java反射bean的get方法 获取值
*
* @param w 执行对象
* @param name 方法名
* @return 值
* @throws Exception 异常
*/
private String getVal1(WChouriSyokusatu w, String name) throws Exception {
Method m = w.getClass().getMethod(name);
return m.invoke(w) == null || m.invoke(w).equals("") ? "" : m.invoke(w).toString();
}
/**
* 设置颜色
*
* @param obj 颜色
* @param index 属性:0 :背景颜色 1:字体颜色
* @param cell 单元格
* @param wb 工作空间
*/
private void forColor(String obj, int index, XSSFCell cell, Workbook wb) {
if (StringUtils.isNotBlank(obj)) {
XSSFCellStyle newStyle = (XSSFCellStyle) wb.createCellStyle();
XSSFFont newFont = (XSSFFont) wb.createFont();
XSSFCellStyle cellStyle = cell.getCellStyle();
newStyle.cloneStyleFrom(cellStyle);
Color color = Color.decode(obj);
@SuppressWarnings("deprecation")
XSSFColor xssfColor = new XSSFColor(color);
if (index == 0) {
newStyle.setFillForegroundColor(xssfColor);
// 牢固填充
newStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
} else {
XSSFFont font = cellStyle.getFont();
newFont.setFontName(font.getFontName()); // 设置字体名称
newFont.setFontHeightInPoints(font.getFontHeightInPoints()); // 设置字号
newFont.setUnderline(font.getUnderline()); // 设置下划线
newFont.setTypeOffset(font.getTypeOffset()); // 设置上标下标
newFont.setStrikeout(font.getStrikeout()); // 设置删除线
newFont.setColor(xssfColor);
newFont.setBold(font.getBold());
newStyle.setFont(newFont);
}
cell.setCellStyle(newStyle);
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [记录点滴] 小心 Hadoop Speculative 调度策略
- [白话解析] 通过实例来梳理概念 :准确率 (Accuracy)、精准率(Precision)、召回率(Recall)和F值(F-Measure)
- [记录点滴] OpenResty中Redis操作总结
- [源码解析] 从TimeoutException看Flink的心跳机制
- [记录点滴] 一个解决Lua 随机数生成问题的办法
- [记录点滴] 记录一次用 IntelliJ IDEA遇到scope provided 的坑
- [记录点滴] 一个Python中实现flatten的方法
- [源码解析]Oozie来龙去脉之提交任务
- [记录点滴]Ionic编译过程的研究
- [记录点滴]OpenResty 支持http v2的问题
- [源码解析]Oozie来龙去脉之内部执行
- [记录点滴]编译安装luarocks、luacheck、luautf8
- [笔记整理] 一维搜索
- [记录点滴] 使用工具和命令对redis数据进行备份恢复
- [记录点滴]Spring Boot Admin源码分析笔记