当前位置:首页 > 实用技巧 >

java上传和导入excel(java读取上传的excel文件)

来源:原点资讯(www.yd166.com)时间:2023-05-11 07:03:20作者:YD166手机阅读>>

java上传和导入excel,java读取上传的excel文件(1)

一、需求说明

通过接口上传一个姓名号码表,返回一个"姓名,号码"格式的的一个String数组。

java上传和导入excel,java读取上传的excel文件(2)

二、功能实现

1、pom.xml中引入依赖

<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency>

使用poi去解析excel,poi对应的是excel2003,poi-ooxml对应的是excel2007。

2、实现上传接口

@RestController @RequestMapping("/testFile") public class FIleUpDownLoadController { @Autowired private FileParserService fileParserService; @ApiOperation(value = "上传excel文件") @RequestMapping(value = "/target", method = RequestMethod.POST) @ResponseBody public ResponseEntity importTarget(@RequestParam("file") MultipartFile file, HttpServletResponse response) { ResponseEntity res = new ResponseEntity(); try { String fileName = file.getOriginalFilename(); if (!fileName.endsWith(".xls")) { res.setCode(ReturnCodeMsgEnum.IMPORT_EXCEL_FORMAT.getCode()); res.setMsg(ReturnCodeMsgEnum.IMPORT_EXCEL_FORMAT.getMsg()); return res; } //接收文件流和解析excel List<String> rows = fileParserService.splitRows(file); //无错误,不需要返回下载文件,且执行保存数据库 res.setCode(ReturnCodeMsgEnum.IMPORT_EXCEL_SUCCESS.getCode()); res.setMsg(ReturnCodeMsgEnum.IMPORT_EXCEL_SUCCESS.getMsg()); res.setData(rows); return res; }catch(Exception e){ logger.error("importTarget error", e); res.setCode(ReturnCodeMsgEnum.IMPORT_EXCEL_ERROR.getCode()); res.setMsg(ReturnCodeMsgEnum.IMPORT_EXCEL_ERROR.getMsg()); res.setData(e.getMessage()); return res; } } }

主要就是使用MultipartFile类型的参数进行文件流的上传。通过file.getOriginalFilename()去获取上传文件的名称。

3、流的处理和excel表格的解析

@Service("fileParserService") public class FileParserServiceImpl implements FileParserService { public static final String EXCEL_2003 = ".xls"; public static final String EXCEL_2007 = ".xlsx"; public static final String COMMA = ","; private static final Logger log = LoggerFactory.getLogger(FileParserServiceImpl.class); @Override public List<String> splitRows(MultipartFile file) throws FileParserServiceException { // skip validation List<String> rows = null; try (InputStream inputStream = file.getInputStream()) { String fileName = file.getOriginalFilename(); Workbook workbook = null; if (fileName.endsWith(EXCEL_2003)) { workbook = new HSSFWorkbook(inputStream); } else if (fileName.endsWith(EXCEL_2007)) { workbook = new XSSFWorkbook(inputStream); } if (workbook != null) { rows = new ArrayList<>(); //sheet页数 int numOfSheet = workbook.getNumberOfSheets(); if(numOfSheet>1){ throw new FileParserServiceException("不支持多个sheet上传"); } for (int i = 0; i < numOfSheet; i ) { Sheet sheet = workbook.getSheetAt(i); if (sheet == null) continue; //行数 int lastRowNum = sheet.getLastRowNum(); if (lastRowNum == 0) continue; Row row; //列数 short lastCellNum = sheet.getRow(1).getLastCellNum(); for (int j = 1; j <= lastRowNum; j ) { StringBuilder sb = new StringBuilder(); row = sheet.getRow(j); if (row == null) { throw new FileParserServiceException("当前文件存在空行,请重新上传"); } String mNum = ""; Cell cellA = row.getCell(0); if (cellA != null) { cellA.setCellType(CellType.STRING); mNum = cellA.getStringCellValue().trim(); } sb.append(mNum).append(COMMA); //遍历每一行 for (int k = 1; k < lastCellNum; k ) { String res = ""; Cell cell = row.getCell(k); if (cell == null) { continue; }else if(cell.getCellTypeEnum() == CellType.BLANK){ continue; } if (cell.getCellTypeEnum() == CellType.NUMERIC) { if (DateUtil.isCellDateFormatted(cell)) { Date theDate = cell.getDateCellValue(); short s = cell.getCellStyle().getDataFormat(); if (s == 0x16) { res = new SimpleDateFormat(Constants.DATE_FORMAT_B).format(theDate); } else if (s == 0x12 || s == 0x14) { res = new SimpleDateFormat(Constants.DATE_FORMAT_C).format(theDate); } else if (s == 0x13 || s == 0x15 || s == 181 || s == 0x2e || s == 176 || s == 177) { res = new SimpleDateFormat(Constants.DATE_FORMAT_D).format(theDate); } else if (s == 0x2d) { res = new SimpleDateFormat(Constants.DATE_FORMAT_E).format(theDate); } else { res = new SimpleDateFormat(Constants.DATE_FORMAT_A).format(theDate); } } else { double value = cell.getNumericCellValue(); if (isInt(value)) { res = String.valueOf(new Double(value).intValue()); } else if (isLong(value)) { res = new BigDecimal(value).toString(); } else { res = String.valueOf(value); } } sb.append(res).append(COMMA); continue; } cell.setCellType(CellType.STRING); res = cell.getStringCellValue(); if(res.contains(":")||res.contains(",")){ throw new FileParserServiceException("当前文件存非法字符(,或:),请重新上传"); } if (res.isEmpty()) continue; sb.append(res).append(COMMA); } rows.add(sb.substring(0, sb.length() - 1)); } } } } catch (IOException e) { log.error("splitRows error", e); } return rows; } }

(1)流的获取

file.getInputStream()

(2)流转换成Workbook

Workbook workbook = null;

if (fileName.endsWith(EXCEL_2003)) {

workbook = new HSSFWorkbook(inputStream);

} else if (fileName.endsWith(EXCEL_2007)) {

workbook = new XSSFWorkbook(inputStream);

}

(3)解析excel

主要就是获取sheet页,获取行数,获取列数,遍历获取每个单元格。其中还涉及到单元格数字和字符串的解析问题。

三、测试验证

使用postman工具调用接口验证,符合需求。

localhost:8089/testFile/target

java上传和导入excel,java读取上传的excel文件(3)

栏目热文

java将大量excel数据导入数据库(java操作excel直接导入数据库)

java将大量excel数据导入数据库(java操作excel直接导入数据库)

1、导入模板是用来给系统使用者在导入数据时使用的,有了导入模板就相当于有了一个导入的规范,确定需要导入哪些列来让使用者填...

2023-05-11 06:50:45查看全文 >>

java将excel导入数据库(java操作excel直接导入数据库)

java将excel导入数据库(java操作excel直接导入数据库)

由于篇幅有限,csdn的上传在60M内,jar包加起来就超过了,这里只保存了关键的源代码,想要详细的源代码可以私信我。...

2023-05-11 07:21:45查看全文 >>

java操作excel表导入数据库(java操作excel导入表)

java操作excel表导入数据库(java操作excel导入表)

如果项目经理给你一个Excel表格数据,让你把这些数据插入数据库,你会怎么操作?大部分想的就是通过Java代码拼接成S...

2023-05-11 06:47:07查看全文 >>

java把excel表格数据导入到数据库(java实现导入excel数据到数据库)

java把excel表格数据导入到数据库(java实现导入excel数据到数据库)

工作中,我们如果在大公司上班,经常有程序员和非程序员之分,而且公司大了,每天都要产生大量数据,怎么储存数据呢?对于程序员...

2023-05-11 07:16:42查看全文 >>

用java怎么写excel导入工具(excel导入导出java解决方案推荐)

用java怎么写excel导入工具(excel导入导出java解决方案推荐)

java-excel-utils是JAVA操作 Excel 导入导出的工具类,目的是简化逻辑操作、可拓展 Excel 导...

2023-05-11 07:27:02查看全文 >>

百万excel数据导入java(java导入excel详细教程)

百万excel数据导入java(java导入excel详细教程)

在项目开发中,开发人员在编写代码过程中或多或少都要涉及到直接将固定格式的数据文件内容导入到系统中,例如将一个存放员工信息...

2023-05-11 06:42:31查看全文 >>

java导入excel的思路(java大量excel数据导入)

java导入excel的思路(java大量excel数据导入)

1. 构建项目使用Spring Boot快速构建一个Web工程,并导入与操作Excel相关的poi包以及一些常用的工具类...

2023-05-11 06:48:51查看全文 >>

java完整excel导入mysql数据库(java读取excel文件并导入数据库)

java完整excel导入mysql数据库(java读取excel文件并导入数据库)

看过我之前分享的朋友,应该知道之前我用 ,需要导入大量的数据,也就研究了一下如何在后台批量导入大量的数据。因为源数据都是...

2023-05-11 07:10:10查看全文 >>

java导入导出excel的工具包(java excel导入导出工具)

java导入导出excel的工具包(java excel导入导出工具)

前言在开发应用系统的时候,导出文件是必不可放的功能。以前用过poi、easyexcel等工具的导入导出功能,但总感觉太麻...

2023-05-11 06:44:54查看全文 >>

java将数据导入excel(java将数据写入excel)

java将数据导入excel(java将数据写入excel)

程序员创业记跟大家分享一款excel组件,之所以分享这款,是因为它在处理excel时很方便,我将百万数据导出到excel...

2023-05-11 07:23:58查看全文 >>

文档排行