zoukankan      html  css  js  c++  java
  • excel poi

    依赖:

    <!--xls(03)-->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>4.1.2</version>
    </dependency>
    <!--xlsx(07)-->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.1.2</version>
    </dependency>

     

    导出excel

    导出操作,即使用 Java 写出数据到 Excel 中,常见场景是将页面上的数据导出,这些数据可能是财务数据,也可能是商品数据,生成 Excel 后返回给用户下载文件。

    在 poi 工具库中,导出 api 可以分三种方式

    • HSSF方式:这种方式导出的文件格式为office 2003专用格式,即.xls,优点是导出数据速度快,但是最多65536行数据
    • XSSF方式:这种方式导出的文件格式为office 2007专用格式,即.xlsx,优点是导出的数据不受行数限制,缺点导出速度慢
    • SXSSF方式:SXSSF 是 XSSF API的兼容流式扩展,主要解决当使用 XSSF 方式导出大数据量时,内存溢出的问题,支持导出大批量的excel数据
    HSSF方式导出

    HSSF方式,最多只支持65536条数据导出,超过这个条数会报错!

    public class ExcelWrite2003Test {
    
        public static String PATH = "execl/";
    
        public static void main(String[] args) throws Exception {
            //时间
            long begin = System.currentTimeMillis();
    
            //创建一个工作簿
            Workbook workbook = new HSSFWorkbook();
            //创建表
            Sheet sheet = workbook.createSheet();
            //写入数据
            for (int rowNumber = 0; rowNumber < 65536; rowNumber++) {
                //创建行
                Row row = sheet.createRow(rowNumber);
                for (int cellNumber = 0; cellNumber < 10; cellNumber++) {
                    //创建列
                    Cell cell = row.createCell(cellNumber);
                    cell.setCellValue(cellNumber);
                }
            }
            System.out.println("over");
    
            FileOutputStream fileOutputStream = new FileOutputStream(PATH + "用户信息表2003BigData.xls");
            workbook.write(fileOutputStream);
            fileOutputStream.close();
            long end = System.currentTimeMillis();
            System.out.println((double) (end - begin) / 1000);//4.29s
        }
    }
    XSSF方式导出

    XSSF方式支持大批量数据导出,所有的数据先写入内存再导出,容易出现内存溢出!

    public class ExcelWrite2007Test {
    
        public static String PATH = "execl/";
    
        public static void main(String[] args) throws Exception {
            //时间
            long begin = System.currentTimeMillis();
    
            //创建一个工作簿
            Workbook workbook = new XSSFWorkbook();
            //创建表
            Sheet sheet = workbook.createSheet();
            //写入数据
            for (int rowNumber = 0; rowNumber < 65537; rowNumber++) {
                Row row = sheet.createRow(rowNumber);
                for (int cellNumber = 0; cellNumber < 10; cellNumber++) {
                    Cell cell = row.createCell(cellNumber);
                    cell.setCellValue(cellNumber);
                }
            }
            System.out.println("over");
    
            FileOutputStream fileOutputStream = new FileOutputStream(PATH + "用户信息表2007BigData.xlsx");
            workbook.write(fileOutputStream);
            fileOutputStream.close();
            long end = System.currentTimeMillis();
            System.out.println((double) (end - begin) / 1000);//15.87s
        }
    }
    SXSSF方式导出

    SXSSF方式是XSSF方式的一种延伸,主要特性是低内存,导出的时候,先将数据写入磁盘再导出,避免报内存不足,导致程序运行异常,缺点是运行很慢!

    public class ExcelWriteSXSSFTest {
    
        public static String PATH = "execl/";
    
        public static void main(String[] args) throws Exception {
            //时间
            long begin = System.currentTimeMillis();
    
            //创建一个工作簿
            Workbook workbook = new SXSSFWorkbook();
    
            //创建表
            Sheet sheet = workbook.createSheet();
    
            //写入数据
            for (int rowNumber = 0; rowNumber < 100000; rowNumber++) {
                Row row = sheet.createRow(rowNumber);
                for (int cellNumber = 0; cellNumber < 10; cellNumber++) {
                    Cell cell = row.createCell(cellNumber);
                    cell.setCellValue(cellNumber);
                }
            }
            System.out.println("over");
    
            FileOutputStream fileOutputStream = new FileOutputStream(PATH + "用户信息表2007BigDataS.xlsx");
            workbook.write(fileOutputStream);
            fileOutputStream.close();
    
    
            long end = System.currentTimeMillis();
            System.out.println((double) (end - begin) / 1000);//6.39s
        }
    }

     

    导入excel

    导入操作,即将 excel 中的数据采用java工具库将其解析出来,进而将 excel 数据写入数据库!

    同样,在 poi 工具库中,导入 api 也分三种方式,与上面的导出一一对应!

    HSSF方式导入
    public class ExcelRead2003Test {
    
        public static String PATH = "execl/";
    
        public static void main(String[] args) throws Exception {
            //获取文件流
            FileInputStream inputStream = new FileInputStream(PATH + "用户信息表2003BigData.xls");
    
            //1.创建工作簿,使用excel能操作的这边都看看操作
            Workbook workbook = new HSSFWorkbook(inputStream);
            //2.得到表
            Sheet sheet = workbook.getSheetAt(0);
            //3.得到行
            Row row = sheet.getRow(0);
            //4.得到列
            Cell cell = row.getCell(0);
            getValue(cell);
            inputStream.close();
        }
    
        public static void getValue(Cell cell) {
            //匹配类型数据
            if (cell != null) {
                CellType cellType = cell.getCellType();
                String cellValue = "";
                switch (cellType) {
                    case STRING: //字符串
                        System.out.print("[String类型]");
                        cellValue = cell.getStringCellValue();
                        break;
                    case BOOLEAN: //布尔类型
                        System.out.print("[boolean类型]");
                        cellValue = String.valueOf(cell.getBooleanCellValue());
                        break;
                    case BLANK: //
                        System.out.print("[BLANK类型]");
                        break;
                    case NUMERIC: //数字(日期、普通数字)
                        System.out.print("[NUMERIC类型]");
                        if (HSSFDateUtil.isCellDateFormatted(cell)) { //日期
                            System.out.print("[日期]");
                            Date date = cell.getDateCellValue();
                            cellValue = new DateTime(date).toString("yyyy-MM-dd");
                        } else {
                            //不是日期格式,防止数字过长
                            System.out.print("[转换为字符串输出]");
                            cell.setCellType(CellType.STRING);
                            cellValue = cell.toString();
                        }
                        break;
                    case ERROR:
                        System.out.print("[数据类型错误]");
                        break;
                }
                System.out.println(cellValue);
            }
        }
    }
    XSSF方式导入
    public class ExcelRead2007Test {
    
        public static String PATH = "execl/";
    
        public static void main(String[] args) throws Exception {
            //获取文件流
            FileInputStream inputStream = new FileInputStream(PATH + "用户信息表2007BigData.xlsx");
    
            //1.创建工作簿,使用excel能操作的这边都看看操作
            Workbook workbook = new XSSFWorkbook(inputStream);
            //2.得到表
            Sheet sheet = workbook.getSheetAt(0);
            //3.得到行
            Row row = sheet.getRow(0);
            //4.得到列
            Cell cell = row.getCell(0);
            getValue(cell);
            inputStream.close();
        }
    
    
        public static void getValue(Cell cell) {
            //匹配类型数据
            if (cell != null) {
                CellType cellType = cell.getCellType();
                String cellValue = "";
                switch (cellType) {
                    case STRING: //字符串
                        System.out.print("[String类型]");
                        cellValue = cell.getStringCellValue();
                        break;
                    case BOOLEAN: //布尔类型
                        System.out.print("[boolean类型]");
                        cellValue = String.valueOf(cell.getBooleanCellValue());
                        break;
                    case BLANK: //
                        System.out.print("[BLANK类型]");
                        break;
                    case NUMERIC: //数字(日期、普通数字)
                        System.out.print("[NUMERIC类型]");
                        if (HSSFDateUtil.isCellDateFormatted(cell)) { //日期
                            System.out.print("[日期]");
                            Date date = cell.getDateCellValue();
                            cellValue = new DateTime(date).toString("yyyy-MM-dd");
                        } else {
                            //不是日期格式,防止数字过长
                            System.out.print("[转换为字符串输出]");
                            cell.setCellType(CellType.STRING);
                            cellValue = cell.toString();
                        }
                        break;
                    case ERROR:
                        System.out.print("[数据类型错误]");
                        break;
                }
                System.out.println(cellValue);
            }
        }
    }
    SXSSF方式导入
    public class ExcelReadSXSSFTest {
    
        public static String PATH = "execl/";
    
        public static void main(String[] args) throws Exception {
            //获取文件流
    
            //1.创建工作簿,使用excel能操作的这边都看看操作
            OPCPackage opcPackage = OPCPackage.open(PATH + "用户信息表2007BigData.xlsx");
            XSSFReader xssfReader = new XSSFReader(opcPackage);
            StylesTable stylesTable = xssfReader.getStylesTable();
            ReadOnlySharedStringsTable sharedStringsTable = new ReadOnlySharedStringsTable(opcPackage);
            // 创建XMLReader,设置ContentHandler
            XMLReader xmlReader = SAXHelper.newXMLReader();
            xmlReader.setContentHandler(new XSSFSheetXMLHandler(stylesTable, sharedStringsTable, new SimpleSheetContentsHandler(), false));
            // 解析每个Sheet数据
            Iterator<InputStream> sheetsData = xssfReader.getSheetsData();
            while (sheetsData.hasNext()) {
                try (InputStream inputStream = sheetsData.next();) {
                    xmlReader.parse(new InputSource(inputStream));
                }
            }
        }
    
        /**
         * 内容处理器
         */
        public static class SimpleSheetContentsHandler implements XSSFSheetXMLHandler.SheetContentsHandler {
    
            protected List<String> row;
    
            /**
             * A row with the (zero based) row number has started
             *
             * @param rowNum
             */
            @Override
            public void startRow(int rowNum) {
                row = new ArrayList<>();
            }
    
            /**
             * A row with the (zero based) row number has ended
             *
             * @param rowNum
             */
            @Override
            public void endRow(int rowNum) {
                if (row.isEmpty()) {
                    return;
                }
                // 处理数据
                System.out.println(row.stream().collect(Collectors.joining("   ")));
            }
    
            /**
             * A cell, with the given formatted value (may be null),
             * and possibly a comment (may be null), was encountered
             *
             * @param cellReference
             * @param formattedValue
             * @param comment
             */
            @Override
            public void cell(String cellReference, String formattedValue, XSSFComment comment) {
                row.add(formattedValue);
            }
    
            /**
             * A header or footer has been encountered
             *
             * @param text
             * @param isHeader
             * @param tagName
             */
            @Override
            public void headerFooter(String text, boolean isHeader, String tagName) {
            }
        }
    
    }
  • 相关阅读:
    所谓的小项目
    PHP开发者常犯的10个MySQL错误
    这是掌握cookie最后的一个障碍
    Lua学习笔记(2)——table
    Corona Enterprise 引入第三方 jar 包
    Lua学习笔记(1)
    SQL分页查询笔记
    三两句记录设计模式(1)——简单工厂模式
    Window + Net + Corona + IOS PUSH
    IoC学习
  • 原文地址:https://www.cnblogs.com/ooo0/p/14591231.html
Copyright © 2011-2022 走看看