セルの値を日付に設定し、デフォルトのExcel日付形式を適用するにはどうすればよいですか?


101

私は、Apache POIを使用して、既存のExcel 2003ファイルをプログラムで読み取りました。.xlsファイル全体をメモリ内に作成し(引き続きApache POIを使用)、次に最後にファイルに書き込むという新しい要件があります。私の邪魔になる唯一の問題は、日付を含むセルの処理です。

次のコードを検討してください。

Date myDate = new Date();
HSSFCell myCell;
// code that assigns a cell from an HSSFSheet to 'myCell' would go here...
myCell.setCellValue(myDate);

このセルを含むワークブックをファイルに書き出し、Excelで開くと、セルが数値として表示されます。はい、私はExcelがその「日付」を1900年1月1日からの日数として保存し、それがセル内の数値が表すものであることを理解しています。

質問:POIでどのAPI呼び出しを使用して、日付セルにデフォルトの日付形式を適用したいかを伝えることができますか?

理想的には、ユーザーが手動でExcelでスプレッドシートを開き、Excelが日付として認識したセル値を入力した場合に、Excelが割り当てたのと同じデフォルトの日付形式でスプレッドシートのセルを表示したいです。

回答:


172

http://poi.apache.org/spreadsheet/quick-guide.html#CreateDateCells

CellStyle cellStyle = wb.createCellStyle();
CreationHelper createHelper = wb.getCreationHelper();
cellStyle.setDataFormat(
    createHelper.createDataFormat().getFormat("m/d/yy h:mm"));
cell = row.createCell(1);
cell.setCellValue(new Date());
cell.setCellStyle(cellStyle);

21
忍者に感謝します。これは私にとってはうまくいきます。これを行う必要がある他の人への1つのコメント。BuiltinFormatsExcelが認識しているすべての標準形式(日付形式だけでなく)をリストした名前のPOIクラスがあります。getFormat()上記のスニペットに示されているメソッドのパラメーターとして使用するものの1つを使用しています。
ジム・タフ

重要な部分はリンクのコメントにあります。2番目のセルを日付(および時刻)としてスタイルします。ブックから新しいセルスタイルを作成することが重要です。そうしないと、組み込みスタイルを変更して、このセルだけでなく他のセルにも影響を与える可能性があります。
CGK 2013

ありがとう、@ ninja。なぜgetCreationHelper()必要なのか知っていますか?私は現在Muleを使用してExcel出力ファイルを生成しています。実際にはcreateDataFormat()、作成ヘルパーなしでを使用して、テストでExcelファイルを生成できました。それを使用しないことの欠点はありますか?ありがとう!
ラシキ2017年

@Rashikiこの回答は6年前に投稿されました。この間にApache POIのAPIが変更されたと思います。あなたの質問に対する私の答えは、「いいえ、マイナス面はありません(期待どおりに機能する場合)」
忍者

の形式が表示されませんmm/dd/yyyy。他の形式を使用すると、ExcelでエラーFile error, some number formats may have been lostが表示さDateれ、Excelでタイプが表示されます。これをどのように修正できるのか私にはわかりません。
akash

24

デフォルトのExcelタイプを日付に設定するには(デフォルトではOSレベルのロケールに設定されます/->つまり、ドイツ語またはイギリス人が開いたときにxlsxは異なって見え、Excelのセル形式の選択でそれを選択するとアスタリスクのフラグが付きます):

    CellStyle cellStyle = xssfWorkbook.createCellStyle();
    cellStyle.setDataFormat((short)14);
    cell.setCellStyle(cellStyle);

私はxlsxでそれをしました、そしてそれはうまくいきました。


2
fiffyのコメントに完全に同意しました。質問が1つだけあります。最善のアプローチは何ですか。dataFormat short値(14)または文字列値( "m / d / yy")に依存します。Excelの標準の日付形式を説明する定数値はどれですか?DataFormat.getFormat()には、文字列と短い値の両方がパラメーターとして含まれています。
ミクロスクリヴァン

ミクロス、文字列値ソリューションがどのように機能するのかわかりません。異なる言語のExcelでも「言語ベースの異なるデフォルトの日付形式」も表示されているかどうか誰かがフィードバックできたらうれしいです。
BlondCode

13

この例は、.xlsxファイルタイプを操作するためのものです。この例は、.xslxスプレッドシートの作成に使用される.jspページからのものです。

