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

<%@ 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=UTF-8">
<title>excel文件上传</title>
<script src="jquery-3.5.1/jquery-3.5.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
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执行返回值出错");
      }
  }); 
 
}
 
 
</script>
 
</head>
<body>
<h1>excel文件上传至数据库测试页面</h1>
<form id="uploadForm" method="post" action="" enctype="multipart/form-data">
    选择一个文件:
    <input id="uploadFile" type="file" name="uploadFile" />
    <br/><br/>
    <input type="button" value="上传" onclick="test1()" />
</form>
 
 
</body>
</html>

 

/*
 * 该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<FileItem> 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;
  }    
 
}

(45条消息) jsp+servlet上传excel并将数据导入到数据库表的实现方法_jiannywang的专栏-CSDN博客_jsp导入excel到数据库

posted @ 2021-11-08 22:11  我试试这个昵称好使不  阅读(1268)  评论(0编辑  收藏  举报