java读写Excel三种常用的技术
1.POI
Apache POI是Apache软件基金会的开放源代码函数库,POI提供API给java程序对Microsoft Office格式档案读和写的功能。HSSF是Horrible SpreadSheet Format的缩写,及“讨厌的电子表格格式”,通过HSSF,你可以使用纯的java代码来读取,写入,修改Excel文件。 其中它有以下的功能:
HSSF-读写Mocrosoft Excel格式档案的功能
XSSF-读写Mocrosoft Excel OOXML格式档案的功能
HWPF-读写Mocrosoft World格式档案的功能
HSLF-对鞋Mocrosoft PowerPoint格式档案的功能
HDGF-读写Mocrosoft Visio格式档案的功能
2.JXL
java Excel是一个开放源代码的项目,
可以读取Excel文件的内容,创建Excel文件,更新已经存在的Excel文件。
包括常见格式的设置:字体,颜色,本经,合并单元格等。
3.FastExcel
FastExcel是一个采用纯java开发的excel文件读写组件,
持Excel 97-2003文件格式。FastExcel只能读取单元格的字符信息,而其他属性如颜色,
字体等就不支持了,因此FastExcel只需要很小的内存。
主要介绍一下poi
1. 首先导入pom文件
根据自己版本进行下载
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-excelant</artifactId>
<version>3.14</version>
</dependency>
2.编写代码
public void importPriGoOutEmergency(MultipartFile file) {
//截取到文件后缀名
String fileType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
//定义字节流接收文件的转换
InputStream inputStream = null;
try {
Workbook wb = null;
//将excel转换为字节流
inputStream = file.getInputStream();
//获取文件后缀名分别创建不同的工作簿
if (fileType.equals("xlsx")) {
wb = new XSSFWorkbook(inputStream);
} else if (fileType.equals("xls")) {
wb = new HSSFWorkbook(inputStream);
}
//获取工作簿
Sheet sheetAt = wb.getSheetAt(0);
//获取有效行数,包括标题
int rows = sheetAt.getPhysicalNumberOfRows();
//如果等于1,证明是excel标题,说明表格中没有数据
if (rows == 1) {
throw new MpaasRuntimeException("表格中没有数据可以被导入");
}
//从第二行开始遍历,因为第二行才是真正的有效数据
// 行数:i=1开始是真正数据的开始,所以对应行数是(i+1)如图
for (int i = 1; i < rows; i++) {
//获取有效行,row指的不是行数,i是
Row row = sheetAt.getRow(i);
//获取单元格类型是否等于字符串类型还是数字类型,根据不同类型分别接受
//这里我要说明一下,我数据库中存入的是string类型,但是编码格式为1001,在excel里面输入1001时,即使你设置了文本格式,但是他还是以数字格式存在,除非你点击忽略错误,但是用户一般不会注意到这一点,设置了也相当于没设置,所以接受类型进行判断.
//第一行第一列的取值索引是从0开始的,不是1.(当时我以为是1,后来报错了)
if (row.getCell(1).getCellType() == Cell.CELL_TYPE_STRING) {
companyCode = row.getCell(1).getStringCellValue();
} else if (row.getCell(1).getCellType() == Cell.CELL_TYPE_NUMERIC) {
String cellValue = row.getCell(1).getNumericCellValue() + "";
companyCode = cellValue.substring(0, cellValue.lastIndexOf("."));
}
.............后面是我代码逻辑,就不给大家展示了,常用的都在上面,防止大家踩雷,我都标注了注释
} catch (IOException e) {
throw new MpaasRuntimeException("数据异常,请重新校验!");
} finally {
try {
//关流操作(别忘了)
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
憨憨有个提醒:
表格数据你用多少就操作多少,不要随便设置,否则也会记录进去,你操作一行数,但是设置了12行,就会获得12行.
常见报错
处理java.lang.IllegalStateException: Cannot get a text value from a numeric cell
翻译:java.lang.IllegalStateException:无法从数字单元格中获取文本值
原因:excel单元格是文本格式,但是你用的number类型接受就会报错,
解决办法
<1>在excel文件中有数字的单元格前面加上 ‘ ,这个大家应该明白什么意思
<2>在程序中进行类型转换,只要加上
row.getCell(j).setCellType(Cell.CELL_TYPE_STRING);
程序运行到row.getCell(j).getStringCellValue()就不会再出错