|
|
|
@ -53,14 +53,14 @@ import com.ruoyi.common.core.text.Convert;
|
|
|
|
|
import com.ruoyi.common.exception.CustomException;
|
|
|
|
|
import com.ruoyi.common.utils.DateUtils;
|
|
|
|
|
import com.ruoyi.common.utils.DictUtils;
|
|
|
|
|
import com.ruoyi.common.utils.StringUtils;
|
|
|
|
|
import com.ruoyi.common.utils.StringPlusUtils;
|
|
|
|
|
import com.ruoyi.common.utils.file.FileTypeUtils;
|
|
|
|
|
import com.ruoyi.common.utils.file.ImageUtils;
|
|
|
|
|
import com.ruoyi.common.utils.reflect.ReflectUtils;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Excel相关处理
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @author ruoyi
|
|
|
|
|
*/
|
|
|
|
|
public class ExcelUtil<T>
|
|
|
|
@ -116,12 +116,12 @@ public class ExcelUtil<T>
|
|
|
|
|
* 统计列表
|
|
|
|
|
*/
|
|
|
|
|
private Map<Integer, Double> statistics = new HashMap<Integer, Double>();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 数字格式
|
|
|
|
|
*/
|
|
|
|
|
private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 实体对象
|
|
|
|
|
*/
|
|
|
|
@ -147,18 +147,18 @@ public class ExcelUtil<T>
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 对excel表单默认第一个索引名转换成list
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @param is 输入流
|
|
|
|
|
* @return 转换后集合
|
|
|
|
|
*/
|
|
|
|
|
public List<T> importExcel(InputStream is) throws Exception
|
|
|
|
|
{
|
|
|
|
|
return importExcel(StringUtils.EMPTY, is);
|
|
|
|
|
return importExcel(StringPlusUtils.EMPTY, is);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 对excel表单指定表格索引名转换成list
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @param sheetName 表格索引名
|
|
|
|
|
* @param is 输入流
|
|
|
|
|
* @return 转换后集合
|
|
|
|
@ -169,7 +169,7 @@ public class ExcelUtil<T>
|
|
|
|
|
this.wb = WorkbookFactory.create(is);
|
|
|
|
|
List<T> list = new ArrayList<T>();
|
|
|
|
|
Sheet sheet = null;
|
|
|
|
|
if (StringUtils.isNotEmpty(sheetName))
|
|
|
|
|
if (StringPlusUtils.isNotEmpty(sheetName))
|
|
|
|
|
{
|
|
|
|
|
// 如果指定sheet名,则取指定sheet中的内容.
|
|
|
|
|
sheet = wb.getSheet(sheetName);
|
|
|
|
@ -196,7 +196,7 @@ public class ExcelUtil<T>
|
|
|
|
|
for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++)
|
|
|
|
|
{
|
|
|
|
|
Cell cell = heard.getCell(i);
|
|
|
|
|
if (StringUtils.isNotNull(cell))
|
|
|
|
|
if (StringPlusUtils.isNotNull(cell))
|
|
|
|
|
{
|
|
|
|
|
String value = this.getCellValue(heard, i).toString();
|
|
|
|
|
cellMap.put(value, i);
|
|
|
|
@ -243,14 +243,14 @@ public class ExcelUtil<T>
|
|
|
|
|
if (String.class == fieldType)
|
|
|
|
|
{
|
|
|
|
|
String s = Convert.toStr(val);
|
|
|
|
|
if (StringUtils.endsWith(s, ".0"))
|
|
|
|
|
if (StringPlusUtils.endsWith(s, ".0"))
|
|
|
|
|
{
|
|
|
|
|
val = StringUtils.substringBefore(s, ".0");
|
|
|
|
|
val = StringPlusUtils.substringBefore(s, ".0");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
String dateFormat = field.getAnnotation(Excel.class).dateFormat();
|
|
|
|
|
if (StringUtils.isNotEmpty(dateFormat))
|
|
|
|
|
if (StringPlusUtils.isNotEmpty(dateFormat))
|
|
|
|
|
{
|
|
|
|
|
val = DateUtils.parseDateToStr(dateFormat, (Date) val);
|
|
|
|
|
}
|
|
|
|
@ -260,7 +260,7 @@ public class ExcelUtil<T>
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val)))
|
|
|
|
|
else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringPlusUtils.isNumeric(Convert.toStr(val)))
|
|
|
|
|
{
|
|
|
|
|
val = Convert.toInt(val);
|
|
|
|
|
}
|
|
|
|
@ -295,19 +295,19 @@ public class ExcelUtil<T>
|
|
|
|
|
{
|
|
|
|
|
val = Convert.toBool(val, false);
|
|
|
|
|
}
|
|
|
|
|
if (StringUtils.isNotNull(fieldType))
|
|
|
|
|
if (StringPlusUtils.isNotNull(fieldType))
|
|
|
|
|
{
|
|
|
|
|
Excel attr = field.getAnnotation(Excel.class);
|
|
|
|
|
String propertyName = field.getName();
|
|
|
|
|
if (StringUtils.isNotEmpty(attr.targetAttr()))
|
|
|
|
|
if (StringPlusUtils.isNotEmpty(attr.targetAttr()))
|
|
|
|
|
{
|
|
|
|
|
propertyName = field.getName() + "." + attr.targetAttr();
|
|
|
|
|
}
|
|
|
|
|
else if (StringUtils.isNotEmpty(attr.readConverterExp()))
|
|
|
|
|
else if (StringPlusUtils.isNotEmpty(attr.readConverterExp()))
|
|
|
|
|
{
|
|
|
|
|
val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator());
|
|
|
|
|
}
|
|
|
|
|
else if (StringUtils.isNotEmpty(attr.dictType()))
|
|
|
|
|
else if (StringPlusUtils.isNotEmpty(attr.dictType()))
|
|
|
|
|
{
|
|
|
|
|
val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator());
|
|
|
|
|
}
|
|
|
|
@ -322,7 +322,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 对list数据源将其里面的数据导入到excel表单
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @param list 导出数据集合
|
|
|
|
|
* @param sheetName 工作表的名称
|
|
|
|
|
* @return 结果
|
|
|
|
@ -335,7 +335,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 对list数据源将其里面的数据导入到excel表单
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @param sheetName 工作表的名称
|
|
|
|
|
* @return 结果
|
|
|
|
|
*/
|
|
|
|
@ -347,7 +347,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 对list数据源将其里面的数据导入到excel表单
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @return 结果
|
|
|
|
|
*/
|
|
|
|
|
public AjaxResult exportExcel()
|
|
|
|
@ -415,7 +415,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 填充excel数据
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @param index 序号
|
|
|
|
|
* @param row 单元格行
|
|
|
|
|
*/
|
|
|
|
@ -442,7 +442,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建表格样式
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @param wb 工作薄对象
|
|
|
|
|
* @return 样式列表
|
|
|
|
|
*/
|
|
|
|
@ -480,7 +480,7 @@ public class ExcelUtil<T>
|
|
|
|
|
headerFont.setColor(IndexedColors.WHITE.getIndex());
|
|
|
|
|
style.setFont(headerFont);
|
|
|
|
|
styles.put("header", style);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
style = wb.createCellStyle();
|
|
|
|
|
style.setAlignment(HorizontalAlignment.CENTER);
|
|
|
|
|
style.setVerticalAlignment(VerticalAlignment.CENTER);
|
|
|
|
@ -524,7 +524,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 设置单元格信息
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @param value 单元格值
|
|
|
|
|
* @param attr 注解相关
|
|
|
|
|
* @param cell 单元格信息
|
|
|
|
@ -533,18 +533,18 @@ public class ExcelUtil<T>
|
|
|
|
|
{
|
|
|
|
|
if (ColumnType.STRING == attr.cellType())
|
|
|
|
|
{
|
|
|
|
|
cell.setCellValue(StringUtils.isNull(value) ? attr.defaultValue() : value + attr.suffix());
|
|
|
|
|
cell.setCellValue(StringPlusUtils.isNull(value) ? attr.defaultValue() : value + attr.suffix());
|
|
|
|
|
}
|
|
|
|
|
else if (ColumnType.NUMERIC == attr.cellType())
|
|
|
|
|
{
|
|
|
|
|
cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value));
|
|
|
|
|
cell.setCellValue(StringPlusUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value));
|
|
|
|
|
}
|
|
|
|
|
else if (ColumnType.IMAGE == attr.cellType())
|
|
|
|
|
{
|
|
|
|
|
ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1),
|
|
|
|
|
cell.getRow().getRowNum() + 1);
|
|
|
|
|
String imagePath = Convert.toStr(value);
|
|
|
|
|
if (StringUtils.isNotEmpty(imagePath))
|
|
|
|
|
if (StringPlusUtils.isNotEmpty(imagePath))
|
|
|
|
|
{
|
|
|
|
|
byte[] data = ImageUtils.getImage(imagePath);
|
|
|
|
|
getDrawingPatriarch(cell.getSheet()).createPicture(anchor,
|
|
|
|
@ -552,7 +552,7 @@ public class ExcelUtil<T>
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取画布
|
|
|
|
|
*/
|
|
|
|
@ -597,7 +597,7 @@ public class ExcelUtil<T>
|
|
|
|
|
sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256));
|
|
|
|
|
}
|
|
|
|
|
// 如果设置了提示信息则鼠标放上去提示.
|
|
|
|
|
if (StringUtils.isNotEmpty(attr.prompt()))
|
|
|
|
|
if (StringPlusUtils.isNotEmpty(attr.prompt()))
|
|
|
|
|
{
|
|
|
|
|
// 这里默认设了2-101列提示.
|
|
|
|
|
setXSSFPrompt(sheet, "", attr.prompt(), 1, 100, column, column);
|
|
|
|
@ -634,15 +634,15 @@ public class ExcelUtil<T>
|
|
|
|
|
String readConverterExp = attr.readConverterExp();
|
|
|
|
|
String separator = attr.separator();
|
|
|
|
|
String dictType = attr.dictType();
|
|
|
|
|
if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value))
|
|
|
|
|
if (StringPlusUtils.isNotEmpty(dateFormat) && StringPlusUtils.isNotNull(value))
|
|
|
|
|
{
|
|
|
|
|
cell.setCellValue(DateUtils.parseDateToStr(dateFormat, (Date) value));
|
|
|
|
|
}
|
|
|
|
|
else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value))
|
|
|
|
|
else if (StringPlusUtils.isNotEmpty(readConverterExp) && StringPlusUtils.isNotNull(value))
|
|
|
|
|
{
|
|
|
|
|
cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator));
|
|
|
|
|
}
|
|
|
|
|
else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value))
|
|
|
|
|
else if (StringPlusUtils.isNotEmpty(dictType) && StringPlusUtils.isNotNull(value))
|
|
|
|
|
{
|
|
|
|
|
cell.setCellValue(convertDictByExp(Convert.toStr(value), dictType, separator));
|
|
|
|
|
}
|
|
|
|
@ -667,7 +667,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 设置 POI XSSFSheet 单元格提示
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @param sheet 表单
|
|
|
|
|
* @param promptTitle 提示标题
|
|
|
|
|
* @param promptContent 提示内容
|
|
|
|
@ -690,7 +690,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 设置某些列的值只能输入预制的数据,显示下拉框.
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @param sheet 要设置的sheet.
|
|
|
|
|
* @param textlist 下拉框显示的内容
|
|
|
|
|
* @param firstRow 开始行
|
|
|
|
@ -724,7 +724,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 解析导出值 0=男,1=女,2=未知
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @param propertyValue 参数值
|
|
|
|
|
* @param converterExp 翻译注解
|
|
|
|
|
* @param separator 分隔符
|
|
|
|
@ -737,7 +737,7 @@ public class ExcelUtil<T>
|
|
|
|
|
for (String item : convertSource)
|
|
|
|
|
{
|
|
|
|
|
String[] itemArray = item.split("=");
|
|
|
|
|
if (StringUtils.containsAny(separator, propertyValue))
|
|
|
|
|
if (StringPlusUtils.containsAny(separator, propertyValue))
|
|
|
|
|
{
|
|
|
|
|
for (String value : propertyValue.split(separator))
|
|
|
|
|
{
|
|
|
|
@ -756,12 +756,12 @@ public class ExcelUtil<T>
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return StringUtils.stripEnd(propertyString.toString(), separator);
|
|
|
|
|
return StringPlusUtils.stripEnd(propertyString.toString(), separator);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 反向解析值 男=0,女=1,未知=2
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @param propertyValue 参数值
|
|
|
|
|
* @param converterExp 翻译注解
|
|
|
|
|
* @param separator 分隔符
|
|
|
|
@ -774,7 +774,7 @@ public class ExcelUtil<T>
|
|
|
|
|
for (String item : convertSource)
|
|
|
|
|
{
|
|
|
|
|
String[] itemArray = item.split("=");
|
|
|
|
|
if (StringUtils.containsAny(separator, propertyValue))
|
|
|
|
|
if (StringPlusUtils.containsAny(separator, propertyValue))
|
|
|
|
|
{
|
|
|
|
|
for (String value : propertyValue.split(separator))
|
|
|
|
|
{
|
|
|
|
@ -793,12 +793,12 @@ public class ExcelUtil<T>
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return StringUtils.stripEnd(propertyString.toString(), separator);
|
|
|
|
|
return StringPlusUtils.stripEnd(propertyString.toString(), separator);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 解析字典值
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @param dictValue 字典值
|
|
|
|
|
* @param dictType 字典类型
|
|
|
|
|
* @param separator 分隔符
|
|
|
|
@ -811,7 +811,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 反向解析值字典值
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @param dictLabel 字典标签
|
|
|
|
|
* @param dictType 字典类型
|
|
|
|
|
* @param separator 分隔符
|
|
|
|
@ -821,7 +821,7 @@ public class ExcelUtil<T>
|
|
|
|
|
{
|
|
|
|
|
return DictUtils.getDictValue(dictType, dictLabel, separator);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 合计统计信息
|
|
|
|
|
*/
|
|
|
|
@ -858,7 +858,7 @@ public class ExcelUtil<T>
|
|
|
|
|
cell = row.createCell(0);
|
|
|
|
|
cell.setCellStyle(styles.get("total"));
|
|
|
|
|
cell.setCellValue("合计");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (Integer key : keys)
|
|
|
|
|
{
|
|
|
|
|
cell = row.createCell(key);
|
|
|
|
@ -880,7 +880,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取下载路径
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @param filename 文件名称
|
|
|
|
|
*/
|
|
|
|
|
public String getAbsoluteFile(String filename)
|
|
|
|
@ -896,7 +896,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取bean中的属性值
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @param vo 实体对象
|
|
|
|
|
* @param field 字段
|
|
|
|
|
* @param excel 注解
|
|
|
|
@ -906,7 +906,7 @@ public class ExcelUtil<T>
|
|
|
|
|
private Object getTargetValue(T vo, Field field, Excel excel) throws Exception
|
|
|
|
|
{
|
|
|
|
|
Object o = field.get(vo);
|
|
|
|
|
if (StringUtils.isNotEmpty(excel.targetAttr()))
|
|
|
|
|
if (StringPlusUtils.isNotEmpty(excel.targetAttr()))
|
|
|
|
|
{
|
|
|
|
|
String target = excel.targetAttr();
|
|
|
|
|
if (target.indexOf(".") > -1)
|
|
|
|
@ -927,7 +927,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 以类的属性的get方法方法形式获取值
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @param o
|
|
|
|
|
* @param name
|
|
|
|
|
* @return value
|
|
|
|
@ -935,7 +935,7 @@ public class ExcelUtil<T>
|
|
|
|
|
*/
|
|
|
|
|
private Object getValue(Object o, String name) throws Exception
|
|
|
|
|
{
|
|
|
|
|
if (StringUtils.isNotNull(o) && StringUtils.isNotEmpty(name))
|
|
|
|
|
if (StringPlusUtils.isNotNull(o) && StringPlusUtils.isNotEmpty(name))
|
|
|
|
|
{
|
|
|
|
|
Class<?> clazz = o.getClass();
|
|
|
|
|
Field field = clazz.getDeclaredField(name);
|
|
|
|
@ -976,7 +976,7 @@ public class ExcelUtil<T>
|
|
|
|
|
this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList());
|
|
|
|
|
this.maxHeight = getRowHeight();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 根据注解获取最大行高
|
|
|
|
|
*/
|
|
|
|
@ -1012,7 +1012,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建工作表
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @param sheetNo sheet数量
|
|
|
|
|
* @param index 序号
|
|
|
|
|
*/
|
|
|
|
@ -1033,7 +1033,7 @@ public class ExcelUtil<T>
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取单元格值
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @param row 获取的行
|
|
|
|
|
* @param column 获取单元格列号
|
|
|
|
|
* @return 单元格值
|
|
|
|
@ -1048,7 +1048,7 @@ public class ExcelUtil<T>
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
Cell cell = row.getCell(column);
|
|
|
|
|
if (StringUtils.isNotNull(cell))
|
|
|
|
|
if (StringPlusUtils.isNotNull(cell))
|
|
|
|
|
{
|
|
|
|
|
if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA)
|
|
|
|
|
{
|
|
|
|
@ -1090,4 +1090,4 @@ public class ExcelUtil<T>
|
|
|
|
|
}
|
|
|
|
|
return val;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|