import org.apache.poi.xssf.usermodel.*; //import needed

XSSFWorkbook  wb = new XSSFWorkbook ();  // Create workbook
XSSFSheet sheet = wb.createSheet();      // Create spreadsheet in workbook
XSSFRow row = sheet.createRow(rowIndex); // Create the row in the spreadsheet


//1. Create the date cell style
XSSFCreationHelper createHelper = wb.getCreationHelper();
XSSFCellStyle cellStyle         = wb.createCellStyle();
cellStyle.setDataFormat(
createHelper.createDataFormat().getFormat("MMMM dd, yyyy")); 

//2. Apply the Date cell style to a cell

//This example sets the first cell in the row using the date cell style
cell = row.createCell(0);
cell.setCellValue(new Date());
cell.setCellStyle(cellStyle);

1

ここで私の質問の回答とは少し異なる要件を持つ他の読者に役立つ可能性があるため、ここに私の回答を書いています。

.xlsxテンプレートを準備します。日付が入力されるすべてのセルは、すでにExcelを使用して日付セルとしてフォーマットされています。

Apache POIを使用して.xlsxテンプレートを開き、日付をセルに書き込むだけで機能します。

以下の例では、セルA1はExcel内からの形式[$-409]mmm yyyyで既にフォーマットされており、Javaコードはセルへの入力にのみ使用されます。

FileInputStream inputStream = new FileInputStream(new File("Path to .xlsx template"));
Workbook wb = new XSSFWorkbook(inputStream);
Date date1=new Date();
Sheet xlsMainTable = (Sheet) wb.getSheetAt(0);
Row myRow= CellUtil.getRow(0, xlsMainTable);
CellUtil.getCell(myRow, 0).setCellValue(date1);

Excelが開かれると、日付の形式が正しくなります。


0

このコードサンプルを使用して、日付形式を変更できます。ここで、yyyy-MM-ddからdd-MM-yyyyに変更したいと思います。こちらposがコラムの位置です。

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

class Test{ 
public static void main( String[] args )
{
String input="D:\\somefolder\\somefile.xlsx";
String output="D:\\somefolder\\someoutfile.xlsx"
FileInputStream file = new FileInputStream(new File(input));
XSSFWorkbook workbook = new XSSFWorkbook(file);
XSSFSheet sheet = workbook.getSheetAt(0);
Iterator<Row> iterator = sheet.iterator();
Cell cell = null;
Row row=null;
row=iterator.next();
int pos=5; // 5th column is date.
while(iterator.hasNext())
{
    row=iterator.next();

    cell=row.getCell(pos-1);
    //CellStyle cellStyle = wb.createCellStyle();
    XSSFCellStyle cellStyle = (XSSFCellStyle)cell.getCellStyle();
    CreationHelper createHelper = wb.getCreationHelper();
    cellStyle.setDataFormat(
        createHelper.createDataFormat().getFormat("dd-MM-yyyy"));
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Date d=null;
    try {
        d= sdf.parse(cell.getStringCellValue());
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        d=null;
        e.printStackTrace();
        continue;
    }
    cell.setCellValue(d);
    cell.setCellStyle(cellStyle);
   }

file.close();
FileOutputStream outFile =new FileOutputStream(new File(output));
workbook.write(outFile);
workbook.close();
outFile.close();
}}

0

Excelが使用するフォーマット文字列を推測することなく知るには、Excelファイルを作成し、セルA1に日付を書き込んで、必要に応じてフォーマットします。次に、次の行を実行します。

FileInputStream fileIn = new FileInputStream("test.xlsx");
Workbook workbook = WorkbookFactory.create(fileIn);
CellStyle cellStyle = workbook.getSheetAt(0).getRow(0).getCell(0).getCellStyle();
String styleString = cellStyle.getDataFormatString();
System.out.println(styleString);

次に、結果の文字列をコピーして貼り付け、バックスラッシュを削除して(たとえば、にd/m/yy\ h\.mm;@なるd/m/yy h.mm;@)、http//poi.apache.org/spreadsheet/quick-guide.html#CreateDateCellsコードで使用します。

CellStyle cellStyle = wb.createCellStyle();
CreationHelper createHelper = wb.getCreationHelper();
cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("d/m/yy h.mm;@"));
cell = row.createCell(1);
cell.setCellValue(new Date());
cell.setCellStyle(cellStyle);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.