package com; import java.io.File; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; 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.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; /** * jar包: * commons-fileupload-1.2.1.jar * commons-io-1.4.jar * poi-3.11-20141221.jar * * 直接从上传的输入流中读取excel数据解析出其中的数据 * */ @SuppressWarnings("serial") public class PoiAction extends HttpServlet { @SuppressWarnings("unchecked") public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { DiskFileItemFactory factory = new DiskFileItemFactory(); // 使用系统临时路径 String path = System.getProperty("user.home"); factory.setRepository(new File(path)); factory.setSizeThreshold(1024 * 1024); ServletFileUpload upload = new ServletFileUpload(factory); upload.setHeaderEncoding("utf-8"); try { //这个方法支持多文件上传,本例子中不需要 List<FileItem> list = (List<FileItem>) upload.parseRequest(request); for (FileItem item : list) { // 获取表单的属性名字 String name = item.getFieldName(); // 如果获取的表单信息是普通的文本信息,上传有时候是混在表单中的,本例中不需要考虑 if (item.isFormField()) { String value = new String((item.getString("iso8859-1")).getBytes("iso8859-1"),"utf-8"); System.out.println(name+":"+value); } else { // 获取上传路径 // String value = item.getName(); // int start = value.lastIndexOf("\\"); // 获得上传文件名 // String filename = value.substring(start + 1); // 将文件写到磁盘,如果不解析就成了文件上传功能了 // item.write(new File(path, filename)); //-----------进行解析--------- Workbook wb = new HSSFWorkbook(item.getInputStream()); Sheet sheet1 = wb.getSheetAt(0); for (Row row : sheet1) { for (Cell cell : row) { // excel单元格的索引 // CellReference cellRef = new CellReference(row.getRowNum(), cell.getColumnIndex()); // System.out.print("索引"+cellRef.formatAsString()); switch (cell.getCellType()) { // 文本内容 case Cell.CELL_TYPE_STRING: System.out.println(cell.getRichStringCellValue().getString()); break; // 数字与日期 case Cell.CELL_TYPE_NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { System.out.println(cell.getDateCellValue()); } else { System.out.println(cell.getNumericCellValue()); } break; // 公式数据 case Cell.CELL_TYPE_FORMULA: System.out.println(cell.getCellFormula()); break; default: System.out.println(); } } } } } } catch (FileUploadException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } request.getRequestDispatcher("index.jsp").forward(request, response); } }