【开发指南】Spring Cloud集成POI完成Excel读写操作

如果Excel需要存储类似于手机号这样的数据,默认是CELL_TYPE_NUMERIC类型,但是可以自行修改类型为CELL_TYPE_STRING。

  • 布尔数据类似于"TRUE"、“true”,POI默认以CELL_TYPE_BOOLEAN类型存储,通过POI转成Java中的类型是boolean。

3. 文件类型

Excel经历了两次大变革,就是在Excel 2003和Excel 2007。

在Excel 2003之前,只支持后缀为 .xls 的文件,而Excel 2007之后支持了后缀为 .xls.xlsx 两种后缀的文件。

因此POI针对 .xls.xlsx 两种文件分别提供了两套独立的读写接口,分别是HSSF和XSSF。

4. 前置工作

在xml文件中导入依赖:

org.apache.poi

poi

3.9

org.apache.poi

poi-ooxml

3.9

复制代码

Excel基础读写


1. HSSF

1.1 写操作

@Test

public void testHSSFWrite() throws IOException {

// 创建文件

Workbook workbook = new HSSFWorkbook();

// 创建Sheet

Sheet sheet = workbook.createSheet(“sheet1”);

// 创建第0行

Row row = sheet.createRow(0);

// 在第0行上创建第0个单元格

Cell cell = row.createCell(0);

// 在(0,0)处写入内容

cell.setCellValue(“Hello POI”);

// 写入

FileOutputStream outputStream = new FileOutputStream(“G:\file\poi\hssf-write.xls”);

workbook.write(outputStream);

// 关闭输出流

outputStream.close();

}

复制代码

1.2 读操作

@Test

public void testHSSFRead() throws IOException {

FileInputStream inputStream = new FileInputStream(“G:\file\poi\hssf-read.xls”);

Workbook workbook = new HSSFWorkbook(inputStream);

Sheet sheet = workbook.getSheetAt(0);

Row row = sheet.getRow(0);

Cell cell = row.getCell(0);

// 读出(0,0)处的字符内容

String content = cell.getStringCellValue();

System.out.println(content);

inputStream.close();

}

复制代码

2. XSSF

2.1 写操作

@Test

public void testXSSFWrite() throws IOException {

// 创建工作簿

Workbook workbook = new XSSFWorkbook();

// 创建Sheet

Sheet sheet = workbook.createSheet(“sheet1”);

// 创建第0行

Row row = sheet.createRow(0);

// 在第0行上创建第0个单元格

Cell cell = row.createCell(0);

// 在(0,0)处写入内容

cell.setCellValue(“Hello POI”);

// 写入

FileOutputStream outputStream = new FileOutputStream(“G:\file\poi\xssf-write.xlsx”);

workbook.write(outputStream);

// 关闭输出流

outputStream.close();

}

复制代码

2.2 读操作

@Test

public void testXSSFRead() throws IOException {

FileInputStream inputStream = new FileInputStream(“G:\file\poi\xssf-read.xlsx”);

Workbook workbook = new XSSFWorkbook(inputStream);

Sheet sheet = workbook.getSheetAt(0);

Row row = sheet.getRow(0);

Cell cell = row.getCell(0);

// 读出(0,0)处的字符内容

String content = cell.getStringCellValue();

System.out.println(content);

inputStream.close();

}

复制代码

Excel大数据读写


使用HSSF一次最多只能读写65535行记录(列不限),如果超过65535行,则无法读写。

使用XSSF一次最多能读写1048576行和16384列记录,理论上可以读写大数据,但是速度会非常慢,时间不可控,还可能会造成内存溢出。原因是只要没有读写结束,数据就会一直存储在内存中,无论该数据是否已经持久化,这样以来如果是大数据场景,就会造成内存溢出。

因此POI针对大数据提供了一套专门的读写接口,SXSSF,SXSSF只支持后缀为 .xlsx 文件。

1. 读操作

@Test

