不使用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中获取区域设置)。
之前有人处理过此事吗?
答案 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):
答案 3 :(得分:-1)
尝试设置区域设置
MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(this);
formatListener = new FormatTrackingHSSFListener(listener, Locale.UK);