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();
}}
答案 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处理它,而不必处理奇怪的转换。