美文网首页
原生POI导出-基础版

原生POI导出-基础版

作者: 渊默十三 | 来源:发表于2020-02-26 17:03 被阅读0次

    第一个版本,基础版

    package org.ctzk.jcpc.utils;
    
    import org.apache.poi.hssf.usermodel.HSSFDateUtil;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.ctzk.utils.DateUtil;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.io.*;
    import java.text.DecimalFormat;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    /**
     * com.lzctzk.guidepost.util
     * excel操作工具类
     * @author luozhen
     * @version V1.0
     * @date 2020-2-1 17:56
     * @description
     */
    
    public class ExcelUtilOld {
    
        private static final Logger log = LoggerFactory.getLogger(ExcelUtilOld.class);
    
        private static SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
        /**
         * 获取xlsx文件内容某个sheet(从0开始)的内容,以二维数组形式返回
         *
         * @param fileAbsolutePath xlsx文件的绝对路径
         * @return xlsx文件的文本内容
         */
        public static List<List<String>> getExcelData(String fileAbsolutePath) {
            /*
             * workbook:工作簿,就是整个Excel文档
             * sheet:工作表
             * row:行
             * cell:单元格
             */
            File file = new File(fileAbsolutePath);
            InputStream inputStream = null;
            //默认从第一个sheet开始读取
            int bookIndex = 0;
            try {
                //文件
                inputStream = new FileInputStream(file);
                Workbook book = null;
                if (fileAbsolutePath.endsWith(".xlsx")) {
                    book = new XSSFWorkbook(inputStream);
                } else if (fileAbsolutePath.endsWith(".xls")) {
                    book = new HSSFWorkbook(inputStream);
                }
                if (bookIndex >= book.getNumberOfSheets()) {
                    log.error("获取表格数据错误: bookIndex={},sheet的下标超出范围 ", bookIndex);
                    return null;
                }
                //sheet从0开始
                Sheet sheet = book.getSheetAt(bookIndex);
    
                //取得最后一行的行号
                int rowNum = sheet.getLastRowNum() + 1;
                //每行的最后一个单元格位置(默认选取第一行的长度)
                int cellNum = sheet.getRow(0).getLastCellNum();
                //创建二维数组保存所有读取到的行列数据,外层存行数据,内层存单元格数据
                List<List<String>> lists = new ArrayList<List<String>>();
                //设置读取开始的行数,从0(第一行)开始
                //第三层
                int startIndex = 2;
                //开始进行读取
                for (int rowIndex = startIndex; rowIndex < rowNum; rowIndex++) {
                    //行
                    Row row = sheet.getRow(rowIndex);
                    if (null != row) {
                        List<String> cellList = new ArrayList<String>();
                        for (int cellIndex = 0; cellIndex < cellNum; cellIndex++) {
                            Cell cell = row.getCell(cellIndex);
                            cellList.add(cellValueFormat(cell));
                        }
                        lists.add(cellList);
                    }
                }
                return lists;
            } catch (FileNotFoundException fe) {
                log.error("获取表格数据错误: FileNotFoundException", fe);
            } catch (IOException ie) {
                log.error("获取表格数据错误: IOException", ie);
            } finally {
                if (null != inputStream) {
                    try {
                        inputStream.close();
                    } catch (Exception e) {
                        log.error("获取表格数据关闭IO流异常", e);
                    }
                }
            }
            return null;
        }
    
        /**
         * 表格数据格式化
         * @param cell
         * @return
         */
        private static String cellValueFormat(Cell cell){
            String cellValue = null;
            if(null != cell){
                switch (cell.getCellType()){
                    case _NONE:
                        break;
                    //数值型
                    case NUMERIC:
                        //判断是日期类型
                        if (HSSFDateUtil.isCellDateFormatted(cell)) {
                            //获取成DATE类型
                            Date dt = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
                            cellValue = dateformat.format(dt);
                        }else{
                            //转化电话号码和身份证号码为字符串
                            DecimalFormat df = new DecimalFormat("#");
                            cellValue = String.valueOf(df.format(cell.getNumericCellValue()));
                        }
                        break;
                    //字符串型
                    case STRING:
                        cellValue = cell.getStringCellValue();
                        break;
                    //空值
                    case BLANK:
                        break;
                    //布尔型
                    case BOOLEAN:
                        cellValue = String.valueOf(cell.getBooleanCellValue());
                        break;
                    //公式型
                    case FORMULA:
                        cellValue = cell.getCellFormula();
                        break;
                    //错误
                    case ERROR:
                        break;
                    default:
                }
            }
            return cellValue;
        }
    
    
        /**
         * 保存上传的文件
         * @param multipartFile
         * @return
         * @throws Exception
         */
        public static String keepExcel(MultipartFile multipartFile)throws Exception{
            //文件参数整理
            //原始文件名
            String myFileName = multipartFile.getOriginalFilename();
            //文件大小
            String fileSize = multipartFile.getSize() + "";
            //文件名
            String fileNme = myFileName.substring(0, myFileName.lastIndexOf("."));
            //获取文件的后缀名
            String fileType = myFileName.substring(myFileName.lastIndexOf(".") + 1);
            //存储文件名(加上时间是为了保证文件的唯一名称)
            String saveName = fileNme + "-" + DateUtil.getStringAllDate();
            //存储文件全名称(压缩图片文件名)
            String saveFullName = saveName + "." + fileType;
            //创建存储文件夹
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
            String date = sdf.format(new Date());
            //存储文件夹路径
            //String fileFolder = "E:/Collection/files/" + date;
            String fileFolder = "/var/files/" + date;
            //相对存储路径
            String fileFpfName = fileFolder + "/" + saveFullName;
            File folder = new File(fileFolder);
            if (!folder.exists()) {
                folder.mkdirs();
            }
            //创建文件
            String filePath = "";
            filePath = fileFolder + "/" + saveFullName;
            File diskFile = new File(filePath);
            //写入文件
            multipartFile.transferTo(diskFile);
            //创建文件 不用检查文件是否存在,UUID能保证文件名的不重复性
            diskFile.createNewFile();
            return fileFpfName;
        }
    
    
    }
    

    相关文章

      网友评论

          本文标题:原生POI导出-基础版

          本文链接:https://www.haomeiwen.com/subject/rdbbchtx.html