zoukankan      html  css  js  c++  java
  • 封装下Excel导出

    1. 使用方法

    1.1 对象使用注解

    @ExcelColumn(name = "页面1",freeze = "0,1,1,2",autoWidth=true)
    public class ProductExcelSheetOneVO {
       private Long id;
    
        /**
         * 订单号
         */
        @ExcelColumn(name = "服单订单号", order = 1, hyperLinkTemplate = "https://xxx?code={}&test={}", hyperLinkPattern = {"orderCode","id"})
        private String orderCode;
    }
    

      

    1.2 构造数据

    List<Object> sheetOneVOS = Lists.newArrayList();
    List<Object> sheetTwoVOS = Lists.newArrayList();
    ExcelExportUtil.exportExcelStram(response.getOutputStream(), Lists.newArrayList(sheetData,sheetData2));

    2. 注解

    @Target({ElementType.TYPE, ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ExcelColumn {
        String name();
    
        String hyperLinkTemplate() default "";
    
        String[] hyperLinkPattern() default {};
    
        int order() default 0;
    
        String datePattern() default "yyyy-MM-dd HH:mm:ss";
    
        /**
         * 冻结表头
         * 有则为启用
         * 格式为   1,2
         *  或     1,2,3,4
         * @return
         */
        String freeze() default "";
    
        boolean autoWidth() default false;
    }

    3. 执行方法

    public class ExcelExportUtil {
    
    
        /**
         * excel 文件输出
         *
         * @param outputStream
         * @param sheetList
         * @throws IOException
         */
        public static void exportExcelStram(OutputStream outputStream, List<Sheet> sheetList) throws IOException {
            HSSFWorkbook workbook = new HSSFWorkbook();
            sheetList.forEach(m -> initSheet(m.getContentList(), m.getClzz(), workbook));
            workbook.write(outputStream);
        }
    
        /**
         * 组织单sheet
         *
         * @param content
         * @param clzz
         * @param workbook
         */
        private static void initSheet(List<Object> content, Class clzz, HSSFWorkbook workbook) {
    
            /**
             * get excel header from annotation
             */
            List<Head> header = Lists.newArrayList();
            Field[] fields = clzz.getDeclaredFields();
            /**
             * init header
             */
            Map<String, Head> headMap = initHeader(header, fields);
    
            HSSFSheet sheet;
            ExcelColumn rowColumn = (ExcelColumn) clzz.getAnnotation(ExcelColumn.class);
    
            if (rowColumn != null) {
                sheet = workbook.createSheet(rowColumn.name());
            } else {
                sheet = workbook.createSheet();
            }
            Method[] methods = clzz.getDeclaredMethods();
            Map<String, Method> methodMap = Maps.uniqueIndex(Lists.newArrayList(methods), input -> input.getName().toLowerCase());
    
            /**
             * init header
             */
            AtomicInteger rowIndex = new AtomicInteger(0);
            HSSFRow headerRow = sheet.createRow(rowIndex.getAndAdd(1));
            AtomicInteger headerIndex = new AtomicInteger(0);
            header.forEach((k) -> {
                HSSFCell cell = headerRow.createCell(headerIndex.getAndAdd(1));
                cell.setCellValue(k.getTitle());
            });
            /**
             * init content
             */
            Collections.synchronizedList(content).parallelStream().forEach(m -> {
    
                Map<String, Object> contentMap = Maps.newHashMap();
                for (int i = 0; i < fields.length; i++) {
                    if (!headMap.keySet().contains(fields[i].getName())) {
                        continue;
                    }
                    fields[i].setAccessible(true);
                    Object val = null;
                    try {
    //                    val = fields[i].get(m);
                        //get val from get method
                        System.out.println(fields[i].getName());
                        val = methodMap.get("get" + fields[i].getName().toLowerCase()).invoke(m);
                    } catch (Exception e) {
                        e.printStackTrace();
                        continue;
                    }
                    if (fields[i].getType() == Date.class) {
                        contentMap.put(fields[i].getName(), HikDateUtils.getDateString((Date) val, headMap.get(fields[i].getName()).getDatePattern()));
                    } else if (fields[i].getType() == BigDecimal.class) {
                        contentMap.put(fields[i].getName(), String.valueOf(val));
                    } else {
                        contentMap.put(fields[i].getName(), val == null ? "" : String.valueOf(val));
                    }
                }
                HSSFRow row = sheet.createRow(rowIndex.getAndAdd(1));
                AtomicInteger cellIndex = new AtomicInteger(0);
                header.forEach((k) -> {
                    HSSFCell cell = row.createCell(cellIndex.getAndAdd(1));
                    cell.setCellValue(contentMap.get(k.getCode()) + "");
    
                    if (!StringUtils.isEmpty(k.getHyperlinkTemplate())) {
                        String hyLink = HikStringUtils.append(k.getHyperlinkTemplate(), Lists.newArrayList(k.getHyperlinkPattern()).stream().map(p ->
                                contentMap.get(p) == null ? "" : contentMap.get(p).toString()
                        ).toArray());
    
                        HSSFHyperlink link = new HSSFHyperlink(HSSFHyperlink.LINK_URL);
                        link.setAddress(hyLink);
                        cell.setHyperlink(link);
                    }
                });
            });
            /**
             * auto width
             */
            if (rowColumn.autoWidth()) {
                for (int i = 0; i < content.size(); i++) {
                    sheet.autoSizeColumn(i, true);
                }
            }
            if (!StringUtils.isEmpty(rowColumn.freeze())) {
                String[] freezeArray = rowColumn.freeze().split(BaseConstants.SPLITER);
                if (freezeArray.length == 2) {
                    sheet.createFreezePane(Integer.parseInt(freezeArray[0]), Integer.parseInt(freezeArray[1]));
                }
                if (freezeArray.length == 4) {
                    sheet.createFreezePane(Integer.parseInt(freezeArray[0]), Integer.parseInt(freezeArray[1]), Integer.parseInt(freezeArray[2]), Integer.parseInt(freezeArray[3]));
                }
    
            }
        }
    
        private static Map<String, Head> initHeader(List<Head> header, Field[] fields) {
            for (int i = 0; i < fields.length; i++) {
                fields[i].setAccessible(true);
                ExcelColumn excelColumn = fields[i].getAnnotation(ExcelColumn.class);
                if (excelColumn == null) {
                    continue;
                }
                header.add(new Head(fields[i].getName(), excelColumn.name(), excelColumn.order(), excelColumn.datePattern(), excelColumn.hyperLinkTemplate(), excelColumn.hyperLinkPattern()));
            }
            Collections.sort(header);
            return Maps.uniqueIndex(header, Head::getCode);
        }
    
        public static class Sheet {
            public Sheet(List<Object> contentList, Class clzz) {
                this.contentList = contentList;
                this.clzz = clzz;
            }
    
            private List<Object> contentList;
            private Class clzz;
    
            public List<Object> getContentList() {
                return contentList;
            }
    
            public void setContentList(List<Object> contentList) {
                this.contentList = contentList;
            }
    
            public Class getClzz() {
                return clzz;
            }
    
            public void setClzz(Class clzz) {
                this.clzz = clzz;
            }
        }
    
        public static class Head implements Comparable<Head> {
            /**
             * code
             */
            private String code;
            /**
             * title
             */
            private String title;
            /**
             * order
             */
            private Integer order;
            /**
             * hyper link template
             */
            private String hyperlinkTemplate;
            /**
             * hyper link pattern
             */
            private String[] hyperlinkPattern;
            /**
             * date format
             */
            private String datePattern;
    
            /**
             * @param title
             * @param template
             * @param patten
             */
            public Head(String code, String title, Integer order, String datePattern, String template, String... patten) {
                this.code = code;
                this.title = title;
                this.order = order;
                this.datePattern = datePattern;
                this.hyperlinkTemplate = template;
                this.hyperlinkPattern = patten;
            }
    
            public Head(String code, String title, Integer order) {
                this.code = code;
                this.title = title;
                this.order = order;
            }
    
            public Integer getOrder() {
                return order;
            }
    
            public void setOrder(Integer order) {
                this.order = order;
            }
    
            public String getCode() {
                return code;
            }
    
            public void setCode(String code) {
                this.code = code;
            }
    
            public String getTitle() {
                return title;
            }
    
            public String getHyperlinkTemplate() {
                return hyperlinkTemplate;
            }
    
            public String[] getHyperlinkPattern() {
                return hyperlinkPattern;
            }
    
            public String getDatePattern() {
                return datePattern;
            }
    
            public void setDatePattern(String datePattern) {
                this.datePattern = datePattern;
            }
    
            @Override
            public int compareTo(Head o) {
                return this.getOrder().compareTo(o.getOrder());
            }
        }
    }
  • 相关阅读:
    一道模拟赛题
    Codechef Union on Tree
    BZOJ3435: [Wc2014]紫荆花之恋
    BZOJ3924: [Zjoi2015]幻想乡战略游戏
    BZOJ4372: 烁烁的游戏
    BZOJ3730: 震波
    BZOJ4317: Atm的树+2051+2117
    [六省联考2017]相逢是问候(扩展欧拉定理+预处理幂)
    「BJOI2018」治疗之雨(概率+高斯消元转递推)
    「BJOI2018」链上二次求和(线段树)
  • 原文地址:https://www.cnblogs.com/lobin/p/10554748.html
Copyright © 2011-2022 走看看