栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

excel导入导出

excel导入导出

poi简单搭建详解

apache poi官网:https://poi.apache.org/(基础架子拿来就能用,特殊功能请参阅官方文档)


        
        
            org.apache.poi
            poi
            3.9
        
        
        
            org.apache.poi
            poi-ooxml
            3.9
        

        
        
            joda-time
            joda-time
            2.10.1
        

        
            junit
            junit
            4.12
        
    
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.junit.Test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class UseExcelForPOI {
   private String userDir = System.getProperty("user.dir");
   //使用POI进行简单得写操作
   @Test
   public void test03_07ExcelWrite(){
       //创建工作簿03|07 07将所有得HSSF换成XSSF即可
       HSSFWorkbook workbook = new HSSFWorkbook();
       //创建工作表(sheet)
       HSSFSheet sheet = workbook.createSheet("sheet1");
       //创建一行并将一些单元格放入其中。行是基于 0 的。
       HSSFRow row = sheet.createRow(0);
       //创建一个单元格并在其中放入一个值。
       row.createCell(0).setCellValue("商品名称");
       row.createCell(1).setCellValue("比巴伯");

       //第二行
       HSSFRow row1 = sheet.createRow(1);
       row1.createCell(0).setCellValue("价格");
       row1.createCell(1).setCellValue("0.5");

       //写入文件
       FileOutputStream fo = null;
       try {
           //03版本后缀xls,07版本后缀xlsx
           fo = new FileOutputStream(new File(userDir + "/商品信息表.xls"));
           workbook.write(fo);
       } catch (Exception e) {
           e.printStackTrace();
       } finally {
           try {
               fo.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
   }
}
(之前为简单示例)数据批量导入

大文件写HSSF

缺点:最多只能处理65536行,超出抛异常
优点:过程中写入缓存,不操作磁盘,最后一次写入磁盘,速度快

 @Test
    public void mul03ExcelTest() {
        //统计开始时间
        long start= System.currentTimeMillis();
        //创建工作簿03
        Workbook workbook = new HSSFWorkbook();
        //创建工作表(sheet)
        Sheet sheet = workbook.createSheet("sheet1");
        //对65535行单元格进行赋值,此处不能使用链式编程,会导致前面单元格没值;65536会报错
        for (int i = 0; i < 65535 ; i++) {
            Row row = sheet.createRow(i);
            for (int j = 0; j < 10; j++) {
                row.createCell(j)
                        .setCellValue(j);
            }
        }
        //写入文件
        FileOutputStream fo = null;
        try {
            //03版本后缀xls,07版本后缀xlsx
            fo = new FileOutputStream(new File(userDir + "/商品信息表.xls"));
            workbook.write(fo);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                fo.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //统计结束时间
        long end= System.currentTimeMillis();
        System.out.println((end-start)/1000.0);
    }
    
运行结果:1.32

Process finished with exit code 0

大文件写XSSF

缺点:写数据速度非常慢,非常耗内存,由于会将写入得数据都暂存在内存中最后一次性写入磁盘,所以会发生内存溢出
优点:可以写较大数据量文件,写入数量看计算机内存。

    @Test
    public void mul03_07ExcelTest() {
        //统计开始时间
        long start= System.currentTimeMillis();
        //创建工作簿03|07 07将所有得HSSF换成XSSF即可
        Workbook workbook = new XSSFWorkbook();
        //创建工作表(sheet)
        Sheet sheet = workbook.createSheet("sheet1");
        //对65535行单元格进行赋值,此处不能使用链式编程,会导致前面单元格没值
        for (int i = 0; i < 65535 ; i++) {
            Row row = sheet.createRow(i);
            for (int j = 0; j < 10; j++) {
                row.createCell(j)
                        .setCellValue(j);
            }
        }
        //写入文件
        FileOutputStream fo = null;
        try {
            //03版本后缀xls,07版本后缀xlsx
            fo = new FileOutputStream(new File(userDir + "/商品信息表.xlsx"));
            workbook.write(fo);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                fo.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //统计结束时间
        long end= System.currentTimeMillis();
        System.out.println((end-start)/1000.0);
    }

运行结果:7.454

Process finished with exit code 0

大文件写SXSSF(XSSF优化)

优点:是XSSF得优化方案,写速度快,占用更少内存,可以写大数据量到excel,如100万条或者更多
注意:
1.过程中会产生临时文件,需要清理临时文件
2.默认有100条记录被保存在内存中,超过数量,将会将前面得100条数据全部写入临时文件
3.想要自定义内存数据量,可以使用new SXSSFWorkbook(数量)

 @Test
    public void mul07SuperExcelTest() {
        //统计开始时间
        long start= System.currentTimeMillis();
        //创建工作簿03
        Workbook workbook = new SXSSFWorkbook();
        //创建工作表(sheet)
        Sheet sheet = workbook.createSheet("sheet1");
        //对65535行单元格进行赋值,此处不能使用链式编程,会导致前面单元格没值;65536会报错
        for (int i = 0; i < 65535 ; i++) {
            Row row = sheet.createRow(i);
            for (int j = 0; j < 10; j++) {
                row.createCell(j)
                        .setCellValue(j);
            }
        }
        //写入文件
        FileOutputStream fo = null;
        try {
            //03版本后缀xls,07版本后缀xlsx
            fo = new FileOutputStream(new File(userDir + "/商品信息表.xlsx"));
            workbook.write(fo);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                //释放临时文件
                ((SXSSFWorkbook) workbook).dispose();
                //释放资源
                fo.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //统计结束时间
        long end= System.currentTimeMillis();
        System.out.println((end-start)/1000.0);
    }

运行结果:1.675

Process finished with exit code 0
POI实现读操作(通用,别问,问就是你随意整个excel第一行为表头就行,注意后缀名,03使用xls,HSSF;07使用xlsx,XSSF)
    @Test
    public void testCellType() throws Exception {

        InputStream is = new FileInputStream(userDir+"/food.xls");
        Workbook workbook = new HSSFWorkbook(is);
        Sheet sheet = workbook.getSheetAt(0);

        // 读取标题所有内容
        Row rowTitle = sheet.getRow(0);
        if (rowTitle != null) {// 行不为空
            // 读取cell
            int cellCount = rowTitle.getPhysicalNumberOfCells();
            for (int cellNum = 0; cellNum < cellCount; cellNum++) {
                Cell cell = rowTitle.getCell(cellNum);
                if (cell != null) {
                    int cellType = cell.getCellType();
                    String cellValue = cell.getStringCellValue();
                    System.out.print(cellValue + "|");
                }
            }
            System.out.println();
        }

        // 读取商品列表数据
        int rowCount = sheet.getPhysicalNumberOfRows();
        for (int rowNum = 1; rowNum < rowCount; rowNum++) {

            Row rowData = sheet.getRow(rowNum);
            if (rowData != null) {// 行不为空

                // 读取cell
                int cellCount = rowTitle.getPhysicalNumberOfCells();
                for (int cellNum = 0; cellNum < cellCount; cellNum++) {

                    System.out.print("【" + (rowNum + 1) + "-" + (cellNum + 1) + "】");

                    Cell cell = rowData.getCell(cellNum);
                    if (cell != null) {

                        int cellType = cell.getCellType();

                        //判断单元格数据类型
                        String cellValue = "";
                        switch (cellType) {
                            case HSSFCell.CELL_TYPE_STRING://字符串
                                System.out.print("【STRING】");
                                cellValue = cell.getStringCellValue();
                                break;

                            case HSSFCell.CELL_TYPE_BOOLEAN://布尔
                                System.out.print("【BOOLEAN】");
                                cellValue = String.valueOf(cell.getBooleanCellValue());
                                break;

                            case HSSFCell.CELL_TYPE_BLANK://空
                                System.out.print("【BLANK】");
                                break;

                            case HSSFCell.CELL_TYPE_NUMERIC:
                                System.out.print("【NUMERIC】");
                                //cellValue = String.valueOf(cell.getNumericCellValue());

                                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(HSSFCell.CELL_TYPE_STRING);
                                    cellValue = cell.toString();
                                }
                                break;

                            case Cell.CELL_TYPE_ERROR:
                                System.out.print("【数据类型错误】");
                                break;
                        }

                        System.out.println(cellValue);
                    }
                }
            }
        }

        is.close();
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/762361.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号