Apache POI日期区域设置问题

时间:2016-06-08 15:13:04

标签: java excel apache-poi

不使用Apache POI(例如,手动生成xml以创建电子表格),您可以使用

设置css类
mso-number-format: "General Date"

mso-number-format: "Short Date"

使用Apache POI这似乎不太可能,您将被锁定使用单个定义的日期格式,该格式始终依赖于物理服务器的区域设置或您硬编码的某些值,而不是像客户端操作系统区域设置那样上方。

以下是我的代码,用户点击美国的服务器但住在其他国家/地区想要查看其所在地区的日期,这样就不太好了

    protected CellStyle getDateCellStyle(SXSSFWorkbook wb)
{
    CellStyle style = wb.createCellStyle();
    style .setDataFormat(wb.getCreationHelper().createDataFormat().getFormat("MM/dd/yyyy"));
    return style;
}

基本上我想替换" MM / dd / yyyy"与"短日期"或"一般日期"但这些选项不起作用。有人有主意吗?我不能根据服务器所在的位置获取区域设置,因为另一个国家可能会遇到它(所以我不能像其他答案那样在Java src中获取区域设置)。

之前有人处理过此事吗?

4 个答案:

答案 0 :(得分:5)

在Excel中,有一些内置数据格式没有明确的数据格式字符串。其中之一是"日期"数字格式ID为14。

此格式在Excel中的显示方式取决于Excel语言版本和Windows系统的区域设置。 en_US Excel将显示m/d/yy。 en_GB Excel将显示dd/mm/yyyy。 de_DE Excel将显示dd.mm.yyyy ...

因此,如果需要,请使用

style.setDataFormat((short)14);

有更多内置数字格式。见https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/BuiltinFormats.html。但并非所有语言都适用于所有语言的所有Excel版本。但默认的货币格式(5,6,7,8)也会起作用。

示例:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;


class BuiltInFormats {

 public static void main(String[] args) {
  try {

    Workbook wb = new XSSFWorkbook();

    CellStyle builtInShortDate = wb.createCellStyle();
    builtInShortDate.setDataFormat((short)14);
    CellStyle builtInCurrency = wb.createCellStyle();
    builtInCurrency.setDataFormat((short)8);

    Sheet sheet = wb.createSheet();

    Row row = sheet.createRow(0);
    Cell cell = row.createCell(0);
    cell.setCellValue(new java.util.Date());
    cell.setCellStyle(builtInShortDate);

    row = sheet.createRow(1);
    cell = row.createCell(0);
    cell.setCellValue(1234.56);
    cell.setCellStyle(builtInCurrency);

    FileOutputStream os = new FileOutputStream("BuiltInFormats.xlsx");
    wb.write(os);
    os.close();

  } catch (IOException ioex) {
  }
 }
}

答案 1 :(得分:1)

您可以从请求中获取用户(broswer's)Locale,而不是从服务器获取。

答案 2 :(得分:1)

如果您拥有用户区域设置,则可以使用DateFormatConverter转换为Excel格式:

final DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale)
final String pattern = DateFormatConverter.convert(locale, dateFormat);
final short excelFormat = createHelper.createDataFormat().getFormat(pattern);

编辑:处理客户端区域设置的常用方法是(AFAIK):

  • 使用javascript检测浏览器区域设置(例如,请参阅this),然后转换为等效的“java”Locale(又名艰难的方式
  • 为用户提供某种方式来选择其区域设置(小的可点击标记,首选项屏幕等,例如,请参阅this)并使用它来设置用户“java”Locale。 (如果你需要i18​​n,首选方式)

答案 3 :(得分:-1)

尝试设置区域设置

MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(this);
formatListener = new FormatTrackingHSSFListener(listener, Locale.UK);