实例代码:
@PostMapping("/import")
public ResponseMsg<Boolean> importConfig(@RequestBody MultipartFile file ) {
try {
ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
reader.addHeaderAlias("标题行名称","对应的字段");
//例如
reader.addHeaderAlias("用户名","username");
List<User> list = reader.readAll(User.class);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
引入hutool依赖 hutool依赖版本会影响部分方法的使用,在最新的版本中更新了很多4.x版本不同的方法
<!-- hutool 工具包 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.1</version>
</dependency>
<!-- poi exce表格导入导出 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<!-- poi需要使用 excel表格解析器 -->
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.11.0</version>
</dependency>
流式读取
@PostMapping("/excel")
public String importBatchExcel(@RequestBody MultipartFile file) throws Exception {
List<Map<String,String>> lists = new LinkedList<>();
List<Object> lists2 = new LinkedList<>();
Workbook workbook=null;
boolean is2003Excel= file.getOriginalFilename().toLowerCase().endsWith("xls")?true:false;
if (is2003Excel){
workbook= new HSSFWorkbook(file.getInputStream());
}else {
workbook = new XSSFWorkbook(file.getInputStream());
}
// sheet页数
int numberOfSheets = workbook.getNumberOfSheets();
for (int i=0;i<numberOfSheets;i++){
//读取每一个sheet
Sheet sheetAt = workbook.getSheetAt(i);
for (Row row: sheetAt){
//每一行 第几列
System.out.println(row.getCell(0));
}
}
提出来一个静态方法
public static void getExcel(MultipartFile file) throws Exception {
HSSFWorkbook workbook = new HSSFWorkbook(file.getInputStream());
HSSFSheet sheet = null;
for (int i = 0; i < workbook.getNumberOfSheets(); i++) {//获取每个Sheet表
sheet = workbook.getSheetAt(i);
System.out.println(sheet.getSheetName());
for (int j = 0; j < sheet.getPhysicalNumberOfRows(); j++) {//获取每行
HSSFRow row = sheet.getRow(j);
for (int k = 0; k < row.getPhysicalNumberOfCells(); k++) {//获取每个单元格
System.out.print(row.getCell(k) + "\t");
}
System.out.println("---Sheet" + i + "处理完毕---");
}
}
}
实际中的代码
ResponseMsg<Boolean> msg = new ResponseMsg(ResponseCode.SUCCESS);
List<Invoice> list = new ArrayList<>();
List<InvoiceDetail> detailList = new ArrayList<>();
try {
OPCPackage opcPackage = OPCPackage.open(file.getInputStream());
XSSFReader reader = new XSSFReader(opcPackage);
// sheet页数
SharedStringsTable sharedStringsTable = reader.getSharedStringsTable();
StylesTable stylesTable = reader.getStylesTable();
// SAXParserFactory parserFactory = SAXParserFactory.newInstance();
// SAXParser parser = parserFactory.newSAXParser();
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
XSSFReader.SheetIterator sheetIterator = (XSSFReader.SheetIterator) reader.getSheetsData();
SheetHandler sheetHandler = new SheetHandler(list);
SheetHandlerDetail sheetHandlerDetail = new SheetHandlerDetail(detailList);
XSSFSheetXMLHandler sheetXMLHandler = new XSSFSheetXMLHandler(stylesTable, sharedStringsTable, sheetHandler, false);
xmlReader.setContentHandler(sheetXMLHandler);
while (sheetIterator.hasNext()) {
InputStream next = sheetIterator.next();
InputSource is = new InputSource(next);
System.out.println("====sheetName1===");
System.out.println(sheetIterator.getSheetName());
System.out.println("====sheetName2===");
log.info("读取"+sheetIterator.getSheetName());
xmlReader.parse(is);
}
新建一个SheetHandler类实现XSSFSheetXMLHandler.SheetContentsHandler接口
public class SheetHandler implements XSSFSheetXMLHandler.SheetContentsHandler {
/**
* 开始行
* @param i
*/
@Override
public void startRow(int i) {
}
/**
* 结束行
* @param i
*/
@Override
public void endRow(int i) {
}
/**
* 处理每个单元格
* @param cellName
* @param value
* @param xssfComment
*/
@SneakyThrows
@Override
public void cell(String cellName, String value, XSSFComment xssfComment) {
}
}