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

基本思路:

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

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

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

涉及的uploadFile.jsp程序如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




excel文件上传





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"目录下,并导入到库中。

 

你可能感兴趣的:(Java,JSP,excel,jsp)