|
|
|
@ -3,6 +3,7 @@ package com.platform.utils.excelUtils;
|
|
|
|
|
import java.io.FileNotFoundException;
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.lang.reflect.Field;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
|
@ -25,26 +26,23 @@ import com.base.Constant;
|
|
|
|
|
*/
|
|
|
|
|
public class ExcelOperation {
|
|
|
|
|
|
|
|
|
|
/** 读取excel模板
|
|
|
|
|
/** 写入excel
|
|
|
|
|
* @param templateFilePath
|
|
|
|
|
* @param list list中对象的属性顺序和模板的列顺序一一对应
|
|
|
|
|
* @param excelInitRow //从第excelInitRow行 开始填充数据,( Constant.EXCEL_TEMPLATE_INIT_ROW)
|
|
|
|
|
* @return HSSFWorkbook
|
|
|
|
|
* @throws FileNotFoundException
|
|
|
|
|
* @throws IOException
|
|
|
|
|
* @throws IllegalAccessException
|
|
|
|
|
* @throws IllegalArgumentException
|
|
|
|
|
*/
|
|
|
|
|
public static XSSFWorkbook writeExcelTemplate(String templateFilePath, List list) throws FileNotFoundException, IOException, IllegalArgumentException, IllegalAccessException {
|
|
|
|
|
* @throws IllegalArgumentException
|
|
|
|
|
* @throws IllegalAccessException
|
|
|
|
|
*///从第几行 填充数据
|
|
|
|
|
public static XSSFWorkbook writeExcelTemplate(String templateFilePath,int excelInitRow, List list) throws FileNotFoundException, IOException, IllegalArgumentException, IllegalAccessException {
|
|
|
|
|
// InputStreamReader in= new InputStreamReader(Resource.class.getResourceAsStream(templateFilePath), "UTF-8");
|
|
|
|
|
ClassPathResource res = new ClassPathResource(templateFilePath);
|
|
|
|
|
//此处 耗时太久:(原因:excel 2007 以后采用的方式不同造成的建议升级 到 poi 3.15以上)
|
|
|
|
|
Date date = new Date();
|
|
|
|
|
XSSFWorkbook workbook = new XSSFWorkbook(res.getInputStream());
|
|
|
|
|
Date date2 = new Date();
|
|
|
|
|
System.out.println(" new XSSFWorkbook: "+ (date2.getTime()-date.getTime()));
|
|
|
|
|
// System.out.println(" new XSSFWorkbook: "+ (date2.getTime()-date.getTime()));
|
|
|
|
|
|
|
|
|
|
//从第几行 填充数据
|
|
|
|
|
int excelInitRow = Constant.EXCEL_TEMPLATE_INIT_ROW;
|
|
|
|
|
//读取工作表
|
|
|
|
|
XSSFSheet sheet = workbook.getSheetAt(0);//getSheet("Sheet1");
|
|
|
|
|
XSSFRow row;
|
|
|
|
@ -61,9 +59,15 @@ public class ExcelOperation {
|
|
|
|
|
fields[j].setAccessible(true);
|
|
|
|
|
cell = row.createCell((short) j,HSSFCellStyle.ALIGN_CENTER);
|
|
|
|
|
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
|
|
|
|
|
Object value = fields[j].get(obj);
|
|
|
|
|
Object value = fields[j].get(obj);
|
|
|
|
|
if (null != value) {
|
|
|
|
|
cell.setCellValue(value.toString());
|
|
|
|
|
//int型
|
|
|
|
|
if (fields[j].getType().toString().contains("Integer")) {
|
|
|
|
|
cell.setCellValue(String.valueOf(value));
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
cell.setCellValue(value.toString());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
cell.setCellValue("");
|
|
|
|
@ -85,6 +89,10 @@ public class ExcelOperation {
|
|
|
|
|
return workbook;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** excel的cell样式设置
|
|
|
|
|
* @param workbook
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
private static XSSFCellStyle getStyle(XSSFWorkbook workbook) {
|
|
|
|
|
// 设置字体;
|
|
|
|
|
XSSFFont font = workbook.createFont();
|
|
|
|
@ -122,5 +130,64 @@ public class ExcelOperation {
|
|
|
|
|
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
|
|
|
|
|
return style;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 读取excel模板
|
|
|
|
|
* @param workbook excel的XSSFWorkbook
|
|
|
|
|
* @param excelInitRow 读取数据的起始行
|
|
|
|
|
* @param classz excel的每行数据导出 到的 类
|
|
|
|
|
* @return
|
|
|
|
|
* @throws IllegalAccessException
|
|
|
|
|
* @throws InstantiationException
|
|
|
|
|
*/
|
|
|
|
|
public static List readExcelTemplate(XSSFWorkbook workbook, int excelInitRow, Class<?> classz) throws InstantiationException, IllegalAccessException {
|
|
|
|
|
List list = null;
|
|
|
|
|
//读取工作表
|
|
|
|
|
XSSFSheet sheet = workbook.getSheetAt(0);//getSheet("Sheet1");
|
|
|
|
|
XSSFRow row;
|
|
|
|
|
XSSFCell cell = null;
|
|
|
|
|
//excel总行数
|
|
|
|
|
int rowNum = sheet.getLastRowNum();
|
|
|
|
|
row = sheet.getRow(0);
|
|
|
|
|
//excel总列数
|
|
|
|
|
int colNum = row.getPhysicalNumberOfCells();
|
|
|
|
|
// 填充数据的类的 属性个数
|
|
|
|
|
int objColl = classz.getDeclaredFields().length;
|
|
|
|
|
//如果有数据
|
|
|
|
|
if (rowNum > excelInitRow) {
|
|
|
|
|
list = new ArrayList<>();
|
|
|
|
|
//遍历每行数据
|
|
|
|
|
for (int i = excelInitRow; i < rowNum; i++) {
|
|
|
|
|
//获得当前行
|
|
|
|
|
row = sheet.getRow(i);
|
|
|
|
|
//实例化
|
|
|
|
|
Object newObj = classz.newInstance();
|
|
|
|
|
Field[] fields = newObj.getClass().getDeclaredFields();
|
|
|
|
|
boolean isAddObj = false;
|
|
|
|
|
//遍历每列的数据
|
|
|
|
|
for (int j = 0; j < objColl; j++) {
|
|
|
|
|
cell = row.getCell(j);
|
|
|
|
|
if (null != cell) {
|
|
|
|
|
fields[j].setAccessible(true);
|
|
|
|
|
String cellString = cell.getStringCellValue();
|
|
|
|
|
if (!"".equals(cellString)) {
|
|
|
|
|
isAddObj = true;
|
|
|
|
|
//int型
|
|
|
|
|
if (fields[j].getType().toString().contains("Integer")) {
|
|
|
|
|
fields[j].set(newObj, Integer.valueOf(cellString));
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
fields[j].set(newObj, cellString);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (isAddObj) {
|
|
|
|
|
list.add(newObj);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return list;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|