2016-06-08 73 views
0

沒有使用Apache POI(例如,您手動生成XML創建電子表格),你可以設置一個CSS類的Apache POI日期語言環境問題

mso-number-format: "General Date" 

mso-number-format: "Short Date" 

使用Apache POI這似乎不可能,你被鎖定在使用一個單一的定義日期格式,該格式總是依賴於物理服務器的區域設置或硬編碼的一些值,而不是像上面那樣在客戶端OS區域設置。

這裏是我的代碼現在,用戶擊中美國的一個服務器,但住在另一個國家希望看到在其語言環境的日期,所以這是不好

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中獲取語言環境)。

以前有人處理過這個嗎?

回答

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) { 
    } 
} 
} 
+0

style.setDataFormat((short)14);是我必須做的。否則,這是我正在尋找的魔術。謝謝! –

+0

@不確定: 不客氣。目前無法測試。當然需要投短。 –

1

可以獲取用戶(broswer的)從請求語言環境,而不是從服務器得到它。

+0

了Java語言環境有什麼期望,並從瀏覽器什麼navigator.language爲您提供了不匹配。例如,en-US vs en_US,因此必須映射差異並對其進行檢查。這看起來很亂,你以前做過嗎? –

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); 

編輯:通常的方式來處理與客戶的語言環境是(據我所知):

  • 使用javascript檢測瀏覽器語言環境(例如參見this)然後翻譯成等效的「java」Locale(又名艱難的方式
  • 爲用戶提供了一些方法供用戶選擇其語言環境(小可點擊標誌,首選項屏幕等,例如,參見this),並使用它設置用戶「java」Locale。 (首選的方式,如果你需要國際化)
+0

獲取語言環境或使poi使用客戶端OS語言環境設置是困難的一部分,一旦你已經完成了這個或其他類似的東西,其他地方已經有很多文檔,謝謝... –

+0

問題是你的問題更多談論POI和Excel,因此我的答案。將編輯我的回答 – 2016-06-09 05:32:47

+0

這並沒有解決讓它回退到操作系統設置的問題,無論如何,我認爲這是問題措辭的方式,謝謝。 –

-1

嘗試設置區域

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