首先声明一点,这是自己的写法,并不是标准写法,标准写法可以google一下。
主要运用的apache的POI包中的类。
1.首先创建一个ExcelUtil的工具类,并且把自己需要的方法写出来。
其中我使用的maven的方式,引入了这两个依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.13</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.13</version>
</dependency>
我这里暂时就需要两个方法:
第一个方法:读取Excel的文件表格的各个标题,一般的表格都是设有标题的,一般在Excel的第一行,但是不能例外有可能设在其他的行,所以设置的灵活一点。
/**
* 读取Excel文件的标题信息
* @return
*/
public static List<String> readeExcelHeader(InputStream excelInputSteam,
int sheetNumber,
int headerNumber,
int rowStart){...}
第二个方法:读取Excel的内容数据,同样的,要设置的灵活一点,同时要将每一行的数据与标题向对应,所以使用Map<String,Object>来存储每一列的数据,最后生成一个List,所以返回值是List<Map<String,Object>>
/**
* 读取Excel文件的内容
* @return
*/
public static List<Map<String,Object>> readeExcelData(InputStream excelInputSteam,
int sheetNumber,
int headerNumber,
int rowStart){...}
2.开始进行内容的填充
首先读出header,即我们的标题,放在一个List<String> headers中;
其次,每行的数据,放在HashMap<String,Object>(<header,data>这样的形式),每行一个HashMap,最后将所有的HashMap放在一个List中,这样将返回List。
因为两个方法都有读取header的部分,第二个方法包含第一个方法,我就只说第二个方法。
第一个方法的实现:
public static List<String> readeExcelHeader(InputStream excelInputSteam,
int sheetNumber,
int headerNumber,
int rowStart) throws IOException, InvalidFormatException {
//要返回的数据
List<String> headers = new ArrayList<String>();
//生成工作表
Workbook workbook = WorkbookFactory.create(excelInputSteam);
Sheet sheet = workbook.getSheetAt(sheetNumber);
Row header = sheet.getRow(headerNumber);
DataFormatter dataFormatter = new DataFormatter();
for (int i = 0; i < header.getLastCellNum(); i++) {
//获取单元格
Cell cell = header.getCell(i);
headers.add(dataFormatter.formatCellValue(cell));
}
return headers;
}
第二个方法的实现:
public static List<Map<String, Object>> readeExcelData(InputStream excelInputSteam,
int sheetNumber,
int headerNumber,
int rowStart) throws IOException, InvalidFormatException {
//需要的变量以及要返回的数据
List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
List<String> headers = new ArrayList<String>();
//生成工作表
Workbook workbook = WorkbookFactory.create(excelInputSteam);
Sheet sheet = workbook.getSheetAt(sheetNumber);
Row header = sheet.getRow(headerNumber);
//最后一行数据
int rowEnd = sheet.getLastRowNum();
DataFormatter dataFormatter = new DataFormatter();
//获取标题信息
for (int i = 0; i < header.getLastCellNum(); ++i) {
Cell cell = header.getCell(i);
headers.add(dataFormatter.formatCellValue(cell));
}
//获取内容信息
for (int i = rowStart; i <= rowEnd; ++i) {
Row currentRow = sheet.getRow(rowStart);
if (Objects.isNull(currentRow)) {
continue;
}
Map<String, Object> dataMap = new HashMap<>();
for (int j = 0; j < currentRow.getLastCellNum(); ++j) {
//将null转化为Blank
Cell data = currentRow.getCell(j, Row.CREATE_NULL_AS_BLANK);
if (Objects.isNull(data)) { //感觉这个if有点多余
dataMap.put(headers.get(j), null);
} else {
switch (data.getCellType()) { //不同的类型分别进行存储
case Cell.CELL_TYPE_STRING:
dataMap.put(headers.get(j), data.getRichStringCellValue().getString());
break;
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(data)) {
dataMap.put(headers.get(j), data.getDateCellValue());
} else {
dataMap.put(headers.get(j), data.getNumericCellValue());
}
break;
case Cell.CELL_TYPE_FORMULA:
dataMap.put(headers.get(j), data.getCellFormula());
break;
case Cell.CELL_TYPE_BOOLEAN:
dataMap.put(headers.get(j), data.getBooleanCellValue());
break;
default:
dataMap.put(headers.get(j), null);
}
}
result.add(dataMap);
}
}
return result;
}
网友评论