package com.ruoyi.base.common.utils.poi;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.*;
import com.ruoyi.base.common.annotation.Excel;
import com.ruoyi.base.common.annotation.Excels;
import com.ruoyi.base.common.core.domain.AjaxResult;
import com.ruoyi.base.common.core.text.Convert;
import com.ruoyi.base.common.exception.BaseException;
import com.ruoyi.base.common.utils.DateUtils;
import com.ruoyi.base.common.utils.StringUtils;
import com.ruoyi.base.common.utils.reflect.ReflectUtils;
import com.ruoyi.base.common.utils.spring.SpringUtils;
import com.ruoyi.base.common.utils.file.FileUtils;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFDataValidation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Excel相关处理
*
* @author ruoyi
*/
public class ExcelUtil<T>
{
private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class);
/**
* Excel sheet最大行数,默认65536
*/
public static final int sheetSize = 65536;
/**
* 工作表名称
*/
private String sheetName;
/**
* 导出类型(EXPORT:导出数据;IMPORT:导入模板)
*/
private Excel.Type type;
/**
* 工作薄对象
*/
private Workbook wb;
/**
* 工作表对象
*/
private Sheet sheet;
/**
* 样式列表
*/
private Map<String, CellStyle> styles;
/**
* 导入导出数据列表
*/
private List<T> list;
/**
* 注解列表
*/
private List<Object[]> fields;
/**
* 实体对象
*/
public Class<T> clazz;
public ExcelUtil(Class<T> clazz)
{
this.clazz = clazz;
}
public void init(List<T> list, String sheetName, Excel.Type type)
{
if (list == null)
{
list = new ArrayList<T>();
}
this.list = list;
this.sheetName = sheetName;
this.type = type;
createExcelField();
createWorkbook();
}
/**
* 对excel表单默认第一个索引名转换成list
*
* @param is 输入流
* @return 转换后集合
*/
public List<T> importExcel(InputStream is) throws Exception
{
return importExcel(StringUtils.EMPTY, is);
}
/**
* 对excel表单指定表格索引名转换成list
*
* @param sheetName 表格索引名
* @param is 输入流
* @return 转换后集合
*/
public List<T> importExcel(String sheetName, InputStream is) throws Exception
{
this.type = Excel.Type.IMPORT;
this.wb = WorkbookFactory.create(is);
List<T> list = new ArrayList<T>();
Sheet sheet = null;
if (StringUtils.isNotEmpty(sheetName))
{
// 如果指定sheet名,则取指定sheet中的内容.
sheet = wb.getSheet(sheetName);
}
else
{
// 如果传入的sheet名不存在则默认指向第1个sheet.
sheet = wb.getSheetAt(0);
}
if (sheet == null)
{
throw new IOException("文件sheet不存在");
}
int rows = sheet.getPhysicalNumberOfRows();
if (rows > 0)
{
// 定义一个map用于存放excel列的序号和field.
Map<String, Integer> cellMap = new HashMap<String, Integer>();
// 获取表头
Row heard = sheet.getRow(0);
for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++)
{
Cell cell = heard.getCell(i);
if (StringUtils.isNotNull(cell))
{
String value = this.getCellValue(heard, i).toString();
cellMap.put(value, i);
}
else
{
cellMap.put(null, i);
}
}
// 有数据时才处理 得到类的所有field.
Field[] allFields = clazz.getDeclaredFields();
// 定义一个map用于存放列的序号和field.
Map<Integer, Field> fieldsMap = new HashMap<Integer, Field>();
for (int col = 0; col < allFields.length; col++)
{
Field field = allFields[col];
Excel attr = field.getAnnotation(Excel.class);
if (attr != null && (attr.type() == Excel.Type.ALL || attr.type() == type))
{
// 设置类的私有字段属性可访问.
field.setAccessible(true);
Integer column = cellMap.get(attr.name());
fieldsMap.put(column, field);
}
}
for (int i = 1; i < rows; i++)
{
// 从第2行开始取数据,默认第一行是表头.
Row row = sheet.getRow(i);
T entity = null;
for (Map.Entry<Integer, Field> entry : fieldsMap.entrySet())
{
Object val = this.getCellValue(row, entry.getKey());
// 如果不存在实例则新建.
entity = (entity == null ? clazz.newInstance() : entity);
// 从map中得到对应列的field.
Field field = fieldsMap.get(entry.getKey());
// 取得类型,并根据对象类型设置值.
Class<?> fieldType = field.getType();
if (String.class == fieldType)
{
String s = Convert.toStr(val);
if (StringUtils.endsWith(s, ".0"))
{
val = StringUtils.substringBefore(s, ".0");
}
else
{
String dateFormat = field.getAnnotation(Excel.class).dateFormat();
if (StringUtils.isNotEmpty(dateFormat))
{
val = DateUtils.parseDateToStr(dateFormat, (Date) val);
}
else
{
val = Convert.toStr(val);
}
}
}
else if ((Integer.TYPE == fieldType) || (Integer.class == fieldType))
{
val = Convert.toInt(val);
}
else if ((Long.TYPE == fieldType) || (Long.class == fieldType))
{
val = Convert.toLong(val);
}
else if ((Double.TYPE == fieldType) || (Double.class == fieldType))
{
val = Convert.toDouble(val);
}
else if ((Float.TYPE == fieldType) || (Float.class == fieldType))
{
val = Convert.toFloat(val);
}
else if (BigDecimal.class == fieldType)
{
val = Convert.toBigDecimal(val);
}
else if (Date.class == fieldType)
{
if (val instanceof String)
{
val = DateUtils.parseDate(val);
}
else if (val instanceof Double)
{
val = DateUtil.getJavaDate((Double) val);
没有合适的资源?快使用搜索试试~ 我知道了~
拿来即用springboot+bootstrap整合若依的后台管理系统
共1503个文件
java:567个
xml:390个
png:128个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 15 浏览量
2021-08-10
14:17:23
上传
评论
收藏 9.94MB RAR 举报
温馨提示
入口在ruoyi-platweb ccspAplication.java 也可以打包到tomcat中
资源推荐
资源详情
资源评论
收起资源包目录
拿来即用springboot+bootstrap整合若依的后台管理系统 (1503个子文件)
mvnw.cmd 6KB
summernote-bs3.css 149KB
style.css 141KB
bootstrap.min14ed.css 118KB
bootstrap.min.css 118KB
style.min862f.css 97KB
animate.css 67KB
animate.min.css 46KB
font-awesome.min.css 33KB
skins.css 28KB
font-awesome.min93e3.css 26KB
ambiance.css 26KB
ry-ui.css 23KB
ccsp-ui.css 22KB
bootstrap-editable.css 21KB
summernote.css 18KB
select2.css 18KB
select2-bootstrap.css 16KB
jasny-bootstrap.css 16KB
select2.min.css 15KB
layer.css 15KB
jasny-bootstrap.min.css 14KB
bootstrap-datetimepicker.css 12KB
bootstrap-select.css 12KB
fileinput.css 12KB
bootstrap-datetimepicker.min.css 11KB
bootstrap-select.min.css 10KB
fileinput.min.css 9KB
codemirror.css 9KB
laydate.css 8KB
zTreeStyle.css 8KB
zTreeStyle.css 7KB
zTreeStyle.css 6KB
login.min.css 6KB
jquery.contextMenu.min.css 6KB
jquery.steps.css 6KB
bootstrap-table.min.css 5KB
solarized.css 5KB
mdn-like.css 5KB
common.css 5KB
main.css 5KB
style.css 4KB
liquibyte.css 4KB
login.css 3KB
yonce.css 3KB
xq-dark.css 3KB
jquery.layout-latest.css 3KB
material-palenight.css 3KB
duotone-light.css 3KB
darcula.css 3KB
lesser-dark.css 3KB
duotone-dark.css 3KB
material-darker.css 3KB
material-ocean.css 3KB
icecoder.css 2KB
pastel-on-dark.css 2KB
cropbox.css 2KB
shadowfox.css 2KB
ttcn.css 2KB
tomorrow-night-eighties.css 2KB
moxer.css 2KB
ayu-mirage.css 2KB
material.css 2KB
erlang-dark.css 2KB
oceanic-next.css 2KB
xq-light.css 2KB
ayu-dark.css 2KB
monokai.css 2KB
twilight.css 2KB
vibrant-ink.css 2KB
base16-light.css 2KB
mbo.css 2KB
base16-dark.css 2KB
nord.css 2KB
paraiso-dark.css 2KB
paraiso-light.css 2KB
3024-night.css 2KB
bootstrap-duallistbox.css 2KB
dracula.css 2KB
seti.css 2KB
zenburn.css 2KB
3024-day.css 2KB
abcdef.css 2KB
custom.css 2KB
the-matrix.css 2KB
blackboard.css 2KB
lucario.css 2KB
yeti.css 2KB
midnight.css 2KB
panda-syntax.css 2KB
rubyblue.css 2KB
tomorrow-night-bright.css 2KB
night.css 2KB
gruvbox-dark.css 2KB
cobalt.css 2KB
colorforth.css 2KB
idea.css 2KB
railscasts.css 1KB
bootstrap-duallistbox.min.css 1KB
hopscotch.css 1KB
共 1503 条
- 1
- 2
- 3
- 4
- 5
- 6
- 16
资源评论
- m0_583608562022-03-10用户下载后在一定时间内未进行评价,系统默认好评。
魔地主
- 粉丝: 15
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于MFC的校园导航程序(使用最短路径dijkstra算法).rar
- Android Studio android APP 视频作为视图背景需要源代码或想了解其实现原理的可以私心我
- com.ZeroneGames.GreenProject.apk
- Python自动化开发入门教程
- 4399GameSem_116_13955_207551_6.apk
- python 3.9.19源码编译包
- php-8.2.18-Win32-vs16-x64.rar
- 字节跳动青训营-抖音项目
- SQL资料手册,语句教程,高级查询语句语法
- 上位机和串口建立 Modbus 协议进行数据传输,并使用 Mysql 数据库存储,能够实现实时温湿度显示和动态变化曲线,历史数据
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功