如果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表中的数据全部读入到程序中。
- xml文件中引入POI依赖
org.apache.poi
poi
3.14
org.apache.poi
poi-ooxml
3.14
复制代码
-
自定义单元类型异常CellTypeException
-
在ResultCode中建立单元类型异常枚举对象
-
将单元类型异常配置进全局异常
-
创建存储读入数据的对象
@Data
public class Student {
private String university;
private String studentId;
private String name;
private Integer score;
private Integer credit;
private Date gmtCreate;
}
复制代码
- 创建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)]
最后感谢大家的支持,希望小编整理的资料能够帮助到大家!也祝愿大家都能够升职加薪!