poi处理excel遇到的坑

来源:互联网 发布:c 对端口的访问被拒绝 编辑:程序博客网 时间:2024/05/22 02:05

做poi导入导出:

导出功能还好比较简单,只需要指定好相应模板,对于日期格式的数据来说,同理模板需要设置日期,然后模板中大致的格式是

<jx:forEach items="${itsmciList}" var="itsmci">    ${itsmci.name}${itsmci.categoryvalue}${itsmci.version}${itsmci.sn}${itsmci.assetNumber}</jx:forEach>    类似这样的格式:这里的itsmciList是List<Entity>这样的数据,学JAVA都知道把。

poi从数据库------到excel:原理是,先读模板,往模板注入数据,形成Workbook,workbooke经ServletOutputStream,流到浏览器端。

直接上代码:

导出@RequestMapping("/itsmciExport.do")  public void itsmciExport(HttpServletRequest request,HttpServletResponse response) throws IOException, ParsePropertyException, InvalidFormatException{QueryParameter paramMap = new QueryParameter();paramMap.addEquals("companyid", getUser().getCompanyId());List<Itsm_ci> list = itsm_ciService.findListByParam(paramMap);if(CollectionUtils.isNotEmpty(list)){String companyId = list.get(0).getCompanyid();Itsm_ci.formatList(companyId, list);//翻译}itsmCiFeatureproService.getFeatureproInfor(list);          //加进特征信息String fileName = getUser().getCompanyName()+"的配置项.xls";String filePath = this.getClass().getClassLoader().getResource("//templates//itsmciList.xls").getPath();Map<String, Object> beans = new HashMap<String, Object>();beans.put("itsmciList", list);InputStream is = new BufferedInputStream(new FileInputStream(filePath));XLSTransformer transformer = new XLSTransformer();Workbook resultWorkbook = transformer.transformXLS(is, beans);is.close();super.responseDownloadWorkbook(request, response, fileName, resultWorkbook);}

/** * workbook文件下载方法 *  * @param response * @param fileName *            文件名 * @param workbook *            文件 * @throws IOException */public void responseDownloadWorkbook(HttpServletRequest request, HttpServletResponse response, String fileName, Workbook workbook) throws IOException {String agent = request.getHeader("User-Agent").toUpperCase();String encodedfileName = "";if (agent.indexOf("MSIE") != -1 || agent.indexOf("TRIDENT") != -1) { // IEencodedfileName = URLEncoder.encode(fileName, "utf-8");} else if (agent.indexOf("CHROME") != -1 || agent.indexOf("FIREFOX") != -1) { // 谷歌或火狐encodedfileName = new String(fileName.getBytes("utf-8"), "ISO8859-1");} else {encodedfileName = new String(fileName.getBytes("utf-8"), "ISO8859-1");}// 设置输出的格式response.reset();response.setContentType("bin");response.addHeader("Content-Disposition", "attachment; filename=\"" + encodedfileName + "\"");// 取出流中的数据ServletOutputStream os = response.getOutputStream();workbook.write(os);os.write(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF });// UTF-8os.flush();os.close();}
导出完毕;

导入功能:我的需求比较复杂:需要根据      填写字段的名称去找外键 ,excel中填的是名称,但是存到数据库中是外键(前提是该名称在主表中已经存在),然后还需要分析excel填写的信息的合法性,并且将错误信息返回给用户(这里需要判断多个字段唯一性,对数据库中不存在的主表字段,也要报错误,这里我是用List<>来存放错误)。

然后一个很特别的坑是日期格式的数据。(注意,excel导入到数据库的功能:一般情况下需要服务器制定好模板让用户去下载,然后填写。所以制作模板的时候将时间格式的数据设置为时间格式)

具体业务就不写了,把那个坑献上:

/** *  *author:cwy *说明:将excel表中的数据倒入到数据库时要用到,将excel表中的数据转换成List<Map<String,Object>>形式的数据 *参数: * @param in  输入流 * @param filename     文件原始名字   * @param startrow     从第几行开始读 * @param startcol     从第几列开始读 * @param sheetnum     第几个sheet开始 * @return * @throws IOException */public   List<Map<String,Object>> readAllExcel(InputStream in, String filename, int startrow, int startcol, int sheetnum) throws IOException {List<Map<String,Object>> varList = new ArrayList<Map<String,Object>>();Workbook wb=null;try {if(filename.substring(filename.lastIndexOf(".")+1).equals("xlsx")){wb = new XSSFWorkbook(in);}else{wb=new HSSFWorkbook(in);}Sheet sheet = wb.getSheetAt(sheetnum); // sheet 从0开始int rowNum = sheet.getLastRowNum() + 1; // 取得最后一行的行号for (int i = startrow; i < rowNum; i++) { // 行循环开始Row row =  sheet.getRow(i); // 行int cellNum = row.getLastCellNum(); // 每行的最后一个单元格位置Map<String,Object> map=new HashMap<String,Object>();for (int j = startcol; j < cellNum; j++) { // 列循环开始Cell cell = row.getCell(Short.parseShort(j + ""));String cellValue = null;if (null != cell) {switch (cell.getCellType()) { // 判断excel单元格内容的格式,并对其进行转换,以便插入数据库case 0:                  //数字类型(包括纯数字和时间)cellValue = String.valueOf((int) cell.getNumericCellValue());if(HSSFDateUtil.isCellDateFormatted(cell))          //如果是时间格式(万能方法){ short format = cell.getCellStyle().getDataFormat();      SimpleDateFormat sdf = null;      if(format == 14 || format == 31 || format == 57 || format == 58){          //日期          sdf = new SimpleDateFormat("yyyy-MM-dd");      }else if (format == 20 || format == 32) {          //时间          sdf = new SimpleDateFormat("HH:mm");      }      double value = cell.getNumericCellValue();      Date date = DateUtil.getJavaDate(value);      cellValue = sdf.format(date);  }break;case 1:               //字符串类型cellValue = cell.getStringCellValue();break;case 2:              //格式类型cellValue = cell.getNumericCellValue() + "";break;case 3:              //空cellValue = "";break;case 4:              //布尔类型cellValue = String.valueOf(cell.getBooleanCellValue());break;case 5:             //错误cellValue = String.valueOf(cell.getErrorCellValue());break;}} else {cellValue = "";}map.put("var"+j,cellValue);}varList.add(map);}} catch (Exception e) {System.out.println(e);}finally{in.close();}return varList;}
List<Map<String,Object>>      excel的数据就全放到这里了。后面是解析和保存。





                                     

0 0
原创粉丝点击