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

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

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

Cell Cell=row.getCell(cellColumn,MissingCellPolicy.CREATE\u NULL\u AS\u BLANK);
字符串值=dataFormatter.formatCellValue(单元格)

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

Cell Cell=row.getCell(cellColumn,MissingCellPolicy.CREATE\u NULL\u AS\u BLANK);
cell.setCellType(CellType.STRING);
字符串值=cell.getStringCellValue()


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

(跟进评论)

基于此代码,您包括:

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”


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

我记得我也试过

Cell cell = ...
int format = cell.getCellStyle().getDataFormat();
String formatPattern = cell.getCellStyle().getDataFormatString(); // ddmm
现在,
formattern
可能有助于将其转换为java日期格式化程序。 (
格式
代码对一些标准值(API中有常量)和自定义值进行编号。) 当时我没有这样做,因为解决办法并不令人满意


也许你会更成功,所以我提到了这一点。

使用
java.util.Date
获取一个
Date
格式,然后根据需要进行格式化?如果你通过上面的第二段代码获取字符串值
“01-Jan-47”
,为什么不编写一个函数将其按
-
拆分,并执行一些字符串操纵以返回原始值呢?“它肯定存储在Excel工作簿中,因为它在单击单元格时显示。”:不,它肯定没有存储。存储的是数字日期值和日期格式。在编辑模式下,您在单元格或编辑器栏中看到的是操作系统默认短日期格式中该数字日期值的表示形式。我的德语Excel将显示
01.01.1947
。阿克塞尔·里克特,谢谢你,我不知道。这改变了我的想法。