导入excel就是一个上传excel文件,然后获取excel文件数据,然后处理数据并插入到数据库的过程

一、上传excel

前端jsp页面,我的是index.jsp

在页面中我自己加入了一个下载上传文件的功能,其中超链接就是下载

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<script type="text/javascript" src="jquery/1.7.2/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="jquery/jquery.form.js"></script>
<script type="text/javascript">function test1(){var form = new FormData(document.getElementById("uploadForm"));$.ajax({contentType:"multipart/form-data",url:"servlet/UploadHandleServlet",type:"post",async:false,data:form,dataType:"json",processData: false,  // 告诉jQuery不要去处理发送的数据contentType: false,   // 告诉jQuery不要去设置Content-Type请求头success:function(data){var result=eval(data);var filePath=result[0].filePath;//alert(filePath);var fileName = result[0].imageName;$("#download").attr("href","servlet/DownLoadServlet?filePath="+filePath);document.getElementById("download").innerHTML = fileName; //上传文件后得到路径,然后处理数据插入数据库表中importExcel(filePath); }});
}function importExcel(filePath){$.ajax({url:"${pageContext.request.contextPath}/user/insertUserByExcelPath",type:"post",data:{"filePath":filePath},success:function(data){}});
}</script>
<body>导入excel表格
<form id="uploadForm" action="" method="post" enctype="multipart/form-data"> <table>  <tr>  <td>上传文件:</td>  <td><input type="file" name="fileName" id="fileName"/></td>  </tr></table>
</form>
<button id="uploadFile" onclick="test1();">确定</button>
<!-- servlet/DownLoadServlet -->
上传的文件<a id="download" href=""></a>
</body>
</html>

后端的上传的servlet,其中需要commons-fileupload-1.2.1.jar的支持,然后我的保存路径savePath是自己写的一个配置文件来的,这里可以写上自己的上传文件所保存的路径就行,返回的是一个json,包括文件路径还有文件名

package com.huang.servlet;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.util.Streams;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;import com.huang.entity.User;
import com.huang.utils.Excel2Bean;
import com.huang.utils.PropertiesUtil;/*** Servlet implementation class UploadHandleServlet*/
@WebServlet("/UploadHandleServlet")
public class UploadHandleServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public UploadHandleServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("进入servlet");DiskFileItemFactory fac = new DiskFileItemFactory();ServletFileUpload upload = new ServletFileUpload(fac);upload.setHeaderEncoding("UTF-8");// 获取多个上传文件List fileList = null;try {fileList = upload.parseRequest(request);} catch (FileUploadException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 遍历上传文件写入磁盘Iterator it = fileList.iterator();while (it.hasNext()) {Object obit = it.next();if (obit instanceof DiskFileItem) {DiskFileItem item = (DiskFileItem) obit;// 如果item是文件上传表单域// 获得文件名及路径String fileName = item.getName();if (fileName != null) {String fName = item.getName().substring(item.getName().lastIndexOf("\\") + 1);String formatName = fName.substring(fName.lastIndexOf(".") + 1);// 获取文件后缀名String savePath = PropertiesUtil.getInstance().getProperty("uploadFile");
//                  String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");File expsfile = new File(savePath);if (!expsfile.exists()) {// 创建文件夹expsfile.mkdirs();}String realPath = savePath+"/"+ UUID.randomUUID().toString()+"."+formatName;System.out.println("realPath:"+realPath);BufferedInputStream bis = new BufferedInputStream(item.getInputStream());// 获得文件输入流BufferedOutputStream outStream = new BufferedOutputStream(new FileOutputStream(new File(realPath)));// 获得文件输出流Streams.copy(bis, outStream, true);// 开始把文件写到你指定的上传文件夹// 上传成功,则插入数据库File file = new File(realPath);if (file.exists()) {
//                      request.setAttribute("realPath", realPath);
//                      request.getRequestDispatcher("/user/insertUserByExcelPath").forward(request, response);// 返回文件路径String imageName = file.getName();String json = "[{\"filePath\":\""+ realPath+ "\",\"imageName\":\"" + imageName + "\"}]";response.reset();response.setContentType("text/json");response.setCharacterEncoding("UTF-8");response.getWriter().write(json);
//                      response.getWriter().write(realPath);response.getWriter().flush();}}}}}}

二、处理excel表格并得到含有Javabean的list

在用ajax调用servlet上传文件后得到路径和文件名,然后进行excel数据处理,在前端的页面上调用importExcel()的js函数,传入刚刚得到的文件路径

我这里用的是ssm框架中的controller(我自己也学习一下),这里也可以用servlet,或者Struts等。能访问到后端服务就行。

这里是controller中的代码,主要数据处理在Excel2Bean.getBeanByExcelPath(filePath, User.class)这个方法中

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.ModelAndView;import com.huang.entity.User;
import com.huang.service.UserService;
import com.huang.utils.Excel2Bean;@Controller("/userController")
@RequestMapping("/user")
public class UserController {@AutowiredExcel2Bean excel2Bean;@Resource(name="userService")UserService userService;@RequestMapping("/insertUserByExcelPath")public void insertUserByExcelPath(HttpServletRequest req,HttpServletResponse Resp){System.out.println("进入insertUserByExcelPath");String filePath = req.getParameter("filePath");System.out.println("filePath:"+filePath);List<User> list =Excel2Bean.getBeanByExcelPath(filePath, User.class);excel2Bean.testinsert(list);}
}

这里就说说Excel2Bean.getBeanByExcelPath(filePath, User.class)这个方法

从excel表格中获取数据然后转换成一个javaBean的list集合,代码中操作excel表格需要用到的jar  poi-ooxml-3.9-20121203.jar,poi-3.9-20121203.jar,poi-ooxml-schemas-3.9-20121203.jar,为什么要用到这些jar,因为在有些之前的版本的poi中可能对word的版本不能兼容,网上具体有说到这个。最好是用org.apache.poi.ss.usermodel.Workbook这个来操作excel,poi各种版本官网下载可以参考微博CSDN。对于getBeanByExcelPath这个方法使用到了泛型,也使用到了一点点的反射的东西,获取一个类的属性,并给属性赋值。代码中有方法测试这个获取Javabean的属性并赋值的方法。这个方法也是为了能更通用一点,适用于更多的javabean,更多的表。当然excel的表头就要用到Javabean中的属性名称了。如果对泛型不是很了解的可以学习一下,当然也可以先看里面的readExcel(filePath)这个方法,是一个固定的Javabean对象

代码如下

package com.huang.utils;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;import javax.annotation.PostConstruct;
import javax.annotation.Resource;import net.sf.jxls.exception.ParsePropertyException;
import net.sf.jxls.transformer.XLSTransformer;import org.apache.poi.hssf.model.Workbook;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.springframework.stereotype.Component;import com.huang.entity.User;
import com.huang.service.UserService;@Component
public class Excel2Bean {@Resource(name="userService")UserService userService;public static Excel2Bean excel2Bean;@PostConstructpublic void init() {excel2Bean = this;}public static void testinsert(List<User> list){if(list!=null&&list.size()>0){for (User user : list) {user.setId(excel2Bean.userService.getMaxId()+1);excel2Bean.userService.insertUserByUser(user);}}
//      System.out.println(excel2Bean.userService.getMaxId());}/**  * 获取属性名数组  * @throws IllegalAccessException * @throws InstantiationException * @throws SecurityException * */  public static  String[]  getFiledName(Class<?> clazz) throws SecurityException, InstantiationException, IllegalAccessException{Field[] fields=clazz.newInstance().getClass().getDeclaredFields();  String[] fieldNames=new String[fields.length];  for(int i=0;i<fields.length;i++){
//            System.out.println(fields[i].getType());  fieldNames[i]=fields[i].getName();  }  return fieldNames;  } public static <T>T getByExcelPath(String excelPath,Class<T> clazz){T bean = null;try {bean = clazz.newInstance();String tableName = clazz.getSimpleName();// 反射bean上与列名相同的属性try {Field f = bean.getClass().getDeclaredField("name");f.setAccessible(true);f.set(bean, "兽王");
//              System.out.println(f);} catch (NoSuchFieldException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();}} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}return bean;}public static <T> List<T> getBeanByExcelPath(String excelPath,Class<T> clazz){List<T> list = new ArrayList<T>();org.apache.poi.ss.usermodel.Workbook workbook = null;InputStream is = null;try {is = new FileInputStream(excelPath);workbook = WorkbookFactory.create(is);is.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvalidFormatException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} // 循环工作表for (int numSheet = 0; numSheet < workbook.getNumberOfSheets(); numSheet++) {Sheet sheet = workbook.getSheetAt(numSheet);//得到工作表if (sheet == null) {continue;}// 循环行  因为表头行是第0行,所以从0开始循环Row rowHead = sheet.getRow(0);for (int rowNum = 1; rowNum <= sheet.getLastRowNum(); rowNum++) {T bean = null;try {bean = clazz.newInstance();} catch (InstantiationException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (IllegalAccessException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}Row row = sheet.getRow(rowNum);//得到行short s = row.getLastCellNum();//得到此行有多少列for (int i = 0; i < s; i++) {Cell cell = row.getCell(i);//得到单元格(每行)Cell cellHead = rowHead.getCell(i);String feild = (String) getCellValObject(cellHead);//得到表头属性名称Object value = getCellValObject(cell);Field f = null;try {f = bean.getClass().getDeclaredField(feild);//根据名称获取bean中的属性f.setAccessible(true);f.set(bean, value);//给属性赋值} catch (NoSuchFieldException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} }//把所有属性值添加完成后装入list中list.add(bean);}}return list;}public static String getCellVal(HSSFCell cel) {if(cel.getCellType() == HSSFCell.CELL_TYPE_STRING) {return cel.getRichStringCellValue().getString();}if(cel.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {return cel.getNumericCellValue() + "";}if(cel.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {return cel.getBooleanCellValue() + "";}return cel.toString();}public static String getCellVal(Cell cel) {if(cel.getCellType() == Cell.CELL_TYPE_STRING) {return cel.getRichStringCellValue().getString();}if(cel.getCellType() == Cell.CELL_TYPE_NUMERIC) {return cel.getNumericCellValue() + "";}if(cel.getCellType() == Cell.CELL_TYPE_BOOLEAN) {return cel.getBooleanCellValue() + "";}if(cel.getCellType() == Cell.CELL_TYPE_FORMULA) {return cel.getCellFormula() + "";}return cel.toString();}public static Object getCellValObject(Cell cel) {if(cel.getCellType() == Cell.CELL_TYPE_STRING) {return cel.getRichStringCellValue().getString();}if(cel.getCellType() == Cell.CELL_TYPE_NUMERIC) {return new Integer(Double.valueOf(cel.getNumericCellValue()).intValue());}if(cel.getCellType() == Cell.CELL_TYPE_BOOLEAN) {return cel.getBooleanCellValue() + "";}if(cel.getCellType() == Cell.CELL_TYPE_FORMULA) {return cel.getCellFormula() + "";}return null;}public static List<User> readExcel(String filePath){List<User> list = new ArrayList<User>();
//      HSSFWorkbook workbook = null;org.apache.poi.ss.usermodel.Workbook workbook = null;try {// 读取Excel文件InputStream inputStream = new FileInputStream(filePath);
//        workbook = new HSSFWorkbook(inputStream);workbook = WorkbookFactory.create(inputStream);inputStream.close();} catch (Exception e) {e.printStackTrace();}// 循环工作表for (int numSheet = 0; numSheet < workbook.getNumberOfSheets(); numSheet++) {Sheet hssfSheet = workbook.getSheetAt(numSheet);if (hssfSheet == null) {continue;}// 循环行for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {Row hssfRow = hssfSheet.getRow(rowNum);
//          System.out.println("hssfRow1:"+hssfRow.getRowNum());
//          System.out.println("hssfRow2:"+hssfRow.getLastCellNum());if (hssfRow == null) {continue;}// 将单元格中的内容存入集合User user = new User();Cell cell = hssfRow.getCell(0);if (cell == null) {continue;}String name = getCellVal(cell);System.out.println("name:"+name);user.setName(name);cell = hssfRow.getCell(1);if (cell == null) {continue;}String age = getCellVal(cell);Integer aa = Double.valueOf(age).intValue();System.out.println("age:"+age);user.setAge(Double.valueOf(age).intValue());list.add(user);}}return list;}
}

三、插入数据库

得到excel转换成Javabean的list对象后然后插入到数据库中。需要自己去实现UserService 的insertUserByUser方法。反正得到数据,然后往数据库插入数据这个操作也可以用其他方式的,框架也好,jdbc连接数据库直接去执行sql也好,都OK。

最后贴一下下载上传的文件的servlet代码

package com.huang.servlet;import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class DownLoadServlet*/
@WebServlet("/DownLoadServlet")
public class DownLoadServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public DownLoadServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 下载文件
//      String path = "d:"+File.separator + "mytestfile" + File.separator + "testFile.txt";String path = request.getParameter("filePath");String realPath = path.substring(path.lastIndexOf("\\")+1);  response.setHeader("content-disposition","attachment; filename="+URLEncoder.encode(realPath, "utf-8"));  //获取到所下载的资源  FileInputStream fis = new FileInputStream(path);if(fis!=null){int len = 0;byte[] buf = new byte[1024];while ((len = fis.read(buf)) != -1) {response.getOutputStream().write(buf, 0, len);}fis.close();}else{response.getWriter().write("服务器上面不存在该文件");}}}

还有User.java这个javabean

public class User {private Integer id;private String name;private Integer age;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name == null ? null : name.trim();}

页面效果如下,超链接可以下载,点击确定后上传文件并取数据然后插入数据库表中

excel表格形式如下

name age
大鱼 18
小鱼 15

文章不知道有什么遗漏的地方,有的话,还请多多指教。

java实现excel表格导入数据库表相关推荐

  1. mysql导入复杂excel表格,较复杂的excel表格导入数据库oracle或mysql《》

    在JAVA web开发中怎么把Excel中的数据导入到oracle数据库中 1.准备数:在excel中出需要的数据 2.将excel中的数据另存为文件(有制表符分隔的) 3.将新保存到文本文件中的数据 ...

  2. Excel表格导入数据库进行判断是否有相同的数据

    Excel表格导入数据库进行判断是否有相同的数据 这个问题困惑了我1天的时间,终于解决了这个问题.这个问题说复杂也不复杂,说简单也不简单. 我先说一下我的业务需求. 我们大家都知道,数据库对应的实体类 ...

  3. Java实现Excel批量导入数据库

    springboot实现Excel批量导入数据库 前言:项目开发中最容易碰到的需求即将Excel数据批量上传到数据库中存储 -> Java实现,Excel数据表,MySQL数据库,具体步骤如下- ...

  4. 通过java将Excel表格导入数据到数据库

    文章目录 一.首先.我们使用到的是apache的开源框架<poi> excel导入数据到数据库原理. demo案例:(内附注释) 实体类 数据导入解析工具类 实例业务接口如下 一.首先.我 ...

  5. java读取excel(java读取excel表格存入数据库)

    怎么用java读取excel 里面的数据 * excel文件的读入和更新 * 使用的是jxl 技术. public static void main(String[] args) throws Row ...

  6. php语言中Excel表格导入数据库的方法详解

    在php编程语言中,对于如何在Excel表格中导入数据库的方法是很多编程者比较头疼的一个问题,有些技术人员可能在百度尝试过搜索很多不同的问题,但是给出的答案经过自己测试之后,发现还是行不通,那么对此, ...

  7. java中excel文件导入数据库中_〖JAVE经验〗java中Excel导入数据库里

    1 从Excel文件读取数据表 Java Excel API既可以从本地文件系统的一个文件(.xls),也可以从输入流中读取Excel数据表.读取Excel数据表的第一步是创建Workbook(术语: ...

  8. C# 或Asp.Net 将excel表格导入数据库

    一.把DataTable插入数据库 public static void DataTableToDB() {         string _strExcelFileName = @"D:\ ...

  9. 将excel表格导入数据库

    前言:csdn.net论坛里看到好多帖子在讨论如何读取Excel以及如何将DataTable插入DataBase的问题. 环境:c#.2005+Access 一.把DataTable插入数据库 pub ...

最新文章

  1. OpenCV学习笔记2---命名规约
  2. jquery控制只监听数字_JQuery通过一个开关来控制某个元素的监听
  3. 天线的起源与发展历史
  4. 蓝桥杯2017初赛-打印大X-找规律
  5. CF623E Transforming Sequence(多项式/倍增fft/动态规划)
  6. 《机器学习系列-强填EM算法在理论与工程之间的鸿沟(上)》
  7. vb 导出整数 科学计数法_可整数组的计数
  8. Goalng笔记——排序和查找
  9. js学习小计1-onbeforeunload
  10. Linq To Sql, 为何继承就这么费劲?
  11. 用phpcms如何将静态页面制作成企业网站(上)
  12. 【模拟】牛客网:区间表达
  13. Vert.x 异步访问数据库 MySQL
  14. 扫描文件PDF转换器
  15. 关于opencv中图像的坐标原点的区分
  16. 单片机作业1_为OLED制作汉字字库_第1部分
  17. 中国知名网站(alexa top 500)
  18. Scrum板与Kanban如何抉择?bdqkdzlvv板与按照vfnbex
  19. 第四周作业上(2014.3.31)
  20. 分享给Python程序员的自学路线,不再背负小白名称

热门文章

  1. 爬虫案例——淘宝图片爬虫
  2. 理学院购服务器项目协议采购,西安工业大学服务器、电脑协议招标公告
  3. cocos lua 接入google Play 排行榜
  4. android win10 日历提醒,如何将手机日历和win10自带日历的日程同步
  5. NOIP2016 普及组 总结+题目吐槽+代码+简单题解
  6. linux dns无法解析,Linux服务器内部无法解析域名
  7. 思科拓扑----小型网络架构练习
  8. 解决Win XP登录后等待10分钟才显示桌面的问题
  9. 计算机成绩0123,12123驾照考试成绩查询入口-12123驾照考试成绩查询分数的教程
  10. 电脑蓝屏怎么解决?一键快速解决蓝屏问题