java8 POI 读取写入EXCEL
2017-01-18 15:15
579 查看
实例所需bean
ExcelColumn
excel读取写入所需注解import java.lang.annotation.*; /** * Created by admin on 2017/1/9. */ @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ExcelColumn { String value() default ""; /** *从1开始 * @return */ int col() default 0; }
ExcelUtils
封装了读取写入方法import com.cs.test.utils.DateFormatter; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.CharUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** * Created by admin on 2017/1/17. */ public class ExcelUtils { private final static Logger log = LoggerFactory.getLogger(ExcelUtils.class); private final static String EXCEL2003 = "xls"; private final static String EXCEL2007 = "xlsx"; public static <T> List<T> readExcel(String path, Class<T> cls){ List<T> dataList = new ArrayList<>(); Workbook workbook = null; try { if(path.endsWith(EXCEL2007)){ FileInputStream is = new FileInputStream(new File(path)); workbook = new XSSFWorkbook(is); } if(path.endsWith(EXCEL2003)){ FileInputStream is = new FileInputStream(new File(path)); workbook = new HSSFWorkbook(is); } if(workbook != null){ //类映射 注解 value-->bean columns Map<String, List<Field>> classMap = new HashMap<>(); Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { ExcelColumn annotation = field.getAnnotation(ExcelColumn.class); if(annotation != null){ String value = annotation.value(); if(StringUtils.isBlank(value)){ continue; } if(!classMap.containsKey(value)){ classMap.put(value, new ArrayList<>()); } field.setAccessible(true); classMap.get(value).add(field); } } //索引-->columns Map<Integer, List<Field>> reflectionMap = new HashMap<>(); Sheet sheet = workbook.getSheetAt(0);//默认读取第一个sheet boolean firstRow = true; for (int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i++) { Row row = sheet.getRow(i); if(firstRow){//首行 提取注解 for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) { Cell cell = row.getCell(j); String cellValue = getCellValue(cell); if(classMap.containsKey(cellValue)){ reflectionMap.put(j, classMap.get(cellValue)); } } firstRow = false; }else{ if(row == null){//忽略空白行 continue; } try { T t = cls.newInstance(); boolean allBlank = true;//判断是否为空白行 for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) { if(reflectionMap.containsKey(j)){ Cell cell = row.getCell(j); String cellValue = getCellValue(cell); if(StringUtils.isNotBlank(cellValue)){ allBlank = false; } List<Field> fieldList = reflectionMap.get(j); for (Field field : fieldList) { try { handleField(t, cellValue, field); }catch (Exception e){ log.error(String.format("reflect field:%s value:%s exception!", field.getName(), cellValue), e); } } } } if(!allBlank){ dataList.add(t); }else{ log.warn(String.format("row:%s is blank ignore!", i)); } }catch (Exception e){ log.error(String.format("parse row:%s exception!", i), e); } } } } }catch (Exception e){ log.error(String.format("parse excel exception!"), e); }finally { if(workbook != null){ try { workbook.close(); }catch (Exception e){ } } } return dataList; } private static <T> void handleField(T t, String value, Field field) throws Exception { Class<?> type = field.getType(); if(type == null || type == void.class || StringUtils.isBlank(value)){ return; } if(type == Object.class){ field.set(t, value); }else if(type.getSuperclass() == null || type.getSuperclass() == Number.class){//数字类型 if(type == int.class || type == Integer.class){ field.set(t, NumberUtils.toInt(value)); }else if(type == long.class || type == Long.class){ field.set(t, NumberUtils.toLong(value)); }else if(type == byte.class || type == Byte.class){ field.set(t, NumberUtils.toByte(value)); }else if(type == short.class || type == Short.class){ field.set(t, NumberUtils.toShort(value)); }else if(type == double.class || type == Double.class){ field.set(t, NumberUtils.toDouble(value)); }else if(type == float.class || type == Float.class){ field.set(t, NumberUtils.toFloat(value)); }else if(type == char.class || type == Character.class){ field.set(t, CharUtils.toChar(value)); }else if(type == boolean.class){ field.set(t, BooleanUtils.toBoolean(value)); }else if(type == BigDecimal.class){ field.set(t, new BigDecimal(value)); } } else if(type == Boolean.class){ field.set(t, BooleanUtils.toBoolean(value)); } else if(type == Date.class){ field.set(t, DateFormatter.parser(value)); } else if(type == String.class){ field.set(t, value); }else{ Constructor<?> constructor = type.getConstructor(String.class); field.set(t, constructor.newInstance(value)); } } private static String getCellValue(Cell cell){ if(cell == null){ return ""; } if(cell.getCellType() == cell.CELL_TYPE_NUMERIC){ if(DateUtil.isCellDateFormatted(cell)){ return DateFormatter.longDate(DateUtil.getJavaDate(cell.getNumericCellValue())); }else{ return new BigDecimal(cell.getNumericCellValue()).toString(); } }else if(cell.getCellType() == cell.CELL_TYPE_STRING){ return StringUtils.trimToEmpty(cell.getStringCellValue()); }else if(cell.getCellType() == cell.CELL_TYPE_FORMULA){ return StringUtils.trimToEmpty(cell.getCellFormula()); }else if(cell.getCellType() == cell.CELL_TYPE_BLANK){ return ""; }else if(cell.getCellType() == cell.CELL_TYPE_BOOLEAN){ return String.valueOf(cell.getBooleanCellValue()); }else if(cell.getCellType() == cell.CELL_TYPE_ERROR){ return "ERROR"; }else{ return cell.toString().trim(); } } public static <T> void writeExcel(String path, List<T> dataList, Class<T> cls) { Field[] fields = cls.getDeclaredFields(); List<Field> fieldList = Arrays.stream(fields).filter(field->{ ExcelColumn annotation = field.getAnnotation(ExcelColumn.class); if(annotation != null && annotation.col() > 0) { field.setAccessible(true); return true; } return false; }).sorted(Comparator.comparing(field->{ int col = 0; ExcelColumn annotation = field.getAnnotation(ExcelColumn.class); if(annotation != null){ col = annotation.col(); } return col; })).collect(Collectors.toList()); Workbook wb = new XSSFWorkbook(); Sheet sheet = wb.createSheet("demo sheet"); AtomicInteger ai = new AtomicInteger(); { Row row = sheet.createRow(ai.getAndIncrement()); AtomicInteger aj = new AtomicInteger(); //写入头部 fieldList.forEach(field->{ ExcelColumn annotation = field.getAnnotation(ExcelColumn.class); String columnName = ""; if(annotation != null){ columnName = annotation.value(); } Cell cell = row.createCell(aj.getAndIncrement()); CellStyle cellStyle = wb.createCellStyle(); cellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex()); cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); cellStyle.setAlignment(CellStyle.ALIGN_CENTER); Font font = wb.createFont(); font.setBoldweight(Font.BOLDWEIGHT_BOLD); cellStyle.setFont(font); cell.setCellStyle(cellStyle); cell.setCellValue(columnName); }); } if(CollectionUtils.isNotEmpty(dataList)){ dataList.forEach(t->{ Row row = sheet.createRow(ai.getAndIncrement()); AtomicInteger aj = new AtomicInteger(); fieldList.forEach(field->{ Class<?> type = field.getType(); Object value = ""; try { value = field.get(t); }catch (Exception e){ e.printStackTrace(); } Cell cell = row.createCell(aj.getAndIncrement()); if(value != null){ if(type == Date.class){ cell.setCellValue(DateFormatter.longDate((Date) value)); }else{ cell.setCellValue(value.toString()); } } }); }); } //冻结窗格 wb.getSheet("demo sheet").createFreezePane(0,1,0,1); File file = new File(path); if(file.exists()){ file.delete(); } try { wb.write(new FileOutputStream(file)); }catch (Exception e){ e.printStackTrace(); } } }
ExcelDemo
演示beanimport com.alibaba.fastjson.JSON; import lombok.Data; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; /** * Created by admin on 2017/1/17. */ @Data public class ExcelDemo { @ExcelColumn(value="ID", col=1) private int id; @ExcelColumn(value="名称", col=2) private String name; public static void main(String[] args){ long t1 = System.currentTimeMillis(); ExcelUtils.writeExcel(".\\test.xlsx", IntStream.rangeClosed(1,10).mapToObj(i->{ ExcelDemo excelDemo = new ExcelDemo(); excelDemo.setId(i); excelDemo.setName(String.format("name-%s", i)); return excelDemo; }).collect(Collectors.toList()), ExcelDemo.class); long t2 = System.currentTimeMillis(); System.out.println(String.format("write over! cost:%sms", (t2-t1))); long t3 = System.currentTimeMillis(); System.out.println(String.format("read over! cost:%sms", (t3-t2))); List<ExcelDemo> excelDemos = ExcelUtils.readExcel(".\\test.xlsx", ExcelDemo.class); excelDemos.stream().forEach(b->System.out.println(JSON.toJSONString(b, true))); } }
输出结果
write over! cost:907ms { "id":1, "name":"name-1" } { "id":2, "name":"name-2" } { "id":3, "name":"name-3" } { "id":4, "name":"name-4" } { "id":5, "name":"name-5" } { "id":6, "name":"name-6" } { "id":7, "name":"name-7" } { "id":8, "name":"name-8" } { "id":9, "name":"name-9" } { "id":10, "name":"name-10" } read over! cost:136ms
相关文章推荐
- jsp利用POI生成Excel并在页面中导出的示例
- Android SDK 百度地图通过poi城市内检索简介接口的使用
- Android实现带列表的地图POI周边搜索功能
- Android百度地图poi范围搜索
- Android 百度地图POI搜索功能实例代码
- Java利用POI实现导入导出Excel表格示例代码
- Java使用poi操作excel实例解析
- POI对Excel自定义日期格式的读取(实例代码)
- Java 使用poi把数据库中数据导入Excel的解决方法
- JAVA使用POI获取Excel的列数与行数
- 详解poi+springmvc+springjdbc导入导出excel实例
- java的poi技术读取和导入Excel实例
- java POI解析Excel 之数据转换公用方法(推荐)
- java使用POI读取properties文件并写到Excel的方法
- java使用poi读取ppt文件和poi读取excel、word示例
- Java使用poi将word转换为html
- java Apache poi 对word doc文件进行读写操作
- Java中使用Apache POI读取word文件简单示例
- POI WORD