poi处理excel遇到的坑
来源:互联网 发布:c 对端口的访问被拒绝 编辑:程序博客网 时间:2024/05/22 02:05
做poi导入导出:
导出功能还好比较简单,只需要指定好相应模板,对于日期格式的数据来说,同理模板需要设置日期,然后模板中大致的格式是
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
- poi处理excel遇到的坑
- POI解析Excel【poi的坑——空行处理】
- poi 操作excel的处理
- Java-POI操作excel遇到文本字符问题处理
- POI EXCEL多表头的处理代码
- POI EXCEL多表头的处理代码
- POI 处理Excel的简单介绍
- SpringMvc+POI 处理Excel的导入操作
- SpringMvc+POI 处理Excel的导入操作
- java poi对excel的处理
- POI 处理Excel的导入操作
- SpringMvc+POI 处理Excel的导入操作
- 《SpringMvc+POI 处理Excel的导出操作》
- SpringMvc+POI 处理Excel的导入操作
- Jakarta POI处理Excel
- POI处理excel
- 关于POI处理EXCEL
- poi处理excel导出
- JQuery上
- MIT牛人解说数学体系
- golang noblocking send
- Visual Studio的使用技巧
- 支付宝 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
- poi处理excel遇到的坑
- CRC算法
- JS对省市按首字母排序
- Spring Data REST入门(三):自定义配置
- Hadoop+HBase+ZooKeeper三者关系与安装配置
- iOS UISearchBar简介 —— HERO博客
- css3渐变之条纹背景
- 为Linux命令设置快捷键
- Qt Qwdget 汽车仪表知识点拆解3 进度条编写