jsp+servlet上传excel并将数据导入到数据库表的实现方法

您所在的位置:网站首页 MySQL导入excel数据 jsp+servlet上传excel并将数据导入到数据库表的实现方法

jsp+servlet上传excel并将数据导入到数据库表的实现方法

#jsp+servlet上传excel并将数据导入到数据库表的实现方法| 来源: 网络整理| 查看: 265

基本思路:

(1)jsp上传xls文件,并通过ajax调用servlet获取该文件信息;

(2)servlet中uploadExcel首先将获取的文件保存到服务器特定路径下,并返回这个服务器上的完整路径xlsFilePath;然后excel2Db方法将xlsFilePath路径的文件读取拼接成字符串,然后再写入数据库;

(3)jsp的ajax接受到servlet执行结果给出提示信息。

涉及的uploadFile.jsp程序如下:

excel文件上传 function test1(){ if($("#uploadFile").val().trim()===""){ alert("上传文件不能为空"); return; }; var form = new FormData(document.getElementById("uploadForm")); $.ajax({ url:"Excel2DbServlet", type:"post", async:false, data:form, dataType:"text", processData: false, // 告诉jQuery不要去处理发送的数据 contentType: false, // 告诉jQuery不要去设置Content-Type请求头 success:function(result){ if(result==="success"){ alert("上传成功"); }else{ alert("上传失败"); } }, error:function(){ alert("servlet执行返回值出错"); } }); } excel文件上传至数据库测试页面 选择一个文件:

         excel2DbServlet.java程序如下:

/* * 该servlet用于从jsp页面获取excel并将其内容写入数据库的相关操作,主要包括 * (1)将请求包中的excel文件保存到服务器上特定路径下的方法excelUpload(),并给出excel在服务器上的具体路径excelPath; * (2)将excelPath的excel文件分解为字符串,形如("","","",""),("","","",""), * 最后拼接在insert语句后面实现批量插入 * (3) 根据插入结果正确与否返回提示信息。 */ package com.honormes.servlet; import com.honormes.util.DbUtil; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.sql.ResultSet; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import jxl.read.biff.BiffException; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; /** * * @author JoshwaWanag */ public class Excel2DbServlet extends HttpServlet { private static final long serialVersionUID = 1L; // 上传文件存储目录 private static final String UPLOAD_DIRECTORY = "upload"; // 上传配置 private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3; // 3MB private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String xlsFilePath="";//最后更新为上传xls在服务器上的绝对地址,由excelUpload()返回 String result="Error"; //最后更新为xls文件导入数据库正确与否的字符串,由excel2Db返回 System.out.println("doPost in Excel2Db"); //1. 调用excelUpload()将传递过来的excel表写入服务器硬盘,并返回该文件路径------ xlsFilePath =excelUpload(request,response); //2. 调用excel2Db()将xlsFilePath的excel文件内容读取出来并写入数据库----------- if(!xlsFilePath.equals("Error")){ try { result=excel2Db(xlsFilePath); } catch (FileNotFoundException ex) { Logger.getLogger(Excel2DbServlet.class.getName()).log(Level.SEVERE, null, ex); } catch (BiffException ex) { Logger.getLogger(Excel2DbServlet.class.getName()).log(Level.SEVERE, null, ex); } }else{ result="Error"; } //3. 将2的结果result写入响应包 //System.out.println("result:="+result); response.getWriter().print(result); } //处理excel文件上传的相关程序 protected String excelUpload(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String answer=""; // 检测是否为多媒体上传 if (!ServletFileUpload.isMultipartContent(request)) { // 如果不是则停止 PrintWriter writer = response.getWriter(); writer.println("Error: 表单必须包含 enctype=multipart/form-data"); writer.flush(); return "Error"; } // 配置上传参数 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中 factory.setSizeThreshold(MEMORY_THRESHOLD); // 设置临时存储目录 factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); ServletFileUpload upload = new ServletFileUpload(factory); // 设置最大文件上传值 upload.setFileSizeMax(MAX_FILE_SIZE); // 设置最大请求值 (包含文件和表单数据) upload.setSizeMax(MAX_REQUEST_SIZE); // 中文处理 upload.setHeaderEncoding("UTF-8"); // 构造临时路径来存储上传的文件 // 这个路径相对当前应用的目录,这是tomcat5.6.7能用的 //String uploadPath = request.getServletContext().getRealPath("./") + File.separator + UPLOAD_DIRECTORY; // 这个路径相对当前应用的目录,这是tomcat8以上能用的 String uploadPath = this.getClass().getClassLoader().getResource("../../").getPath()+ File.separator + UPLOAD_DIRECTORY; // 如果目录不存在则创建 File uploadDir = new File(uploadPath); if (!uploadDir.exists()) { uploadDir.mkdir(); } try { // 解析请求的内容提取文件数据 @SuppressWarnings("unchecked") List formItems = upload.parseRequest(request); if (formItems != null && formItems.size() > 0) { // 迭代表单数据 for (FileItem item : formItems) { // 处理不在表单中的字段 if (!item.isFormField()) { String fileName = new File(item.getName()).getName(); String filePath = uploadPath + File.separator + fileName; File storeFile = new File(filePath); // 在控制台输出文件的上传路径 //System.out.println(filePath); answer=filePath; // 保存文件到硬盘 item.write(storeFile); //request.setAttribute("message","文件上传成功!"); } } } } catch (Exception ex) { System.out.println("erro in Excel2DbServlet excelUpload()"+ex.getMessage()); } return answer;//"服务器上excel文件地址"或者"Error"字符; } //根据xlsFilePath对应的xls文件,将其内容读取出来,并写入数据库中 protected String excel2Db(String xlsFilePath) throws FileNotFoundException, IOException, BiffException{ //****************************************************************** // 将传递过来路径的xls文件的第一个sheet的内容拼接为字符串 //****************************************************************** // 1、构造excel文件输入流对象 String sFilePath = xlsFilePath; InputStream is = new FileInputStream(sFilePath); // 2、声明工作簿对象 Workbook rwb = Workbook.getWorkbook(is); // 3、获得工作簿中工作表的个数,对应于一个excel中的工作表个数 rwb.getNumberOfSheets();//一般只用第一个sheet //--------------------------------------------- //如下内容需要根据excel模板以及excel表进行相应的修改 String theData="";//最后用于插入数据表语句insert的值 Sheet oFirstSheet = rwb.getSheet(0);// 使用索引形式获取第一个工作表,也可以使用rwb.getSheet(sheetName);其中sheetName表示的是工作表的名称 //System.out.println("工作表名称:" + oFirstSheet.getName()); int rows = oFirstSheet.getRows();//获取工作表中的总行数 int columns = oFirstSheet.getColumns();//获取工作表中的总列数 //System.out.println(rows+" "+columns+"\r\n"); //所有内容都做字符处理 for (int i = 1; i < rows; i++) {//模板中的第一行作为标题行 theData+="("; for (int j = 0; j < columns; j++) {// Cell oCell= oFirstSheet.getCell(j,i);//需要注意的是这里的getCell方法的参数,第一个是指定第几列,第二个参数才是指定第几行 theData+="'"+oCell.getContents()+"',";//将单元格内容提取、拼接至theData } theData+="'123456',";//初始密码为123456 theData = theData.substring(0, theData.length() - 1);//获得了excel值 theData+="),"; } theData = theData.substring(0, theData.length() - 1);//获得了excel值,并拼接为字符串,类似于 //('楚留香','chuliuxiang'),('胡铁花','hutiehua') //****************************************************************** //下面需要将theData写入数据库,这里需要根据写入数据表字段的需求进行修改 //****************************************************************** //1.构建数据库处理对象 DbUtil db=new DbUtil(); //2.构建完整的insert语句 String sql = "insert into hm_user (userName,userId,site,department,sex,birthday,password) values "+theData ; int rs = db.executeUpdate(sql); String result="Error"; if(rs>=0){ result="success"; } return result; } }

主要有这两个文件即可,当然还需要:

(1)servlet需要在web.xml中配置自行;

(2)数据库插入操作需要根据excel表格和数据库表字段进行设置;

(3)上传和excel操作所需要的jar包jxl.jar,commons-fileupload-1.4.jar和commons-io-2.5.jar需要下载和复制到"\WEB-INF\lib"目录下,并导入到库中。

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3