关于POI操作Excel

入司第一个任务:对Excel进行模板的下载,以及读写上传。

1.先导入jar包。poi-3.8.jar(不同版本操作的excel格式不同,xls和xlsx)

HSSFWorkbook,操作xls格式的excel
XSSFWorkbook, 操作xlsx格式的excel

2.首先说excel的下载实现(以xls格式为例)。

最简单的方法:
    直接通过链接下载,以本地为例
    --》http://localhost:8080/resources/test/测试excel.xls
    通过这个链接点击就可以下载
局限:普通的格式:xls,doc是可以下载的,涉及到图片,文本的就要在页面
     中设置了,而xlsx,docx目前好像是不能下载的。

关于POI操作Excel_第1张图片

2下面是代码的方法
public void down(HttpServletResponse response)  throws              IOException{
        InputStream fileToBeRead = new    FileInputStream("你的excel模板存放路径,精确到文件名+类型");//io流读取excel
        String title = "excel命名";
        HSSFWorkbook workbook = new HSSFWorkbook(fileToBeRead);//创建工作薄
        String fileName = java.net.URLEncoder.encode(title, "utf-8");//设置excel编码格式
        response.reset();// 设置response参数
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls");//设置excel格式
        OutputStream out = response.getOutputStream();//io流输出
        workbook.write(out);//excel成功写出
    }

3.下载很简单,上传就会有一些问题要考虑。(以xls格式为例)

public void dealExcelWithPath(String filePath) throws ParseException, IOException{
        SimpleDateFormat sd  = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        InputStream file = new FileInputStream(filePath);//io流读取上传的excel,filePath是上传的路径
      HSSFWorkbook hssfWorkbook = new HSSFWorkbook(file);//工作薄

        // 循环读取sheet(页)(excel中sheet页数未定)
for (int sheetNo = 0; sheetNo<   hssfWorkbook.getNumberOfSheets();sheetNo++) {
HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(sheetNo);//读第几页
            if (hssfSheet == null) {//若sheet为空则不读
                continue;
            }

            // 循环读取sheet中的row(行),根据实际需求,判断从第几行开始读取数据,我是从第三行开始读
            for (int rowNo = 2; rowNo <= hssfSheet.getLastRowNum(); rowNo ++) {
                HSSFRow fSSFRow = hssfSheet.getRow(rowNo);
                if(fSSFRow==null){
                    continue;//行为空的不读
                }
                //判断cell(就是单元格,列)为空则不读
                if (!(fSSFRow.getCell(0)+"").equals("") && fSSFRow.getCell(0) != null) {
                //获得cell中的内容进行操作
                }else{
                    continue;//cell为空则不读
                }

            }

        }

    }   
//读取的时候注意填充内容的类型。自定义一个方法返回值
 private String getValue(HSSFCell hssfCell) {
  if (hssfCell.getCellType() == hssfCell.CELL_TYPE_BOOLEAN{
    return String.valueOf(hssfCell.getBooleanCellValue());
  } else if(hssfCell.getCellType()==hssfCell.CELL_TYPE_NUMERIC) { 
            if(HSSFDateUtil.isCellDateFormatted(hssfCell)){
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
                return sdf.format(HSSFDateUtil.getJavaDate(hssfCell.getNumericCellValue())).toString();
            }
return String.valueOf(hssfCell.getNumericCellValue());
        } else {
            return String.valueOf(hssfCell.getStringCellValue());
        }
    }
5.一般四种类型,重点是时间类型,若出现时间,格式化的格式一定要和excel中的格式一样,不然读取异常。如果数据中出现特殊字符,比如“,”等,在读取的时候提前判断就可以了。在实际应用中,上传者上传格式可能出错,或者和要求的不同,注意try catch掉异常就就可以。

新手出品,学习之初也有参考其他大神作品,最后总结,按自己需求完成功能,亲测可用。

你可能感兴趣的:(web)