java 文件上传Excel解析(表头不固定顺序,多sheet页)并插入数据库
文件上传返回存贮路径
/**
* 前端上传文件 返回存储路径
*
*/public static String fileUpload(HttpServletRequest request, HttpServletResponse response) throws FileUploadException, IOException{//文件路径String filepath = null;//文件名称String filename = null;response.setContentType("text/html;charset=utf-8");//创建DiskFileItemFactory工厂对象DiskFileItemFactory factory=new DiskFileItemFactory();//设置文件缓存目录,如果该文件夹不存在则创建一个File f=new File("E:\\TempFolder");if (!f.exists()){f.mkdirs();}factory.setRepository(f);//创建ServletFileUpload对象ServletFileUpload fileUpload=new ServletFileUpload(factory);//设置字符编码fileUpload.setHeaderEncoding("utf-8");// 解析request,将form表单的各个字段封装为FileItem对象List<FileItem> fileItems = fileUpload.parseRequest(request);//遍历List集合for (FileItem fileItem:fileItems) {//判断是否为普通字段if (fileItem.isFormField()){} else {//获取上传的文件名filename=fileItem.getName();//处理上传文件if(filename!=null&&filename!=""){//保持文件名唯一filename= UUID.randomUUID().toString()+"_"+filename;String webpath="/upload/";//创建文件路径//String filepath=getServletContext().getRealPath(webpath+filename);filepath = "E:/TempFolder"+webpath+filename;//创建File对象File file=new File(filepath);//创建文件夹file.getParentFile().mkdirs();//创建文件file.createNewFile();//获取上传文件流InputStream in=fileItem.getInputStream();//使用 FileOutputStream打开服务器端的上传文件FileOutputStream out=new FileOutputStream(file);//流byte[] bytes=new byte[1024];//每次读取一个字节int len;//开始读取上传文件的字节,并将其输出到服务器端的上传文件输出流中while ((len=in.read(bytes))>0) {out.write(bytes, 0, len);}in.close();out.close();fileItem.delete();}}}return filepath;}
解析表头不固定Excel 返回List集合
因业务需求 每次上传表头顺序无法确定 ,没想到更好的方法
采用表头名称固定 遍历后 添加到集合中 和数据库字段对应 得到固定的顺序
public static List<Map<String,String>> analysisExcel(String filepath) throws IOException{List<Map<String,String>> list = new ArrayList<Map<String,String>>();//String encoding = "GBK";File excel = new File(filepath);if (excel.isFile() && excel.exists()) { //判断文件是否存在String[] split = excel.getName().split("\\."); //.是特殊字符,需要转义!!!!!Workbook wb=null;//根据文件后缀(xls/xlsx)进行判断if ( "xls".equals(split[1])){FileInputStream fis = new FileInputStream(excel); //文件流对象wb = new HSSFWorkbook(fis);}else if ("xlsx".equals(split[1])){FileInputStream fis = new FileInputStream(excel); wb = new XSSFWorkbook(fis);}else {return null;}//开始解析Sheet sheet = wb.getSheetAt(0); //读取sheet 0List<String> listBt = new ArrayList<String>();//获得表头 此处只遍历表头Row bt = sheet.getRow(0);if (bt != null) {int firstIndex = bt.getFirstCellNum();int lastIndex = bt.getLastCellNum(); for (int cellIndex = firstIndex; cellIndex < lastIndex; cellIndex++) { //遍历列String cell = bt.getCell(cellIndex).toString();//将表头遍历出 对应数据库中插入时对应的ID 得到对应的集合if(cell.equals("序号")){ listBt.add("ID");}}}int firstRowIndex = sheet.getFirstRowNum()+1; //第一行是列名,所以不读int lastRowIndex = sheet.getLastRowNum();for(int rIndex = firstRowIndex; rIndex <= lastRowIndex; rIndex++) { //遍历行Row row = sheet.getRow(rIndex);if (row != null) {int firstCellIndex = row.getFirstCellNum();int lastCellIndex = row.getLastCellNum();Map<String,String> map = new HashMap<String, String>();for (int cIndex = firstCellIndex; cIndex < lastCellIndex; cIndex++) { //遍历列Cell cell = row.getCell(cIndex);String key = listBt.get(cIndex);map.put(key, cell.toString());}list.add(map); }}} else {//找不到指定文件}return list;}
多sheet页解析
上传excel 用sheet页名称做数据库某一关键字段 ,将sheet页名称拼如集合中返回:
/*** * @param filepath Excel地址* @param field excel表头对应数据库字段 插入sheet页名称专用* @return* @throws IOException*/public static List<Map<String,String>> analysisExcel(String filepath,String[] field) throws IOException{List<Map<String,String>> list = new ArrayList<Map<String,String>>();//String encoding = "GBK";File excel = new File(filepath);if (excel.isFile() && excel.exists()) { //判断文件是否存在String[] split = excel.getName().split("\\."); //.是特殊字符,需要转义!!!!!Workbook wb=null;//根据文件后缀(xls/xlsx)进行判断if ( "xls".equals(split[1])){FileInputStream fis = new FileInputStream(excel); //文件流对象wb = new HSSFWorkbook(fis);}else if ("xlsx".equals(split[1])){FileInputStream fis = new FileInputStream(excel); wb = new XSSFWorkbook(fis);}else {return null;}int sheetCount = wb.getNumberOfSheets();for(int i = 0;i<sheetCount;i++){//开始解析Sheet sheet = wb.getSheetAt(i); //读取sheet 0String sheetName = sheet.getSheetName();//sheet页名称int firstRowIndex = sheet.getFirstRowNum()+1; //第一行是列名,所以不读int lastRowIndex = sheet.getLastRowNum();for(int rIndex = firstRowIndex; rIndex <= lastRowIndex; rIndex++) { //遍历行Row row = sheet.getRow(rIndex);if (row != null) {int firstCellIndex = row.getFirstCellNum();int lastCellIndex = row.getLastCellNum();Map<String,String> map = new HashMap<String, String>();for (int cIndex = firstCellIndex; cIndex < lastCellIndex; cIndex++) { //遍历列Cell cell = row.getCell(cIndex);map.put(field[cIndex], cell.toString());}map.put(field[lastCellIndex], sheetName);list.add(map); }}}} else {//找不到指定文件}return list;}
java 文件上传Excel解析(表头不固定顺序,多sheet页)并插入数据库相关推荐
- java文件上传(MultipartFile)
java文件上传(MultipartFile) java多文件上传_Java利用MultipartFile实现上传多份文件的代码 利用MultipartFile实现文件上传 Excel解析easyex ...
- springboot 上传文件解析入库_springboot实现文件上传步骤解析
这篇文章主要介绍了springboot实现文件上传步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 第一步编写上传的前段页面 data-tar ...
- Java文件上传大杀器-绕waf(针对commons-fileupload组件)
Java文件上传大杀器-绕waf(针对commons-fileupload组件) Ps:高版本才有1.3以上 来个中二的标题,哈哈哈,灵感来源于昨晚赛博群有个师傅@我是killer发了篇新文章,在那篇 ...
- 2021-10-14 ContextType(MIME) 与 Java文件上传/下载
ContextType(MIME) 与 Java文件上传/下载 ContextType(MIME) Text Image Audio Video Application Multipart 和 Mes ...
- java文件上传到云服务器,java文件上传到云服务器
java文件上传到云服务器 内容精选 换一换 当用户拥有Linux操作系统的外部镜像文件,且类型及操作系统符合外部镜像文件格式和操作系统类型要求时,用户可以将外部镜像文件创建为Linux系统盘镜像. ...
- JAVA文件上传 ServletFileUpLoad 实例
1. jsp <%@ page language="java" contentType="text/html" pageEncoding="u ...
- JAVA文件上传详解(附源码)
文章目录 JAVA文件上传详解(附源码) 1.准备工作 2.使用类介绍 FileItem类 ServletFileUpload类 3.代码编写 JAVA文件上传详解(附源码) 在web应用中,文件上传 ...
- java 文件上传 servlet_java文件上传-原始的Servlet方式
前言: 干了这几个项目,也做过几次文件上传下载,要么是copy项目以前的代码,要么是百度的,虽然做出来了,但学习一下原理弄透彻还是很有必要的.刚出去转了一圈看周围有没有租房的,在北京出去找房子是心里感 ...
- JAVA 文件上传下载工具类
JAVA 文件上传下载工具类 import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org. ...
最新文章
- cpu满了卡住 linux_Linux系统中CPU占用率较高问题排查思路与解决方法
- QCon上海2015 架构实战热点前瞻
- iOS RunLoop简介
- Simple File System
- 管道过滤器模式(Pipe and Filter)与组合模式(修改)
- Spring boot自动配置示例
- my current understanding of learning and graduate studies
- 计网 --- 域名服务系统:因特网的目录服务
- 笑看职场什么程序员才抢手,什么样的程序员涨薪多?
- oracle-关于分组函数的小细节
- 无法打开登录所请求的数据库 xxxx。登录失败。 用户 'NT AUTHORITY\SYSTEM' 登录失败。...
- UE5热更新(Pak包的Cook,打包,加载,踩过的一些坑)
- CF1153F Serval and Bonus Problem
- 如何使用JavaScript,纯前端实现字符、字数统计?
- 数据中心的功率密度将会得到进一步提高
- vs code 软件设置中文
- 计算机毕业设计(42)java小程序毕设作品之小说电子书阅读小程序系统
- 2010年考研英语一阅读A题翻译加解析
- IDEA 要自己主动装的插件(等我安新的了再更新)
- 超级签名-原理/机制/技术细节-完全解析
热门文章
- 大连计算机学院体育馆,【大科·数院】青春就要“赛”一场——大连科技学院“DK”战队荣获大连赛区冠军、全国八强...
- 厨房必备基本调料及作用
- 电机学习笔记 h桥与自举电路
- C语言课设心得之倒计时和暂停的实现
- redis一致性hash和hash槽
- oracle 分批提取数据,Oracle创建关系分批抽取测试数据
- online logo maker:在线制作具有专业水准的logo
- 用户收视率指标_时代的标志:电视现在具有网络收视率
- 计算机毕业设计Java峨眉山景点介绍及旅游攻略推荐平台(源码+系统+mysql数据库+lW文档)
- PPTV聚力传媒之Mesos集群性能测试