zoukankan      html  css  js  c++  java
  • poi 工具类

     <!--POI-->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>4.0.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>4.0.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml-schemas</artifactId>
                <version>4.0.1</version>
            </dependency>
    
    • ExcelAttribute:
    /**
     * 自定义注解
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface ExcelAttribute {
        //对应的列名称
        String name() default ""; // default java8新特性
        //列序号
        int sort();
        //字段类型对应的格式
        String format() default "";
    }
    
    
    • ExcelExportUtil:
    /**
     * 导出
     */
    @Getter
    @Setter
    public class ExcelExportUtil<T> {
    
        private int rowIndex;
        private int styleIndex;
        private String templatePath;
        private Class clazz;
        private  Field fields[];
    
        public ExcelExportUtil(Class clazz,int rowIndex,int styleIndex) {
            this.clazz = clazz;
            this.rowIndex = rowIndex;
            this.styleIndex = styleIndex;
            fields = clazz.getDeclaredFields();//获取声明字段
        }
    
        /**
         * 基于注解导出
         */
        public void export(HttpServletResponse response,InputStream is, List<T> objs,String fileName) throws Exception {
    
            XSSFWorkbook workbook = new XSSFWorkbook(is);
            Sheet sheet = workbook.getSheetAt(0);
    
            CellStyle[] styles = getTemplateStyles(sheet.getRow(styleIndex));
    
            AtomicInteger datasAi = new AtomicInteger(rowIndex);
            for (T t : objs) {
                Row row = sheet.createRow(datasAi.getAndIncrement());
                for(int i=0;i<styles.length;i++) {
                    Cell cell = row.createCell(i);
                    cell.setCellStyle(styles[i]);
                    for (Field field : fields) {
                        if(field.isAnnotationPresent(ExcelAttribute.class)){
                            field.setAccessible(true);
                            ExcelAttribute ea = field.getAnnotation(ExcelAttribute.class);
                            if(i == ea.sort()) { //列序号
                                cell.setCellValue(field.get(t).toString());
                            }
                        }
                    }
                }
            }
            fileName = URLEncoder.encode(fileName, "UTF-8");
            response.setContentType("application/octet-stream");
            response.setHeader("content-disposition", "attachment;filename=" + new String(fileName.getBytes("ISO8859-1")));
            response.setHeader("filename", fileName);
            workbook.write(response.getOutputStream());
        }
    
        public CellStyle[] getTemplateStyles(Row row) {
            CellStyle [] styles = new CellStyle[row.getLastCellNum()];
            for(int i=0;i<row.getLastCellNum();i++) {
                styles[i] = row.getCell(i).getCellStyle();
            }
            return styles;
        }
    }
    
    • ExcelImportUtil:
    
    public class ExcelImportUtil<T> {
     
        private Class clazz;
        private  Field fields[];
     
        public ExcelImportUtil(Class clazz) {
            this.clazz = clazz;
            fields = clazz.getDeclaredFields();
        }
     
        /**
         * 基于注解读取excel
         */
        public List<T> readExcel(InputStream is, int rowIndex,int cellIndex) {
            List<T> list = new ArrayList<T>();
            T entity = null;
            try {
                XSSFWorkbook workbook = new XSSFWorkbook(is);
                Sheet sheet = workbook.getSheetAt(0);
                // 不准确
                int rowLength = sheet.getLastRowNum();
    
                System.out.println(sheet.getLastRowNum());
                for (int rowNum = rowIndex; rowNum <= sheet.getLastRowNum(); rowNum++) {
                    Row row = sheet.getRow(rowNum);
                    entity = (T) clazz.newInstance();
                    System.out.println(row.getLastCellNum());
                    for (int j = cellIndex; j < row.getLastCellNum(); j++) {
                        Cell cell = row.getCell(j);
                        for (Field field : fields) {
                            if(field.isAnnotationPresent(ExcelAttribute.class)){
                                field.setAccessible(true);
                                ExcelAttribute ea = field.getAnnotation(ExcelAttribute.class);
                                if(j == ea.sort()) {
                                    field.set(entity, covertAttrType(field, cell));
                                }
                            }
                        }
                    }
                    list.add(entity);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return list;
        }
     
    
        /**
         * 类型转换 将cell 单元格格式转为 字段类型
         */
        private Object covertAttrType(Field field, Cell cell) throws Exception {
            String fieldType = field.getType().getSimpleName();
            if ("String".equals(fieldType)) {
                return getValue(cell);
            }else if ("Date".equals(fieldType)) {
                return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(getValue(cell)) ;
            }else if ("int".equals(fieldType) || "Integer".equals(fieldType)) {
                return Integer.parseInt(getValue(cell));
            }else if ("double".equals(fieldType) || "Double".equals(fieldType)) {
                return Double.parseDouble(getValue(cell));
            }else {
                return null;
            }
        }
     
     
        /**
         * 格式转为String
         * @param cell
         * @return
         */
        public String getValue(Cell cell) {
            if (cell == null) {
                return "";
            }
            switch (cell.getCellType()) {
                case STRING:
                    return cell.getRichStringCellValue().getString().trim();
                case NUMERIC:
                    if (DateUtil.isCellDateFormatted(cell)) {
                        Date dt = DateUtil.getJavaDate(cell.getNumericCellValue());
                        return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(dt);
                    } else {
                        // 防止数值变成科学计数法
                        String strCell = "";
                        Double num = cell.getNumericCellValue();
                        BigDecimal bd = new BigDecimal(num.toString());
                        if (bd != null) {
                            strCell = bd.toPlainString();
                        }
                        // 去除 浮点型 自动加的 .0
                        if (strCell.endsWith(".0")) {
                            strCell = strCell.substring(0, strCell.indexOf("."));
                        }
                        return strCell;
                    }
                case BOOLEAN:
                    return String.valueOf(cell.getBooleanCellValue());
                default:
                    return "";
            }
        }
    }
    
    • 注解实例:
        @ExcelAttribute(sort = 0)
        private String userId;
        @ExcelAttribute(sort = 1)
        private String username;
    
    • 导出实例:
            //加载模板流数据
            Resource resource = new ClassPathResource("excel-template/hr-demo.xlsx");
            FileInputStream fis = new FileInputStream(resource.getFile());
            new ExcelExportUtil(PoiEmployeeReportResult.class,2,2).export(response,fis,list,"报表.xlsx");
        
    
    • 导入实例:
       List list = new ExcelImportUtil(User.class).readExcel(file.getInputStream(), 1, 0);
    
  • 相关阅读:
    浏览器HTML5支持程度测试
    Unit testing Cmockery 简单使用
    Linux likely unlikely
    Android development tools line_endings hacking
    Linux C enum
    Android 系统内置App JNI
    Android Broadcast Receiver
    Android获取SharedPreferences失败,且App无法启动
    Sublime-text markdown with Vim mode and auto preview
    遍历Map key-value的两种方法
  • 原文地址:https://www.cnblogs.com/fly-book/p/10778935.html
Copyright © 2011-2022 走看看