使用java如何实现导入Excel,以及读出Excel内容



使用java如何实现导入Excel,以及读出Excel内容,java读写Excel的简单方法实例。java读写Excel思路很简单:1、做一个jsp页面,页面包括浏览文件,提交文件;2、将excel文件上传到服务器;3、  服务器对该excel文件进行读出;4、  将excel文件内容显示到页面上。

环境搭建:

需要准备的包:commons-fileupload-1.2.1.jar & commons-io-1.3.2.jar 这两个包是上传用的

jxl.jar 这个包是读取excel用的 下载地址 :http://sourceforge.net/projects/jexcelapi/  建议不要用新版本,因为新版本会出现与jdk版本兼容问题,如果运行程序出现问题的时候请切换旧版本。

Jsp页面

注意:1、在jsp页面的form要使用html本身的<form>标记,而不要使用第三方视图开源框架的form标记,例如不要使用strut的<htm:form>。

2、在<form>的属性里必须加上  ENCTYPE=”multipart/form-data”

  1. <h1>导入Excel</h1>
  2.        <hr>
  3.        <form action=”importExcel” method=”post” enctype=”multipart/form-data”>
  4.            <input type=”file” name=”importExcel” id=”importExcel”>
  5.            <input type=”submit” value=”导入”>
  6.        </form>


上传excel的Servlet文件

注意:1、导入的excel最好用后缀为.xls,如果用.xlsx可能会导不进去。

2、在调用FileItem的write方法前必须保证文件的存放路径存在否则出现异常。commons fileupload不会自动为你建立不存在的目录。

3、上传后会对文件进行重命名,以时间为文件名进行命名

  1. public class ImportExcelServlet extends HttpServlet {
  2.      //缓冲区域
  3.       File tempPathFile;
  4.      //默认路径
  5.       String uploadTo = ”D:\\”;
  6.      // 支持的文件类型
  7.       String[] errorType = { ”.xls” };
  8.      //格式化日期
  9.       SimpleDateFormat format = new SimpleDateFormat(“yyyyMMddHHmmssSSS”);
  10.      @Override
  11.      protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  12.              throws ServletException, IOException {
  13.          req.setCharacterEncoding(“utf-8″);
  14.          resp.setCharacterEncoding(“utf-8″);
  15.   //取得服务器真实路径
  16.           uploadTo = req.getSession().getServletContext().getRealPath(“\\”) + ”upload\\”;
  17.          // Create a factory for disk-based file items
  18.           DiskFileItemFactory factory = new DiskFileItemFactory();
  19.           // 设置缓冲区大小,这里是4kb
  20.           factory.setSizeThreshold(4096);
  21.          // 设置缓冲区目录
  22.           factory.setRepository(tempPathFile);
  23.          // Create a new file upload handler
  24.           ServletFileUpload upload = new ServletFileUpload(factory);
  25.          // Set overall request size constraint
  26.          // 设置最大文件尺寸,这里是4MB
  27.          upload.setSizeMax(4*1024*1024);
  28.          // 开始读取上传信息
  29.          List fileItems = new ArrayList();
  30.          try {
  31.              fileItems = upload.parseRequest(req);
  32.          } catch (FileUploadException e1) {
  33.              e1.printStackTrace();
  34.          }
  35.          // 依次处理每个上传的文件
  36.          Iterator iter = fileItems.iterator();
  37.          System.out.println(“fileItems的大小是” + fileItems.size());
  38.          // 正则匹配,过滤路径取文件名
  39.          String regExp = ”.+\\\\(.+)$”;
  40.          Pattern p = Pattern.compile(regExp);
  41.          while (iter.hasNext()) {
  42.              FileItem item = (FileItem) iter.next();
  43.              // 忽略其他不是文件域的所有表单信息
  44.              System.out.println(“正在处理” + item.getFieldName());
  45.              if (!item.isFormField()) {
  46.                  String name = item.getName();
  47.                  long size = item.getSize();
  48.                  if ((name == null || name.equals(“”)) && size == 0)
  49.                      continue;
  50.                  Matcher m = p.matcher(name);
  51.                  boolean result = m.find();
  52.                  if (result) {
  53.                      boolean flag = false;
  54.                      for (int temp = 0; temp < errorType.length; temp++) {
  55.                          if(m.group(1).endsWith(errorType[temp])) {
  56.                              flag = true;
  57.                          }
  58.                      }
  59.                      if(!flag) {
  60.                          System.out.println(“上传了不支持的文件类型”);
  61.                          throw new IOException(name + ”: wrong type”);
  62.                      }
  63.                      try {
  64.                          String fileName = uploadTo + format.format(new Date()) + m.group(1).substring(m.group(1).indexOf(“.”));
  65.                          item.write(new File(fileName));
  66.  //调用ReadExcel类进行读出excel
  67.                          ReadExcel.readExcel(fileName, resp.getWriter());
  68.                          System.out.println(name + ”\t\t” + size);
  69.                      } catch (Exception e) {
  70.                          e.printStackTrace();
  71.                      }
  72.                  }
  73.              } else {
  74.                  // 这里添加对不是上传文件表单项的处理
  75.                  System.out.println(“这是一个表单项”);
  76.              }
  77.          }
  78.      }
  79.      @Override
  80.      protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  81.              throws ServletException, IOException {
  82.          doGet(req, resp);
  83.      }
  84.      @Override
  85.      public void init() throws ServletException {
  86.          tempPathFile = new File(“d:\\temp\\buffer\\”);
  87.          if (!tempPathFile.exists()) {
  88.              tempPathFile.mkdirs();
  89.          }
  90.      }
  91.  }

读出excel文件内容的类

  1. public class ReadExcel {
  2.      public static void readExcel(String pathname, PrintWriter out) {
  3.          try {
  4.              //打开文件
  5.              Workbook book = Workbook.getWorkbook(new File(pathname)) ;
  6.              //取得第一个sheet
  7.              Sheet sheet = book.getSheet(0);
  8.              //取得行数
  9.              int rows = sheet.getRows();
  10.              for(int i = 0; i < rows; i++) {
  11.                  Cell [] cell = sheet.getRow(i);
  12.                  for(int j=0; j<cell.length; j++) {
  13.                      //getCell(列,行)
  14.                      out.print(sheet.getCell(j, i).getContents());
  15.                      out.print(“ ”);
  16.                  }
  17.                  out.println(“<br/>”);
  18.              }
  19.              //关闭文件
  20.              book.close();
  21.          } catch (BiffException e) {
  22.              e.printStackTrace();
  23.          } catch (IOException e) {
  24.              e.printStackTrace();
  25.          }
  26.      }
  27.  }

上面只是一个很简单的导入excel文件的例子,如果想做完善还得下更多的功夫。在做的过程中如果出现Workbook打不开,请更换jxl版本,尽量用低版本,这样与jdk兼容会好点,我在做这个导入excel的时候,就遇到了版本兼容问题,处理了半天才发现问题所在。