如何使用Java POI将多个日期格式转换为Excel中的一种标准格式

时间:2018-04-27 04:42:59

标签: java excel date apache-poi date-formatting

Expected OutputFile FOrmat enter image description here输入文件输出文件(预期)

JoiningDate                JoiningDate             
1/4/2017                    4/1/2017                   
2/4/2017                    4/2/107
...                         ...
...                         ...
13/04/2017                  4/13/2017
14/04/2017                  4/14/2017

我有一个输入excel文件,其中有一个列具有多种格式的日期,如上所示,前几行的单元格类型为" General"最后几行是Date celltype。我尝试使用下面的代码但是一次任何一个转换我希望所有行都转换为单一格式。

    import java.io.File;
        import java.io.FileInputStream;
        import java.io.FileNotFoundException;
        import java.io.FileOutputStream;
        import java.io.IOException;
        import java.io.OutputStream;
        import java.util.Iterator;
        import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
        import org.apache.poi.openxml4j.opc.OPCPackage;
        import org.apache.poi.ss.usermodel.Cell;
        import org.apache.poi.ss.usermodel.CellStyle;
        import org.apache.poi.ss.usermodel.CreationHelper;
        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.ss.usermodel.WorkbookFactory;
        import org.apache.poi.xssf.usermodel.XSSFCellStyle;
        import org.apache.poi.xssf.usermodel.XSSFCreationHelper;
        import org.apache.poi.xssf.usermodel.XSSFRow;
        import org.apache.poi.xssf.usermodel.XSSFSheet;
        import org.apache.poi.xssf.usermodel.XSSFWorkbook;


      class DateFormatDemo1{ 
        public static void main( String[] args ) throws IOException, InvalidFormatException, ParseException
        {
            OPCPackage pkg = OPCPackage.open(new File("C:\\DateFormatIssue\\SourceFile\\S.xlsx"));
            XSSFWorkbook wb = new XSSFWorkbook(pkg); 
            XSSFCreationHelper createHelper = wb.getCreationHelper();

            XSSFSheet sheet = wb.getSheetAt(0);      // Create spreadsheet in workbook
            Iterator<Row> iterator = sheet.iterator();
            Cell cell = null;
            Row row=null;
            row=iterator.next();
            int pos=11;
            while(iterator.hasNext())
            {
                row=iterator.next();

                cell= row.getCell(pos-1);


                XSSFCellStyle cellStyle = (XSSFCellStyle)cell.getCellStyle();
                cellStyle.setDataFormat( createHelper.createDataFormat().getFormat("M/dd/yyyy")); // set the format of the date  
                SimpleDateFormat sdf = new SimpleDateFormat("d/M/yyyy");     
XSSFCellStyle cellStyle2 = (XSSFCellStyle)cell.getCellStyle();
            cellStyle.setDataFormat( createHelper.createDataFormat().getFormat("d/M/yyyy"));      
                Date d=null;


                /** below if block converts lower rows, dates which are in format d/M/yyyy (15/04/2017) to M/d/yyyy (4/15/2017)**/
                if (cell.getCellType() == Cell.CELL_TYPE_STRING)
                {    

                    d= sdf.parse(cell.getStringCellValue());
                    cell.setCellValue(d);
                    cell.setCellStyle(cellStyle);       

                }


                else  if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC)
                {
                   Below code enable if want to convert upper rows i.e. 1/4/2017 to 4/1/2017 **/
                    /* 
                      if (DateUtil.isCellDateFormatted(cell)) {
                        System.out.print(cell.getDateCellValue()); 
                        cell.setCellValue(cell.getDateCellValue()); 
                        cell.setCellStyle(cellStyle2);
                    }
                    else
                    {
                        cell.setCellValue(cell.getNumericCellValue()); 
                    }
    */

                }
            }




            FileOutputStream outFile =new FileOutputStream(new File("C:\\DateFormatIssue\\OutputFile\\output.xlsx"));
            wb.write(outFile);
            wb.close();
            outFile.close();
            pkg.close();




        }}

1 个答案:

答案 0 :(得分:0)

看起来您展示给我们的所有日期都符合DD / MM / YYYY格式,这在欧洲和其他地区很常见。但是,当您在Excel中手动输入值时,它会使用本地系统设置来检测日期。您的本地日期格式似乎是MM / DD / YYYY,这是美国使用的格式。不幸的是,一些DD / MM / YYYY日期将以MM / DD / YYYY格式“正确”解析,但会给出错误的日期,而未正确解析的日期将被视为字符串。这似乎就是你所看到的。

for USA
Date entered     Excel Type     Display             Text
------------     ----------     ---------------     ----------------
1/4/2018         Date                  1/4/2018     January 4, 2018
2/4/2018         Date                  2/4/2018     February 4, 2018
15/4/2018        General        15/4/2018           Unknown

for Europe
Date entered     Excel Type     Display             Text
------------     ----------     ---------------     ---------------
1/4/2018         Date                  1/4/2018     April 1, 2018
2/4/2018         Date                  2/4/2018     April 2, 2018
15/4/2018        Date                 15/4/2018     April 15, 2018

在我看来,你给我的所有日​​期都适合DMY,没有人会在没有告诉你哪个是MDY的情况下实际混合这两个是没有意义的,哪些是DMY因为没有办法告诉除了那个某些日期不适用于其他格式(日期> 12的日期)。

因此将它们全部视为DMY,并在创建电子表格时使用Text to Columns,并告诉向导该列包含DMY格式的日期。这应该为整个列提供正确的日期值。请注意,D和M值将切换列中所有日期的位置。现在您可以使用POI处理它,而不必处理奇怪的转换。