java POI导入excel表格
支持.xls,.xlsx格式
1.导入jar包依赖
<!-- POI依赖包 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.14</version> </dependency> <!-- 上传附件 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency>
2.开启springMVC上传附件支持
spring-servlet.xml
<!-- 上传附件 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="utf-8" />
3.ExcelUtil.java
package com.crs.ticket.wanda.utils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Method; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.poi.hpsf.SummaryInformation; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFClientAnchor; import org.apache.poi.hssf.usermodel.HSSFComment; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFPatriarch; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.formula.functions.T; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.streaming.SXSSFCell; import org.apache.poi.xssf.streaming.SXSSFRow; import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.web.multipart.MultipartFile; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.crs.ticket.wanda.ticket.entity.Student; import com.crs.ticket.wanda.ticket.entity.person; public class ExcelUtil{ public static final String OFFICE_EXCEL_2003_POSTFIX = "xls"; public static final String OFFICE_EXCEL_2010_POSTFIX = "xlsx"; public static final String EMPTY = ""; public static final String POINT = "."; public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); public static int totalRows; //sheet中总行数 public static int totalCells; //每一行总单元格数 //Web导入excel public static List<ArrayList<String>> importExcel(MultipartFile file) throws IOException{ //读取Excel数据到List中 List<ArrayList<String>> list = readExcel(file); return list; } /** * 获得path的后缀名 (用于判断excel的版本) * @param path * @return */ public static String getPostfix(String path){ if(path==null || EMPTY.equals(path.trim())){ return EMPTY; } if(path.contains(POINT)){ return path.substring(path.lastIndexOf(POINT)+1,path.length()); } return EMPTY; } /** * 单元格格式( 03格式) * @param hssfCell * @return */ public static String getHValue(HSSFCell hssfCell){ if (hssfCell.getCellType() == hssfCell.CELL_TYPE_BOOLEAN) { return String.valueOf(hssfCell.getBooleanCellValue()); } else if (hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC) { String cellValue = ""; if(HSSFDateUtil.isCellDateFormatted(hssfCell)){ Date date = HSSFDateUtil.getJavaDate(hssfCell.getNumericCellValue()); cellValue = sdf.format(date); }else{ DecimalFormat df = new DecimalFormat("#.##"); cellValue = df.format(hssfCell.getNumericCellValue()); String strArr = cellValue.substring(cellValue.lastIndexOf(POINT)+1,cellValue.length()); if(strArr.equals("00")){ cellValue = cellValue.substring(0, cellValue.lastIndexOf(POINT)); } } return cellValue; } else { return String.valueOf(hssfCell.getStringCellValue()); } } /** * 单元格格式 * @param xssfCell * @return */ public static String getXValue(XSSFCell xssfCell){ if (xssfCell.getCellType() == Cell.CELL_TYPE_BOOLEAN) { return String.valueOf(xssfCell.getBooleanCellValue()); } else if (xssfCell.getCellType() == Cell.CELL_TYPE_NUMERIC) { String cellValue = ""; if(XSSFDateUtil.isCellDateFormatted(xssfCell)){ Date date = XSSFDateUtil.getJavaDate(xssfCell.getNumericCellValue()); cellValue = sdf.format(date); }else{ DecimalFormat df = new DecimalFormat("#.##"); cellValue = df.format(xssfCell.getNumericCellValue()); String strArr = cellValue.substring(cellValue.lastIndexOf(POINT)+1,cellValue.length()); if(strArr.equals("00")){ cellValue = cellValue.substring(0, cellValue.lastIndexOf(POINT)); } } return cellValue; } else { return String.valueOf(xssfCell.getStringCellValue()); } } public static void main(String[] args) throws IOException { int count = 100000; JSONArray ja = new JSONArray(); for(int i=0;i<100000;i++){ person s = new person(); s.setName("POI"+i); s.setAge(i); s.setBirthday(new Date()); s.setHeight(i); s.setWeight(i); s.setSex(i/2==0?false:true); ja.add(s); } Map<String,String> headMap = new LinkedHashMap<String,String>(); headMap.put("name","姓名"); headMap.put("age","年龄"); headMap.put("birthday","生日"); headMap.put("height","身高"); headMap.put("weight","体重"); headMap.put("sex","性别"); String title = "测试"; /* OutputStream outXls = new FileOutputStream("E://a.xls"); System.out.println("正在导出xls...."); Date d = new Date(); ExcelUtil.exportExcel(title,headMap,ja,null,outXls); System.out.println("共"+count+"条数据,执行"+(new Date().getTime()-d.getTime())+"ms"); outXls.close();*/ // OutputStream outXlsx = new FileOutputStream("E://b.xlsx"); System.out.println("正在导出xlsx...."); Date d2 = new Date(); ExcelUtil.exportExcelX(title,headMap,ja,null,0,outXlsx); System.out.println("共"+count+"条数据,执行"+(new Date().getTime()-d2.getTime())+"ms"); outXlsx.close(); } /** * read the Excel .xlsx,.xls * @param file jsp中的上传文件 * @return * @throws IOException */ public static List<ArrayList<String>> readExcel(MultipartFile file) throws IOException { if(file==null||ExcelUtil.EMPTY.equals(file.getOriginalFilename().trim())){ return null; }else{ String postfix = ExcelUtil.getPostfix(file.getOriginalFilename()); if(!ExcelUtil.EMPTY.equals(postfix)){ if(ExcelUtil.OFFICE_EXCEL_2003_POSTFIX.equals(postfix)){ return readXls(file); }else if(ExcelUtil.OFFICE_EXCEL_2010_POSTFIX.equals(postfix)){ return readXlsx(file); }else{ return null; } } } return null; } /** * read the Excel 2010 .xlsx * @param file * @param beanclazz * @param titleExist * @return * @throws IOException */ public static List<ArrayList<String>> readXlsx(MultipartFile file){ List<ArrayList<String>> list = new ArrayList<ArrayList<String>>(); // IO流读取文件 InputStream input = null; XSSFWorkbook wb = null; ArrayList<String> rowList = null; try { input = file.getInputStream(); // 创建文档 wb = new XSSFWorkbook(input); //读取sheet(页) for(int numSheet=0;numSheet<wb.getNumberOfSheets();numSheet++){ XSSFSheet xssfSheet = wb.getSheetAt(numSheet); if(xssfSheet == null){ continue; } totalRows = xssfSheet.getLastRowNum(); //读取Row,从第二行开始 for(int rowNum = 3;rowNum <= totalRows;rowNum++){ XSSFRow xssfRow = xssfSheet.getRow(rowNum); if(xssfRow!=null){ rowList = new ArrayList<String>(); totalCells = xssfRow.getLastCellNum(); //读取列,从第一列开始 for(int c=0;c<=totalCells+1;c++){ XSSFCell cell = xssfRow.getCell(c); if(cell==null){ rowList.add(ExcelUtil.EMPTY); continue; } rowList.add(ExcelUtil.getXValue(cell).trim()); } list.add(rowList); } } } return list; } catch (IOException e) { e.printStackTrace(); } finally{ try { input.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } /** * read the Excel 2003-2007 .xls * @param file * @param beanclazz * @param titleExist * @return * @throws IOException */ public static List<ArrayList<String>> readXls(MultipartFile file){ List<ArrayList<String>> list = new ArrayList<ArrayList<String>>(); // IO流读取文件 InputStream input = null; HSSFWorkbook wb = null; ArrayList<String> rowList = null; try { input = file.getInputStream(); // 创建文档 wb = new HSSFWorkbook(input); //读取sheet(页) for(int numSheet=0;numSheet<wb.getNumberOfSheets();numSheet++){ HSSFSheet hssfSheet = wb.getSheetAt(numSheet); if(hssfSheet == null){ continue; } totalRows = hssfSheet.getLastRowNum(); //读取Row,从第二行开始 for(int rowNum = 1;rowNum <= totalRows;rowNum++){ HSSFRow hssfRow = hssfSheet.getRow(rowNum); if(hssfRow!=null){ rowList = new ArrayList<String>(); totalCells = hssfRow.getLastCellNum(); //读取列,从第一列开始 for(short c=0;c<=totalCells+1;c++){ HSSFCell cell = hssfRow.getCell(c); if(cell==null){ rowList.add(ExcelUtil.EMPTY); continue; } rowList.add(ExcelUtil.getHValue(cell).trim()); } list.add(rowList); } } } return list; } catch (IOException e) { e.printStackTrace(); } finally{ try { input.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } } /** * 自定义xssf日期工具类 * @author lp * */ class XSSFDateUtil extends DateUtil{ protected static int absoluteDay(Calendar cal, boolean use1904windowing) { return DateUtil.absoluteDay(cal, use1904windowing); } }
4.jsp
<form id="form1" name="form1" action="${ctx }/ticket/impleExcel" method="post" enctype="multipart/form-data"> <input type="file" id="f1" name="f1"> <input type="button" name="checkSAPmain" id="checkSAPmain" value="导入数据" onclick="imporExcel()"> </form> </body> <script type="text/javascript"> function imporExcel(){ alert("imporExcel"); var form = document.getElementById("form1"); if(form.encoding){ form.setAttribute('encoding','multipart/form-data'); }else{ form.setAttribute('enctype','multipart/form-data'); } form1.submit(); } </script>
5.Controller
@RequestMapping(value = "/ticket/impleExcel",method = {RequestMethod.GET,RequestMethod.POST}) public void importExcel(HttpServletRequest request, HttpServletResponse response, @RequestParam(value = "f1", required = false) MultipartFile file )throws Exception{ JSONObject obj = new JSONObject(); //判断文件是否为空 if(file == null){ obj.put("status", "false"); obj.put("message", "上传文件为空"); response.getWriter().print(obj); } String name = file.getOriginalFilename(); long size = file.getSize(); if(name == null || ExcelUtil.EMPTY.equals(name) && size==0){ obj.put("status", "false"); obj.put("message", "上传文件为空"); response.getWriter().print(obj); } List<ArrayList<String>> excelList = ExcelUtil.importExcel(file); System.out.println(excelList.size()); }
划船不用桨、杨帆不等风、一生全靠浪