zoukankan      html  css  js  c++  java
  • hutool 解析 Excel

    package com.yq.utils;
    
    import cn.hutool.core.collection.CollUtil;
    import cn.hutool.core.io.IoUtil;
    import cn.hutool.json.JSONArray;
    import cn.hutool.poi.excel.ExcelReader;
    import cn.hutool.poi.excel.ExcelUtil;
    import cn.hutool.poi.excel.ExcelWriter;
    import cn.hutool.poi.excel.sax.Excel07SaxReader;
    import cn.hutool.poi.excel.sax.handler.RowHandler;
    import com.yq.exception.BizException;
    import com.yq.exception.ErrorMessagesEnum;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.web.multipart.MultipartFile;
    
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.stream.Collectors;
    
    /**
     * @author: wensm
     * @date: 2021/5/7 0007
     * @description: TODO
     **/
    @Slf4j
    public class ExcelUtils {
    
        private static List<List<Object>> lineList = new ArrayList<>();
    
        /**
         * excel 导出工具类
         *
         * @param response
         * @param fileName    文件名
         * @param projects    对象集合
         * @param columnNames 导出的excel中的列名
         * @param keys        对应的是对象中的字段名字
         * @throws IOException
         */
    //    public static void export(HttpServletResponse response, String fileName, ArrayList<Map<String, Object>> projects, String[] columnNames, String[] keys) throws IOException {
        public static void export(HttpServletResponse response, String fileName, List<?> projects, String[] keys, String[] columnNames) throws IOException {
    //        Map<String, Object> row1 = new LinkedHashMap<>();
    //        row1.put("姓名", "张三");
    //        row1.put("年龄", 23);
    //        row1.put("成绩", 88.32);
    //        row1.put("是否合格", true);
    //        row1.put("考试日期", DateUtil.date());
    //
    //        Map<String, Object> row2 = new LinkedHashMap<>();
    //        row2.put("姓名", "李四");
    //        row2.put("年龄", 33);
    //        row2.put("成绩", 59.50);
    //        row2.put("是否合格", false);
    //        row2.put("考试日期", DateUtil.date());
    //
    //        ArrayList<Map<String, Object>> rows = CollUtil.newArrayList(row1, row2);
    
            ExcelWriter bigWriter = ExcelUtil.getBigWriter();
    //        ExcelWriter bigWriter = ExcelUtil.getWriter(true);
    
            for (int i = 0; i < keys.length; i++) {
                bigWriter.addHeaderAlias(keys[i], columnNames[i]);
                bigWriter.setColumnWidth(i, 20);
            }
    
            // 一次性写出内容,使用默认样式,强制输出标题
    //          bigWriter.write(rows, true);
            bigWriter.write(projects, true);
    
            //response为HttpServletResponse对象
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
    //        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
            //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
    //        String name = StringUtils.toUtf8String("申请学院");
            response.setHeader("Content-Disposition", "attachment;filename=" + new String((fileName + ".xlsx").getBytes(), "iso-8859-1"));
            ServletOutputStream out = response.getOutputStream();
            bigWriter.flush(out, true);
            // 关闭writer,释放内存
            bigWriter.close();
            //此处记得关闭输出Servlet流
            IoUtil.close(out);
        }
    
    
        /**
         * excel导入工具类
         *
         * @param file       文件
         * @return 返回数据集合
         * @throws BizException
         * @throws IOException
         */
        public static List<Map<String, Object>> leading(MultipartFile file) throws BizException, IOException {
            String fileName = file.getOriginalFilename();
            // 上传文件为空
            if (StringUtils.isEmpty(fileName)) {
                throw new BizException(ErrorMessagesEnum.OPERATION_NON_EXCEL_ERROR);
            }
            //上传文件大小为1000条数据
            if (file.getSize() > 1024 * 1024 * 10) {
                log.error("upload | 上传失败: 文件大小超过10M,文件大小为:{}", file.getSize());
                throw new BizException(ErrorMessagesEnum.OPERATION_LARGE_EXCEL_ERROR);
            }
            // 上传文件名格式不正确
            if (fileName.lastIndexOf(".") != -1 && !".xlsx".equals(fileName.substring(fileName.lastIndexOf(".")))) {
                throw new BizException(ErrorMessagesEnum.OPERATION_EXCEL_FORMAT_ERROR);
            }
    //        log.info("========columNames========{}",columnNames);
    //        //读取数据
    //        ExcelUtil.read07BySax(file.getInputStream(), 0, createRowHandler());
    //
    ////        Excel07SaxReader reader = new Excel07SaxReader(createRowHandler());
    ////        reader.read(file.getInputStream(),1);
    //
    //
    //        log.info("========lineList========{}",lineList.toString());
    //        //去除excel中的第一行数据
    //        lineList.remove(0);
    //
    //        //将数据封装到list<Map>中
    //        List<Map<String, Object>> dataList = new ArrayList<>();
    //        for (int i = 0; i < lineList.size(); i++) {
    //            if (null != lineList.get(i)) {
    //                Map<String, Object> hashMap = new HashMap<>();
    //                for (int j = 0; j < columNames.length; j++) {
    //                    Object property = lineList.get(i).get(j);
    //                    hashMap.put(columNames[j], property);
    //                }
    //                dataList.add(hashMap);
    //            } else {
    //                break;
    //            }
    //        }
    
    
    
    //        ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
    ////        reader.addHeaderAlias("学号", "sno");
    ////        reader.addHeaderAlias("姓名", "name");
    ////        reader.addHeaderAlias("年龄", "age");
    ////        reader.addHeaderAlias("性别", "gender");
    ////        reader.addHeaderAlias("籍贯", "nativePlace");
    ////        reader.addHeaderAlias("入学时间", "enrollmentTime");
    //
    //        for (int i = 0; i < columNames.length; i++) {
    //            reader.addHeaderAlias(columNames[i], keys[i]);
    //        }
    //        List dataList = new ArrayList();
    //        if(reader.getRowCount()>0) dataList = reader.read(1);
    //        dataList = reader.readAll();
    
            ExcelReader reader = ExcelUtil.getReader(file.getInputStream(),0);
            List<Map<String,Object>> dataList = reader.readAll();
    
            return dataList;
        }
    
        /**
         * excel导入工具类
         *
         * @param file       文件
         * @return 返回数据集合
         * @throws BizException
         * @throws IOException
         */
        public static List<Map<String, Object>> leading(MultipartFile file,Integer headerRowIndex, Integer startRowIndex) throws BizException, IOException {
            String fileName = file.getOriginalFilename();
            // 上传文件为空
            if (StringUtils.isEmpty(fileName)) {
                throw new BizException(ErrorMessagesEnum.OPERATION_NON_EXCEL_ERROR);
            }
            //上传文件大小为1000条数据
            if (file.getSize() > 1024 * 1024 * 10) {
                log.error("upload | 上传失败: 文件大小超过10M,文件大小为:{}", file.getSize());
                throw new BizException(ErrorMessagesEnum.OPERATION_LARGE_EXCEL_ERROR);
            }
            // 上传文件名格式不正确
            if (fileName.lastIndexOf(".") != -1 && !".xlsx".equals(fileName.substring(fileName.lastIndexOf(".")))) {
                throw new BizException(ErrorMessagesEnum.OPERATION_EXCEL_FORMAT_ERROR);
            }
    //        log.info("========columNames========{}",columnNames);
    //        //读取数据
    //        ExcelUtil.read07BySax(file.getInputStream(), 0, createRowHandler());
    //
    ////        Excel07SaxReader reader = new Excel07SaxReader(createRowHandler());
    ////        reader.read(file.getInputStream(),1);
    //
    //
    //        log.info("========lineList========{}",lineList.toString());
    //        //去除excel中的第一行数据
    //        lineList.remove(0);
    //
    //        //将数据封装到list<Map>中
    //        List<Map<String, Object>> dataList = new ArrayList<>();
    //        for (int i = 0; i < lineList.size(); i++) {
    //            if (null != lineList.get(i)) {
    //                Map<String, Object> hashMap = new HashMap<>();
    //                for (int j = 0; j < columNames.length; j++) {
    //                    Object property = lineList.get(i).get(j);
    //                    hashMap.put(columNames[j], property);
    //                }
    //                dataList.add(hashMap);
    //            } else {
    //                break;
    //            }
    //        }
    
    
    
    //        ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
    ////        reader.addHeaderAlias("学号", "sno");
    ////        reader.addHeaderAlias("姓名", "name");
    ////        reader.addHeaderAlias("年龄", "age");
    ////        reader.addHeaderAlias("性别", "gender");
    ////        reader.addHeaderAlias("籍贯", "nativePlace");
    ////        reader.addHeaderAlias("入学时间", "enrollmentTime");
    //
    //        for (int i = 0; i < columNames.length; i++) {
    //            reader.addHeaderAlias(columNames[i], keys[i]);
    //        }
    //        List dataList = new ArrayList();
    //        if(reader.getRowCount()>0) dataList = reader.read(1);
    //        dataList = reader.readAll();
    
            ExcelReader reader = ExcelUtil.getReader(file.getInputStream(),0);
    //        List<Map<String,Object>> dataList = reader.readAll();
            List<Map<String,Object>> dataList = reader.read(headerRowIndex,startRowIndex,reader.getRowCount());
            return dataList;
        }
    
        /**
         * excel导入工具类
         *
         * @param file       文件
         * @return 返回数据集合
         * @throws BizException
         * @throws IOException
         */
        public static List<Map<String, Object>> leadingSheets(MultipartFile file,Integer headerRowIndex, Integer startRowIndex) throws BizException, IOException {
            String fileName = file.getOriginalFilename();
            // 上传文件为空
            if (StringUtils.isEmpty(fileName)) {
                throw new BizException(ErrorMessagesEnum.OPERATION_NON_EXCEL_ERROR);
            }
            //上传文件大小为1000条数据
            if (file.getSize() > 1024 * 1024 * 10) {
                log.error("upload | 上传失败: 文件大小超过10M,文件大小为:{}", file.getSize());
                throw new BizException(ErrorMessagesEnum.OPERATION_LARGE_EXCEL_ERROR);
            }
            // 上传文件名格式不正确
            if (fileName.lastIndexOf(".") != -1 && !".xlsx".equals(fileName.substring(fileName.lastIndexOf(".")))) {
                throw new BizException(ErrorMessagesEnum.OPERATION_EXCEL_FORMAT_ERROR);
            }
    //        log.info("========columNames========{}",columnNames);
    //        //读取数据
    //        ExcelUtil.read07BySax(file.getInputStream(), 0, createRowHandler());
    //
    ////        Excel07SaxReader reader = new Excel07SaxReader(createRowHandler());
    ////        reader.read(file.getInputStream(),1);
    //
    //
    //        log.info("========lineList========{}",lineList.toString());
    //        //去除excel中的第一行数据
    //        lineList.remove(0);
    //
    //        //将数据封装到list<Map>中
    //        List<Map<String, Object>> dataList = new ArrayList<>();
    //        for (int i = 0; i < lineList.size(); i++) {
    //            if (null != lineList.get(i)) {
    //                Map<String, Object> hashMap = new HashMap<>();
    //                for (int j = 0; j < columNames.length; j++) {
    //                    Object property = lineList.get(i).get(j);
    //                    hashMap.put(columNames[j], property);
    //                }
    //                dataList.add(hashMap);
    //            } else {
    //                break;
    //            }
    //        }
    
    
    
    //        ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
    ////        reader.addHeaderAlias("学号", "sno");
    ////        reader.addHeaderAlias("姓名", "name");
    ////        reader.addHeaderAlias("年龄", "age");
    ////        reader.addHeaderAlias("性别", "gender");
    ////        reader.addHeaderAlias("籍贯", "nativePlace");
    ////        reader.addHeaderAlias("入学时间", "enrollmentTime");
    //
    //        for (int i = 0; i < columNames.length; i++) {
    //            reader.addHeaderAlias(columNames[i], keys[i]);
    //        }
    //        List dataList = new ArrayList();
    //        if(reader.getRowCount()>0) dataList = reader.read(1);
    //        dataList = reader.readAll();
            ExcelReader reader1 =  ExcelUtil.getReader(file.getInputStream());
    //        ExcelReader reader = ExcelUtil.getReader(file.getInputStream(),0);
            int sheetCount = reader1.getSheetCount();
            log.info("================sheetCount========={}",sheetCount);
            List<Map<String,Object>> dataList = new ArrayList<>();
            for(int i=0;i<sheetCount;i++){
                ExcelReader reader = ExcelUtil.getReader(file.getInputStream(),i);
                dataList.addAll(reader.read(headerRowIndex,startRowIndex,reader.getRowCount()));
            }
    //        List<Map<String,Object>> dataList = reader.readAll();
    //        dataList = reader.read(headerRowIndex,startRowIndex,reader.getRowCount());
            return dataList;
        }
    
        /**
         * 通过实现handle方法编写我们要对每行数据的操作方式
         */
        private static RowHandler createRowHandler() {
            //清空一下集合中的数据
            lineList.removeAll(lineList);
    //        log.info("====remove====lineList========{}",lineList.toString());
            return new RowHandler() {
                @Override
                public void handle(int i, long l, List<Object> list) {
    //                log.info("====add====list========{}",list.toString());
                    //将读取到的每一行数据放入到list集合中
                    JSONArray jsonObject = new JSONArray(list);
                    lineList.add(jsonObject.toList(Object.class));
    //                log.info("====add====lineList========{}",lineList.toString());
                }
    //            @Override
    //            public void handle(int sheetIndex, int rowIndex, List rowlist) {
    //                //将读取到的每一行数据放入到list集合中
    //                JSONArray jsonObject = new JSONArray(rowlist);
    //                lineList.add(jsonObject.toList(Object.class));
    //            }
            };
        }
    }
  • 相关阅读:
    位运算大集合
    一道百度面试题——位运算
    一道Google面试题——基数排序思想
    ubuntu12.04 安装nginx+php+mysql (lnmp)的web服务器环境
    Linux常用命令及Vim使用
    Gcc手册(转)
    C语言标准
    匈牙利游戏(次短路问题)
    高级打字机
    矩阵乘法
  • 原文地址:https://www.cnblogs.com/mingforyou/p/14785784.html
Copyright © 2011-2022 走看看