使用POI读取xlsx文件,包含对excel中自定义时间格式的处理

Posted Mrning

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用POI读取xlsx文件,包含对excel中自定义时间格式的处理相关的知识,希望对你有一定的参考价值。

package poi;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class GetExcelData {

    public static List<Map<Integer,Object>> readFile(File file){
        // excel中第几列 : 对应的表头
        Map<Integer,String> colAndNameMap = new HashMap<>();
        List<Map<Integer,Object>> resultList = new ArrayList<>();
        FileInputStream fs = null;
        XSSFWorkbook wb = null;
        try {
             fs = new FileInputStream(file);
             wb = new XSSFWorkbook(fs);
            for(int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++){
                //获取sheet数据
                XSSFSheet st = wb.getSheetAt(sheetIndex);
                //遍历一个sheet中每一行
                for (int rowIndex = 0; rowIndex <= st.getLastRowNum(); rowIndex++) {
                    // 表头:值
                    Map<Integer,Object> nameAndValMap = new HashMap<>();
                    // 获取到一行数据
                    XSSFRow row = st.getRow(rowIndex);
                    for(int cellIndex = 0; cellIndex < row.getPhysicalNumberOfCells(); cellIndex++){
                        
                        if(rowIndex==0){
                            colAndNameMap.put(cellIndex, row.getCell(cellIndex).getStringCellValue());
                        }else if(!colAndNameMap.isEmpty()){
                            nameAndValMap.put(cellIndex, buildDate(row.getCell(cellIndex)));
                        }
                    }
                    if(!nameAndValMap.isEmpty()){
                        resultList.add(nameAndValMap);
                    }
                }
            }
            return resultList;
        } catch (FileNotFoundException e) {
            System.out.println(">>>>>>>>>>  读取excel文件时出错了!!!");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println(">>>>>>>>>>  读取excel文件时出错了!!!");
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println(">>>>>>>>>>  读取excel文件时出错了!!!");
            e.printStackTrace();
        } finally{
            try {
                wb.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                fs.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    // 将excel中时间格式字段进行处理
    @SuppressWarnings("deprecation")
    public static String buildDate(XSSFCell cell) {
        String result = new String();
        switch (cell.getCellType()) {
        case XSSFCell.CELL_TYPE_NUMERIC:
            if (cell.getCellStyle().getDataFormat() == 176) {
                // 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                double value = cell.getNumericCellValue();
                Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);
                result = sdf.format(date);
            } else {
                double value = cell.getNumericCellValue();
                CellStyle style = cell.getCellStyle();
                DecimalFormat format = new DecimalFormat();
                String temp = style.getDataFormatString();
                // 单元格设置成常规
                if (temp.equals("General")) {
                    format.applyPattern("#");
                }
                result = format.format(value);
            }
            break;
        case XSSFCell.CELL_TYPE_STRING:// String类型
            result = cell.getStringCellValue();
            break;
        default:
            result = "";
            break;
        }
        return result;
    }

}

 

以上是关于使用POI读取xlsx文件,包含对excel中自定义时间格式的处理的主要内容,如果未能解决你的问题,请参考以下文章

springboot使用poi导出数据生成excel(.xlsx)文件

在使用 apache poi 从扩展名为 xlsx 的 Excel 文件中读取数据时,需要很长时间

java之使用poi对excel的.xls和.xlsx访问

使用Apache POI读取Excel .XLSX时出错

通过 Apache POI 读取大型 Excel 文件 (xlsx) 时出错

java使用POI实现excel文件的读取,兼容后缀名xls和xlsx