上传Excel,并解析
时间:2019-11-19
本文章向大家介绍上传Excel,并解析,主要包括上传Excel,并解析使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
pom依赖
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.0</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.0</version> <scope>compile</scope> </dependency>
1.工具类方法,检测上传目录,若不存在则创建
private void judgeDirExists(String uoloadPath) { try { File targetPatchFile = new File(uploadPath); if (!targetPatchFile.exists()) { targetPatchFile.mkdirs(); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("存储目录创建失败"); } }
2.解析Excel
private static HashMap<String, ArrayList<String[]>> analysisFile(MultipartFile file) throws IOException { HashMap<String, ArrayList<String[]>> hashMap = new HashMap<>(); String msg = ""; // 获取workbook对象 Workbook workbook = null; String filename = file.getOriginalFilename(); InputStream inputStream = file.getInputStream(); // 根据后缀名是否excel文件 if (filename.endsWith("xls")) { // 2003版本 workbook = new HSSFWorkbook(inputStream); } else if (filename.endsWith("xlsx")) { // 2007版本 workbook = new XSSFWorkbook(inputStream); } // 创建arrayList,把每一行作为一个String数组,存到集合中 ArrayList<String[]> arrayList = new ArrayList<>(); if (workbook != null) { // 只解析第一个sheet Sheet sheet = workbook.getSheetAt(0); if (sheet == null) { hashMap.put("Excel文件为空!", arrayList); return hashMap; } // 默认第一行为标题栏,从第二行开始解析 int firstRowNum = 1; // 获取sheet中数据的总行数 int lastRowNum = sheet.getPhysicalNumberOfRows(); // 获取列数。默认第一行为0 short firstCellNum = 0; // 获取标题栏的总列数 int lastCellNum = sheet.getRow(0).getPhysicalNumberOfCells(); // 循环每一行 for (int rowNum = firstRowNum; rowNum < lastRowNum; rowNum++) { // 获取当前行 Row row = sheet.getRow(rowNum); String[] strings = new String[lastCellNum]; // 循环当前行的每一列 for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) { Cell cell = row.getCell(cellNum); if (cell == null || "".equals(cell) || cell.getCellType() == CellType.BLANK) { msg = msg + "第" + (rowNum + 1) + "行,第" + (cellNum + 1) + "列为空;"; } String cellValue = ""; cellValue = getCellValue(cell); strings[cellNum] = cellValue; } arrayList.add(strings); } } inputStream.close(); hashMap.put(msg, arrayList); return hashMap; }
3.单位内容转为String
public static String getCellValue(Cell cell) { String cellValue = ""; if (cell == null) { return cellValue; } // 判断数据的类型 switch (cell.getCellType()) { //数字0 case NUMERIC: cellValue = NumberToTextConverter.toText(cell.getNumericCellValue()); break; //字符串1 case STRING: cellValue = String.valueOf(cell.getStringCellValue()); break; //Boolean case BOOLEAN: cellValue = String.valueOf(cell.getBooleanCellValue()); break; //公式 case FORMULA: try { cellValue = String.valueOf(cell.getNumericCellValue()); } catch (IllegalStateException e) { cellValue = String.valueOf(cell.getRichStringCellValue()); } break; //空值 case BLANK: cellValue = ""; break; //故障 case ERROR: cellValue = "非法字符"; break; default: cellValue = "未知类型"; break; } return cellValue; }
原文地址:https://www.cnblogs.com/shiblog/p/11888338.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [Centos7]安装rrdtool模块
- [Centos7]XlsxWriter模块安装
- [Centos7]安装pycurl
- [Centos7]python-nmap端口扫描
- [docker]Nginx安装部署
- Lua语言-入门语法
- Redis 三种启动方式
- OpenWRT结合tinc组自己的SDLAN
- 通过Cloudflare API更新DNS记录
- Vedastr:基于PyTorch的场景文本识别工具箱
- vue-element-admin项目关闭eslint校验
- 搞了半天,终于弄懂了TCP Socket数据的接收和发送,太难~
- 每天一个小技巧:CSS clip-path 的妙用 Clip Path分类Clippy
- 20 个值得学习的 Vue 开源项目
- 小白入门WEB前端编程,必看知识点!核心干货