Java Apache POI日期区域设置问题

Java Apache POI日期区域设置问题,java,excel,apache-poi,Java,Excel,Apache Poi,不使用ApachePOI(例如,手动生成xml以创建电子表格),您可以使用 mso-number-format: "General Date" 或 使用ApachePOI这似乎是不可能的,您被锁定为使用单一定义的日期格式,该格式始终依赖于物理服务器的区域设置或您硬编码的某些值,而不是像上面那样依赖于客户端操作系统的区域设置 这是我现在的代码,在美国访问服务器但生活在另一个国家的用户希望看到他们所在地区的日期,所以这不好 protected CellStyle getDateCellSt

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

mso-number-format: "General Date"

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

这是我现在的代码,在美国访问服务器但生活在另一个国家的用户希望看到他们所在地区的日期,所以这不好

    protected CellStyle getDateCellStyle(SXSSFWorkbook wb)
{
    CellStyle style = wb.createCellStyle();
    style .setDataFormat(wb.getCreationHelper().createDataFormat().getFormat("MM/dd/yyyy"));
    return style;
}
基本上,我想用“短日期”或“一般日期”替换“MM/dd/yyyy”,但这些选项不起作用。有人有什么想法吗?我不能仅仅根据服务器所在的位置获取区域设置,因为另一个国家可能正在访问它(因此我不能像其他答案所建议的那样在JavaSRC中获取区域设置)


以前有人处理过这个问题吗?

您可以从请求中获取用户(broswer)区域设置,而不是从服务器获取该区域设置。

您可以从请求中获取用户(broswer)区域设置,而不是从服务器获取该区域设置。

拥有用户区域设置后,您可以使用以下命令将其转换为Excel格式:


编辑:处理客户端语言环境的常用方法是(AFAIK):

  • 使用javascript检测浏览器区域设置(参见示例),然后将其转换为等效的“java”
    locale
    (也称为“硬方法”)
  • 为用户提供一些选择其区域设置的方法(小的可单击标志、首选项屏幕等,请参见示例),并使用这些方法设置用户“java”
    locale
    。(如果您需要i18n,请选择首选方式)

当您拥有用户区域设置时,可以使用以下命令将其转换为Excel格式:


编辑:处理客户端语言环境的常用方法是(AFAIK):

  • 使用javascript检测浏览器区域设置(参见示例),然后将其转换为等效的“java”
    locale
    (也称为“硬方法”)
  • 为用户提供一些选择其区域设置的方法(小的可单击标志、首选项屏幕等,请参见示例),并使用这些方法设置用户“java”
    locale
    。(如果您需要i18n,请选择首选方式)

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

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

因此,如果需要,那么使用

style.setDataFormat((short)14);
还有更多内置的数字格式。看见但并非所有的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) {
  }
 }
}

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

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

因此,如果需要,那么使用

style.setDataFormat((short)14);
还有更多内置的数字格式。看见但并非所有的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) {
  }
 }
}
尝试设置区域设置

MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(this);
formatListener = new FormatTrackingHSSFListener(listener, Locale.UK);
尝试设置区域设置

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

Java语言环境所期望的和浏览器提供的navigator.language不匹配。例如en US vs en_US,因此必须绘制差异图并进行检查。这看起来像是一团糟,您以前做过吗?Java语言环境的期望值和浏览器提供的navigator.language不匹配。例如en US vs en_US,因此必须绘制差异图并进行检查。这看起来像是一团糟,你以前做过吗?获取区域设置或使poi使用客户端操作系统区域设置是困难的部分,一旦实现了,你可以这样做或类似的事情,这在其他地方已经有很多记录,谢谢…问题是你的问题更多地是关于poi和Excel的,因此我的答案。将编辑我的答案这并不能解决问题,因为它依赖于操作系统设置,无论如何,我认为这是问题的措辞,谢谢。获取区域设置或使poi使用客户端操作系统区域设置是困难的部分,一旦实现了,你可以这样做或其他地方已经有很多文档记录的类似操作,谢谢,问题是你的问题更多的是关于POI和Excel,所以我的答案是。将编辑我的答案这并没有解决让它回到操作系统设置的问题,无论如何,我认为这是问题的措辞,谢谢.style.setDataFormat((短)14);这是我必须做的。否则这就是我一直在寻找的魔法。谢谢大家!@不确定:不客气。直到现在才能测试。当然,铸造短型是必要的。style.setDataFormat((short)14);这是我必须做的。否则这就是我一直在寻找的魔法。谢谢大家!@不确定:不客气。直到现在才能测试。当然,铸造短铸件是必要的。