public void testHSSFWrite() throws IOException {

// 创建工作簿

SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook();

// 创建Sheet

Sheet sheet = sxssfWorkbook.createSheet(“sheet1”);

// 创建第0行

Row row = sheet.createRow(0);

// 在第0行上创建第0个单元格

Cell cell = row.createCell(0);

// 在(0,0)处写入内容

cell.setCellValue(“Hello POI”);

// 写入

FileOutputStream outputStream = new FileOutputStream(“G:\file\poi\sxssf-write.xlsx”);

sxssfWorkbook.write(outputStream);

// 清除内存中临时文件

sxssfWorkbook.dispose();

// 关闭输出流

outputStream.close();

}

复制代码

2. 写操作

@Test

public void testSXSSFRead() throws IOException {

FileInputStream inputStream = new FileInputStream(“G:\file\poi\sxssf-read.xlsx”);

XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream);

// 内存窗口大小为1000,表示能从Sheet窗口最多看到1000跳新创建的数据

SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(xssfWorkbook, 1000);

Sheet sheet = xssfWorkbook.getSheetAt(0);

Row row = sheet.getRow(0);

Cell cell = row.getCell(0);

// 读出(0,0)处的字符内容

String content = cell.getStringCellValue();

System.out.println(content);

inputStream.close();

}

复制代码

POI实战


将文件名为student-grade.xlsx的Excel表中的数据全部读入到程序中。

20211209170439.png

  1. xml文件中引入POI依赖

org.apache.poi

poi

3.14

org.apache.poi

poi-ooxml

3.14

复制代码

  1. 自定义单元类型异常CellTypeException

  2. 在ResultCode中建立单元类型异常枚举对象

  3. 将单元类型异常配置进全局异常

  4. 创建存储读入数据的对象

@Data

public class Student {

private String university;

private String studentId;

private String name;

private Integer score;

private Integer credit;

private Date gmtCreate;

}

复制代码

  1. 创建POIUtils

/**

  • POI工具类

  • @author admin

*/

public class POIUtils {

/**

  • 获取单元格的值

  • @param cell 单元格

  • @return 单元格的值

*/

public static Object getCellValue(XSSFCell cell) {

Object value = null;

if (cell != null) {

// 获取cell类型

int type = cell.getCellType();

// Numeric类型

if (type == XSSFCell.CELL_TYPE_NUMERIC) {

// 判断是日期类型还是数值类型

if (HSSFDateUtil.isCellDateFormatted(cell)) {

value = cell.getDateCellValue();

} else {

value = cell.getNumericCellValue();

}

}

// String类型

else if (type == XSSFCell.CELL_TYPE_STRING) {

value = cell.getStringCellValue();

}

// Boolean类型

else if (type == XSSFCell.CELL_TYPE_BOOLEAN) {

value = cell.getBooleanCellValue();

}

// Error类型

else if (type == XSSFCell.CELL_TYPE_ERROR) {

throw new CellTypeException(ResultCode.CELL_TYPE_ERROR);

}

}

return value;

}

/**

  • CELL_TYPE_STRING ——> String

  • @param cell 单元

  • @return 数据

*/

public static String getStringValue(XSSFCell cell) {

总结

对于面试,一定要有良好的心态,这位小伙伴面试美团的时候没有被前面阿里的面试影响到,发挥也很正常,也就能顺利拿下美团的offer。
小编还整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家,

在这里插入图片描述

在这里插入图片描述

最后感谢大家的支持,希望小编整理的资料能够帮助到大家!也祝愿大家都能够升职加薪!
LEAN) {

value = cell.getBooleanCellValue();

}

// Error类型

else if (type == XSSFCell.CELL_TYPE_ERROR) {

throw new CellTypeException(ResultCode.CELL_TYPE_ERROR);

}

}

return value;

}

/**

  • CELL_TYPE_STRING ——> String

  • @param cell 单元

  • @return 数据

*/

public static String getStringValue(XSSFCell cell) {

总结

对于面试,一定要有良好的心态,这位小伙伴面试美团的时候没有被前面阿里的面试影响到,发挥也很正常,也就能顺利拿下美团的offer。
小编还整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家,

[外链图片转存中…(img-z6ItdSDb-1721164631057)]

[外链图片转存中…(img-R459YYIB-1721164631058)]

最后感谢大家的支持,希望小编整理的资料能够帮助到大家!也祝愿大家都能够升职加薪!

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值