POI实现报表的导入

/**

*解析文件的方法

*@param inputStream 文件输入流,要解析的Excel文件输入流

*@param suffix 文件的后缀名,xls或xlsx,代码决定使用什么方式解析Excel.

*@param startRow 从第几行开始读取数据

*@return List<String[ ]> 集合中的一个元素对应一行解析的数据

* 元素为字符串数组类型,数组中的每个元素对应一列数据

*/

public List<String[ ]> parseExcel(InputStream inputStream,String suffix,int startRow){

     //1.定义excel对象变量

    Workbook workbook =null;

    //2.判断后缀,决定使用哪种的解析方式

    if("xls".equals(suffix)){

         workbook =new HSSFWorkbook(inputStream);  //2003版

    }else if(“xlsx”.equals(suffix)){

         workbook =new XSSFWorkbook(inputStream);  //2007版

    }else{

        return null;  //未知内容

    }

    //获取工作表excel分为若干个表,sheet

    Sheet sheet =workbook.getSheetAt(0);

    if(sheet ==null){

        return null;

    }

    //获取表格中最后一行的行号

    int lastRowNum =sheet.getLastRowNum();

    for(startNum>=lastRowNum){

        return null;

     }

     List<String[ ]> result =new ArrayList<String [ ]>();  //存在结果的list

    //定义行变量和单元格变量

   Row row =null;

   Cell cell =null;

     //可以循环读取数据了

     for(int rowNum =startNum; rowNum <=lastRowNum; rowNum ++){

              row =sheet.getRow(rowNum);

              //获取当前的第一列和最后一列的标记

              short firstCellNum =row.getFirstCellNum();

              short lastCellNum =row.getLastCellNum();

               if(lastCellNum !=0){  

                       String[ ]  rowArray =new String[lastCellNum ];

                     for(int cellNum =firstCellNum; cellNum <=lastCellNum; cellNum ++){

                               cell =row.getCell(cellNum);

                              //判断单元格是否有数据

                             if(cell ==null){

                                   rowArray[cellNum] =null;

                              }else{

                                   rowArray[cellNum] =parseCell(cell);

                            }

                     }

                     result.add(rowArray);

               }

     }

     return result;

}

 

/**

*解析单元格数据

*@return String 单元格数据

*/

private String parseCell(Cell cell){

      String cellStr =null;

       //判断单元格的类型

       switch(cell.getCellType()){

             case HSSFCell.CELL.TYPE_STRING;

                      //字符串类型单元格

                      cellStr =cell.getRichStringCellValue().toString();

                       break;

            case HSSFCell.CELL_TYPE_BLANK;

                     //空数据,标准数据

                     cell =null;

                    break;

            case HSSFCell.Cell_TYPE_NUMERIC;

                     //数学类型,数学类型包含日期,时间,数字

                     //判断日期类型[年月日 2019-12-14| 时分 10:00]类型

                     if(HSSFDateUtil.isCellDateFormatted(cell)){

                             //判断具体类型,是日期还是时间

                            if(cell.getCellType ==HSSFDataFormat.getBuiltinFormat("h:mm")){

                                      //时间

                                      sdf =new SimpleDataFormat("HH:mm");

                             }else{

                                    //日期

                                    sdf =new SimpleDataFormat("yyyy-MM-dd");

                              }

                              Date  temp =cell.getDateCellValue();

                              cellStr =sdf.format(temp);

                      }else{

                            //数字

                            double temp =cell.getNumericCellValue();

                           //数学格式化工具

                            DecimalFormat  format =new DecimalFormat();

                            //查看单元格中的具体样式类型

                            String formatStr =cell.getCellStyle().getDataFormatString();

                            if(formatStr.equals("General")){

                                     //定义格式化正则,使用具体有效数据进行格式化,且值保留有效数据

                                      format.applyPattern("#");  //如果想要两位小数写成 "#.##"

                            }

                            cellStr =format.format(temp);

                     }

                      break;

            default :

                  cellStr =null;

         }

       return cellStr;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值