Как преобразовать несколько форматов даты в один стандартный формат в Excel, используя Java POI - PullRequest
0 голосов
/ 27 апреля 2018

Ожидаемый файл вывода FOrmat введите описание изображения здесь Файл выходного файла ввода (ожидается)

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, в котором есть столбец с датами в нескольких форматах, как показано выше. Первые несколько строк имеют тип ячейки как «Общие», а последние несколько строк имеют тип ячейки Дата. Я попытался использовать приведенный ниже код, но в любой момент конвертируется, и я хочу, чтобы все строки были конвертированы в один формат.

    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 голосов
/ 27 апреля 2018

Похоже, что все даты, которые вы нам показали, вписываются в формат ДД / ММ / ГГГГ, распространенный в Европе и, возможно, в других регионах. Но когда вы вручную вводите значение в Excel, он использует параметры локальной системы для определения даты. Похоже, что ваш локальный формат даты - 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 и не иметь дело со странными преобразованиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...