2

POI のイベント API を使用して、メモリ フット プリントの問題なしに大量のレコードを処理しています。その参考書はこちらです。

XLSX シートを処理すると、Excel シートで指定された形式とは異なる形式の Date 値が取得されます。Excelシートの列の日付形式は「dd-mm-yyyy」ですが、「mm/dd/yy」形式で値を取得しています。

Excelシートで指定された実際のフォーマットを取得する方法を教えてもらえますか。コード スニペットのリファレンスを以下に示します。

ContentHandler handler = new XSSFSheetXMLHandler(styles, strings,
          new SheetContentsHandler() {
            public void startRow(int rowNum) {
            }
            public void endRow() {
            }
            public void cell(String cellReference, String formattedValue) {
                  System.out.println(formattedValue);
                } catch (IOException e) {
                    System.out.println(
                      "Exception during file writing");
                }
              }

日付列のセル メソッドで formmatedValue を取得するのは 'mm/dd/yy' のようなものであるため、pl/sql プログラムで適切に検証を行うことができません。

4

3 に答える 3

4

私はまったく同じ問題を抱えていました。数日間のグーグル検索と調査の後、解決策を思いつきました。残念ながら、それは良くありませんが、機能します:

  1. org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandlerプロジェクトでクラスのコピーを作成します。
  2. SheetContentsHandlerクラスでインターフェイスを見つけます。
  3. 新しいメソッド定義を追加します。String overriddenFormat(String cellRef, int formatIndex, String formatString);
  4. クラスでこのメソッドを見つけます: public void endElement(String uri, String localName, String name) throws SAXException.
  5. セルタイプの長い切り替えがあります。
  6. この場合NUMBER、次のような if ステートメントがあります。if (this.formatString != null) {...
  7. その前に、次のコードを貼り付けます。

    String overriddenFormat = output.overriddenFormat(cellRef, formatIndex, formatString);
    if (overriddenFormat != null) {
        this.formatIndex = -1;
        this.formatString = overriddenFormat;
    }
    
  8. この記事/回答に従ってください: https://stackoverflow.com/a/11345859ただし、新しいクラスとインターフェイスを使用してください。

  9. 必要に応じて、一意の日付形式を使用できるようになりました。

私のユースケースは次のとおりです。特定のシートで、G、H、および I 列に日付値があるため、私の実装SheetContentsHandler.overriddenFormatは次のとおりです。

@Override
public String overriddenFormat(String cellRef, int formatIndex, String formatString) {
    if (cellRef.matches("(G|H|I)\\d+")) { //matches all cells in G, H, and I columns
        return "yyyy-mm-dd;@"; //this is the hungarian date format in excel
    }
    return null;
}

ご覧のとおり、このendElementメソッドでは formatIndex と formatString をオーバーライドしています。formatIndex の可能な値は、 で説明されていorg.apache.poi.ss.usermodel.DateUtil.isInternalDateFormat(int format)ます。指定された値がこれらに適合しない場合 (および -1 が適合しない場合)、タイムスタンプ値をフォーマットすることで formatString が使用されます。(タイムスタンプ値は約 1900.01.01 からカウントされ、日単位の解像度があります。)

于 2013-10-14T09:03:32.540 に答える
2

Excel は、地域設定でいくつかの日付を保存します。たとえば、Excel の数値形式ダイアログでは、次のような警告が表示されます。

指定したタイプとロケール (場所) に従って、日付と時刻のシリアル番号を日付値として表示します。アスタリスク (*) で始まる日付形式は、コントロール パネルで指定された地域の日付と時刻の設定の変更に対応します。アスタリスクのない形式は、コントロール パネルの設定の影響を受けません。

あなたが読んでいるExcelファイルは、それらの*日付の1つを使用している可能性があります. その場合、POI はおそらく米国のデフォルト値を使用します。

日付形式文字列を必要な形式にマップするために、回避策のコードを追加する必要がある場合があります。

Excel での地域の日付設定については、以下も参照してください。

于 2013-06-26T11:24:28.273 に答える