2

POI を使用して日付を書き出すと、Excel にも時刻が表示されます。(表示されている時間は、セルが書き込まれたときのマシン上の時間です)。これは私が使用したコードです

XSSFCellStyle dateStyle = wb.createCellStyle();
CreationHelper createHelper = wb.getCreationHelper();
dateStyle.setDataFormat(createHelper.createDataFormat().getFormat("dd-mmm-yyyy"));
Calendar cal = Calendar.getInstance();
cal.set(xx.getYear(), xx.getMonthOfYear(), xx.getDayOfMonth());
cell.setCellStyle(dateStyle);
cell.setCellValue(cal);

セルの日付は正しい、つまり 2013 年 12 月 12 日ですが、そのセルの数式バーには時間も表示されます。したがって、セルには 12-Dec-2013 が表示され、数式バーには 12-Dec-2013 7:14:39AM が表示されます。Excelでセルの形式を確認したところ、カスタムのdd-mm-yyyyとして表示されます。これは私が期待するものです。セル自体には 12-12-2012 が表示されますが、数式バーのセルには時間も表示されます。また、カレンダーを日付に置き換えました-同じ問題。

追加情報: Excel で列の形式を「一般」に変更しました - POI によって追加されたセルの場合、値は 41319.3769490278 のような xxx.xxx であることがわかりますが、日付を手で入力すると、値が41319 のように見えます。小数点以下の数字が原因で時間が表示されているようです。POIを使用して書き出すときにこれを回避する方法がわからない

4

2 に答える 2

7

わかりました。同じ問題に遭遇した他の人のためにこれを公開します。POI ソース コードを調べたところ、カレンダーから double が計算され、セル値がそれに設定されていることがわかりました。コメントから、小数点以下の数字が時間を表すことは明らかです。したがって、コードで行ったのは、その double を切り捨てることだけです。変更された行は、以下のコード スニペットでコメント化されています。

XSSFCellStyle dateStyle = wb.createCellStyle();
CreationHelper createHelper = wb.getCreationHelper();
dateStyle.setDataFormat(createHelper.createDataFormat().getFormat("dd-mmm-yyyy"));
Calendar cal = Calendar.getInstance();
cal.set(xx.getYear(), xx.getMonthOfYear(), xx.getDayOfMonth());
cell.setCellStyle(dateStyle);
double d = DateUtil.getExcelDate(cal, false); //get double value f
cell.setCellValue((int)d);  //get int value of the double
于 2013-02-22T00:38:23.007 に答える
2

日付を取得している Calendar インスタンスを完全にクリアしていないため、時間が経過しています

時間値もゼロに設定する必要があるため、コードは次のようになります。

Calendar cal = Calendar.getInstance();
cal.set(xx.getYear(), xx.getMonthOfYear(), xx.getDayOfMonth());
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
于 2013-02-21T10:00:42.933 に答える