有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

我可以在excel单元格中输入Java格式的日期吗?

我有一个java程序,它使用ApachePOI3.17阅读和编辑xlsx工作簿。我想读一个日期,格式很重要。我需要原始日期,也就是制作工作簿的人输入的日期。我做了很多研究,发现日期在Excel中是以整数形式存储的,十进制数就是时间。例如,一个人输入“1/1/1947”,Excel将其内部存储为“17168”,然后在单元格中显示为“01-Jan-47”。我无法更改原始工作簿。有没有办法获得在java程序中使用apache poi时输入的原始“1/1/1947”?当我这样做的时候:

Cell cell = row.getCell(cellColumn, MissingCellPolicy.CREATE_NULL_AS_BLANK); String value = dataFormatter.formatCellValue(cell);

该值显示为显示值“01-Jan-47”。当我这样做的时候:

Cell cell = row.getCell(cellColumn, MissingCellPolicy.CREATE_NULL_AS_BLANK); cell.setCellType(CellType.STRING); String value = cell.getStringCellValue();

我得到了内部值“17168”。有人知道如何(或者如果可能的话)输入原始值吗?它肯定会存储在Excel工作簿中,因为它会在单击单元格时显示。或者,如果我在Eclipse中调试程序并单击上面显示的cell对象,日期以显示格式显示,但它有完整的4位年份;“1947年1月1日”。如果原始格式不可能,我也可以使用它,所以如果有人知道如何将其转换为字符串,它也会有所帮助。谢谢


共 (3) 个答案

  1. # 1 楼答案

    正如Axel Richter在评论中所解释的,原始格式从未被存储。我以为原始格式实际上是我操作系统的默认格式。我将使用Excel中的数字存储格式或单元格。getDateCellValue获取完整日期并重新格式化。谢谢大家的评论

  2. # 2 楼答案

    我记得我也试过

    Cell cell = ...
    int format = cell.getCellStyle().getDataFormat();
    String formatPattern = cell.getCellStyle().getDataFormatString(); // ddmm
    

    现在formatPattern可能有助于将其转换为java日期格式化程序。 (代码对一些标准值(API中有常数)和自定义值进行编号。) 当时我没有这样做,因为解决方案并不令人满意

    也许你会更成功,所以我提到了

  3. # 3 楼答案

    (跟进评论)

    根据您包含的代码:

    Cell cell = row.getCell(cellColumn, MissingCellPolicy.CREATE_NULL_AS_BLANK);
    cell.setCellType(CellType.STRING);
    String value = cell.getStringCellValue();
    

    下面是一个函数示例,该函数可以返回一个经过处理的字符串值,以表示您正在寻找的目标:

    private static String returnOrig(String value) {
    
       String mth;
       String[] parts = value.split("-");
       String day = parts[0];
    
       if (day.substring(0,1).equals("0")) {
           day = day.substring(1,2);
       } 
    
       switch(parts[1]) {
           case "Jan": mth = "1"; break;
           case "Feb": mth = "2"; break;
           case "Mar": mth = "3"; break;
           case "Apr": mth = "4"; break;
           case "May": mth = "5"; break;
           case "Jun": mth = "6"; break;
           case "Jul": mth = "7"; break;
           case "Aug": mth = "8"; break;
           case "Sep": mth = "9"; break;
           case "Oct": mth = "10"; break;
           case "Nov": mth = "11"; break;
           case "Dec": mth = "12"; break;
           default: mth = "0";
       }
    
       String original = mth + "/" + day + "/" + parts[2];
    
       return original;
     }
    

    返回:

    "1/1/47"