poi解析excel

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poi解析excel相关的知识,希望对你有一定的参考价值。

一.遇见的问题:

  当单元格设置为日期类型时,cell.getCellStyle().getDataFormat()返回的值都为176。

  poi jar包3.14以上不支持用cell.getCellType()判断类型的方法。

  使用poi解析技术需要导入poi以及poi-ooxml两个jar包。

二.单元格的类型cell.getCellType():

  HSSFCell.CELL_TYPE_NUMERIC:数字类型(包含日期)

  CELL_TYPE_STRING:字符串

  CELL_TYPE_BOOLEAN:布尔类型

  CELL_TYPE_BLANK:没有值

  CELL_TYPE_FORMULA:公式取值

三.单元格为自定义类型的时候,cell.getCellStyle().getDataFormat()值:

  yyyy-MM-dd---->14

  yyyy年m月d日--->31

  yyyy年m月------>57

  m月d日  -------->58

  HH:mm--------->20

  h时mm分  ------>32

四.最终代码:

package cn.trashman.excel;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;  

public class PoiExcel {  
    public static void main(String[] args) {  
        poiExcel("D:/1.xlsx");  
    }  
    @SuppressWarnings("resource")
    public static void poiExcel(String fileName){  
        boolean is2007 = true;    //判断是否是excel2007格式  
        if(fileName.endsWith("xlsx"))  
            is2007 = false;
        try {  
            InputStream input = new FileInputStream(fileName);  //建立输入流  
            Workbook wb  = null;
            //根据文件格式(2003或者2007)来初始化  
            if(is2007)  
                wb = new HSSFWorkbook(input);  
            else  
                wb = new XSSFWorkbook(input); 
            Sheet sheet = wb.getSheetAt(0);
            int lastRowNum = sheet.getLastRowNum();
            for (int i = 0; i <= lastRowNum; i++) {
                //具体到某一行
                Row row = sheet.getRow(i);
                //单元格的数量
                int lastCellNum = row.getLastCellNum();
                for (int j = 0; j < lastCellNum; j++) {
                    Cell cell = row.getCell(j);
                    //根据cell中的类型来输出数据  
                    switch (cell.getCellType()) {  
                    case HSSFCell.CELL_TYPE_NUMERIC:
                        Object result = cell.getNumericCellValue();
//                        // 判断单元格是否属于日期格式  
//                        if(HSSFDateUtil.isCellDateFormatted(cell)){
//                            //java.util.Date类型  
//                            result = cell.getDateCellValue();
//                        }
                        short format = cell.getCellStyle().getDataFormat();
                        SimpleDateFormat sdf = null; 
                        if(format != 0){
//                            format == 176时是当指定单元格格式为日期是都是176
                            if(format == 14 || format == 31 || format == 57 || format == 58||format == 176){  
                                //日期  
                                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);  
                            result = sdf.format(date);
                        }
                        System.out.println(result);  
                        break;  
                    case HSSFCell.CELL_TYPE_STRING:  
                        System.out.println(cell.getStringCellValue());  
                        break;  
                    case HSSFCell.CELL_TYPE_BOOLEAN:  
                        System.out.println(cell.getBooleanCellValue());  
                        break;  
                    case HSSFCell.CELL_TYPE_FORMULA:  
                        System.out.println(cell.getCellFormula());  
                        break;  
                    case HSSFCell.CELL_TYPE_BLANK:  
                        System.out.println("为空");  
                        break;   
                    default:  
                        System.out.println("unsuported sell type");  
                    break;  
                    }  
                }
                System.out.println();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }  
} 

以上是关于poi解析excel的主要内容,如果未能解决你的问题,请参考以下文章

用POI解析Excel 出现的不能识别的编码问题

Java解析Excel之POI

基于POI导出Excel数据

java使用POI解析2007以上的Excel表格

poi 解析excel问题

java使用poi读取excel时,电话号码变成了科学计数法,整数变成double,怎么改过来