当月份从零开始时,Excel将数字格式更改为date。这是否是一个非常棒的错误?

我的date格式为04/08/2014(dd / mm / yyy)。 我复制了string,并把它放在Excel中,它将它变成04-08-2014。 对于“mm”不以0开头的其他date,例如,如果我复制12/11/2013并将其放在Excel中,它通常会粘贴为12/13/2014。

其实我试图生成与Java代码下面附加的Excel

public void exportExcel(){ FacesContext fc = FacesContext.getCurrentInstance(); ExternalContext ec = fc.getExternalContext(); String filename = "ExcelList.csv"; try{ ec.responseReset(); ec.setResponseContentType("text/csv"); ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); Writer writer = ec.getResponseOutputWriter(); if(PageList != null && PageList.size() > 0){ writer.append(toCsvField("Name")).append(',') .append(toCsvField("Code")).append(',') .append(toCsvField("Description")).append(',') .append('\n'); for (PageBean View : PageList) { writer.append(toCsvField(View.Name)).append(',') .append(toCsvField(View.Number)).append(',') .append(toCsvField(View.Description)).append(','); } } fc.responseComplete(); }catch(Exception e){ } } public static String toCsvField(Object value) { if (value == null) { return ""; } String field = String.valueOf(value).replace("\"", "\"\""); if (field.indexOf(',') > -1 || field.indexOf('"') > -1) { field = '"' + field + '"'; } return field; } 

月份什么错误的领域从0开始。请帮助。

尝试下面的代码使用Apache poi框架这应该有所帮助。

 public void exportExcel(){ FacesContext fc = FacesContext.getCurrentInstance(); ExternalContext ec = fc.getExternalContext(); String filename = "ExportList.xlsx"; XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet("Export Data"); int rownum = 0; Row headRow = sheet.createRow(rownum++); Cell cell1 = headRow.createCell(0); Cell cell2 = headRow.createCell(1); Cell cell3 = headRow.createCell(2); Cell cell4 = headRow.createCell(3); cell1.setCellValue("Name"); cell2.setCellValue("Age"); cell3.setCellValue("Sex"); for(Bean view : list){ int cellnum = 0; Row row = sheet.createRow(rownum++); row.createCell(cellnum++).setCellValue(view.name); row.createCell(cellnum++).setCellValue(view.age); row.createCell(cellnum++).setCellValue(view.sex); } try{ ec.responseReset(); ec.setResponseContentType("text/xlsx"); ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); //to align column vertically sheet.autoSizeColumn(0); sheet.autoSizeColumn(1); sheet.autoSizeColumn(3); workbook.write(ec.getResponseOutputStream()); fc.responseComplete(); } catch (Exception e){ e.printStackTrace(); } } 

遵循的步骤:

  • 获取设置为浏览器语言的客户端的语言环境
  • 根据客户机区域设置格式化数据
  • 用csv写格式化的数据

注意: csv文件必须在下载系统的相同语言环境中打开。

如果csv是以German语言环境下载的(从浏览器读取),并且您正打算用French语言环境打开它(从系统区域和语言设置中读取),那么它将与Excel中的数据不匹配/损坏。

  import java.text.DateFormat; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.Date; import java.util.Locale; // 04/08/2014(dd/mm/yyy) Calendar cal = Calendar.getInstance(); cal.set(2014, 7, 4, 0, 0, 0); double no = 123456.7890; Date date = cal.getTime(); System.out.println(date); for (Locale locale : Locale.getAvailableLocales()) { NumberFormat numberFormat = DecimalFormat.getNumberInstance(locale); DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, locale); System.out.println("========================================"); System.out.println(locale.getDisplayCountry() + " - " + locale.toString()); System.out.println(numberFormat.format(no)); System.out.println(dateFormat.format(date)); } 

Portugal产量是04-08-2014

  • 这意味着如果您的系统的区域和语言设置是为Portugal设置的,并且您尝试将04/08/2014 (dd / mm / yyy)粘贴到excel中,则会自动转换为04-08-2014

  • 添加sep=; 在csv的第一行,以便excel可以读取它以将列拆分成单元格,因为默认情况下,逗号(,)用作分隔符,但是在逗号用作数字中的分组分隔符或小数点分隔符的几个语言环境中会产生问题。

您的CSV在Portugal区域看起来像这样:

  sep=; "Name";"Number";"DOB" "A";"123.456,789";"04-08-2014" "B";"123.456,789";"12-11-2013" 

阅读客户端语言环境的链接:

  • 在JSF中 – 获取客户端的语言环境(在浏览器的时区显示时间)
  • 如何检测JSF应用程序中的客户端区域设置?