excel导入和导出

excel导入导出

apache的POI

相关资源

官网:https://poi.apache.org/

maven依赖:

<!-- excel2003或以下版本(老版本)  -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>
<!-- excel2007或以上版本(新版本) -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>

认识excel

​ excel的2007版本是里程碑版本,之前的文件格式为.xls, 新版本的文件格式为.xlsx

​ 一个excel文档称之工作簿(book)

​ 一个工作簿(book)由多个表(sheet)组成

​ 一个表(sheet)由多行(row)组成

​ 一个行(row)由多单元格(cell)组成

​ 单元格中存放数据

简单的导出案例(写入Excel)

package  edu.nfit;

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.joda.time.DateTime;
import org.junit.Test;

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

public class EexcelWriteTest {
    static  String path="D:\\IdeaProjects\\poiDemo\\";//excel文件保存的路径(一个已经存在的路径)
    @Test
    public void WriteEcel() throws  Exception{
        //Workbook wb = new HSSFWorkbook();//创建一个工作簿03版本(老版)的excel表
        Workbook wb = new XSSFWorkbook();//创建一个工作簿07版本(新版)的excel表
        Sheet sheet = wb.createSheet("测试表");//创建一个工作表
        Row row1 = sheet.createRow(0);//创建第一行
        Cell c1 = row1.createCell(0);//创建第一个单元格
        c1.setCellValue("姓名");//设置第一个单元格数据
        Cell c2 = row1.createCell(1);
        c2.setCellValue("电话");
        Cell c3 = row1.createCell(2);
        c3.setCellValue("时间");

        //最添加一行
        Row row2 = sheet.createRow(1);
        Cell c21 = row2.createCell(0);
        c21.setCellValue("张三");
        Cell c22 = row2.createCell(1);
        c22.setCellValue("13012345678");
        Cell c23 = row2.createCell(2);
        c23.setCellValue(new DateTime().toString("yyyy-mm-dd"));//设置一个时间数据
       //使用输出流,写入数据到表格文件
       try( FileOutputStream out = new FileOutputStream(path+"text2.xlsx")){
           wb.write(out);
       }
        System.out.println("excel文件保存成功!");
    }
}

03和07版本的区别:

​ 1. 接口一样,实现类不同

​ 03的实现类HSSFWorkbook

​ 07的实现类XSSFWorkbook

​ 2.文件格式不一样

​ 03是.xls

​ 07是.xlsx

XSSFWorkbook实现类还有一个很致命的缺点:慢

可以改用SXSSFWorkbook类,但需要清除临时文件

来写10万行的导出案例:

public void WriteBigExcel() throws  Exception{
    long  start = System.currentTimeMillis();
    Workbook wb = new SXSSFWorkbook();//创建一个工作簿07版本(新版)的excel表
    Sheet sheet = wb.createSheet("测试表");//创建一个工作表
    for (int i = 0; i < 100000; i++) {
        Row row = sheet.createRow(i);//创建行
        for (int j = 0; j < 10; j++) {
            Cell cell = row.createCell(j);//创建单元格
            cell.setCellValue(j+1);
        }
    }

    //使用输出流,写入数据到表格文件
    try( FileOutputStream out = new FileOutputStream(path+"text2.xlsx")){
        wb.write(out);
    }
    ((SXSSFWorkbook) wb).dispose();//清除临时文件
    System.out.println("excel文件保存成功!");
    long end = System.currentTimeMillis();
    System.out.println("共用时"+(double)(end-start)/1000+"秒");
}
/*设置日期格式*/
CellStyle cell_Date = book.createCellStyle();
DataFormat format= book.createDataFormat();
cell_Date.setDataFormat(format.getFormat("yyyy/m/d"));
cell23.setCellStyle(cell_Date);

简单的导入案例(读取Excel)

 File file = new File("C:\\Users\\dell\\Desktop\\班级信息.xlsx");
        //获得该文件的输入流
        FileInputStream stream = new FileInputStream(file);
        // 多态  抛异常
        Workbook sheets = new XSSFWorkbook(stream);
        //获取一个工作表(sheet页),下标从0开始
        Sheet sheet = sheets.getSheetAt(0);
        for (int i = 1; i<=sheet.getLastRowNum() ; i++) {


            // 获取行数
            Row row = sheet.getRow(i);
            // 获取单元格 取值
            String value1 = row.getCell(0).getStringCellValue();
            String value2 = row.getCell(1).getStringCellValue();
            String value3 = row.getCell(2).getStringCellValue();
            String value4 = row.getCell(3).getStringCellValue();
            String value5= row.getCell(4).getStringCellValue();

            System.out.println(value1);
            System.out.println(value2);
            System.out.println(value3);
            System.out.println(value4);
            System.out.println(value5);
        }

        //关流
        sheets.close();
        stream.close();

不同数据类型的导出

public class ExcelReaderTest {


    static  String path="D:\\IdeaProjects\\poiDemo\\";//excel文件保存的路径(一个已经存在的路径)

    @Test
    public void simpleReader() throws Exception {
        FileInputStream in = new FileInputStream(path+"test.xlsx");//准备一个输入流
        Workbook book = new XSSFWorkbook(in);//创建绑定输入流的excel工作簿对象
        Sheet sheet = book.getSheetAt(0);
        int rows = sheet.getPhysicalNumberOfRows();
        for (int i = 0; i <rows ; i++) {
            Row row = sheet.getRow(i);
            String value= row.getRowNum() +"->";
            if(row!=null) {
                int cols = row.getPhysicalNumberOfCells();
                for (int j = 0; j < cols; j++) {
                    Cell cell =row.getCell(j);
                    value += getValue(cell);
                }
            }
            System.out.println(value);
        }

        in.close();
    }
    private String getValue(Cell cell){
        String value="";
        if(cell!=null){
            CellType ctype =  cell.getCellType();

            switch (ctype){
                case STRING:
                    value += cell.getStringCellValue()+" | ";break;
                case NUMERIC:
                    if(DateUtil.isCellDateFormatted(cell))
                        value += new DateTime(cell.getDateCellValue()).toString("yyyy-MM-dd")+" | ";
                    else
                        value += cell.getNumericCellValue()+" | ";
                    break;
                case BOOLEAN:
                    value += cell.getBooleanCellValue()+" | ";break;
                case BLANK:
                    value += "空"+" | ";break;
                case ERROR:
                    value += cell.getErrorCellValue()+" | ";break;
                case FORMULA:
                    value+="("+cell.getCachedFormulaResultType()+","+cell.toString()+")|";

                    break;
                case _NONE:
                    value += "其它 "+cell.toString()+" |";break;
                default:
                    value+=cell.getCachedFormulaResultType()+"|";
            }
        }
        return value;
    }
}

EasyExcel的读写

https://easyexcel.opensource.alibaba.com/docs/current/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值