web-dev-qa-db-ja.com

POI-セル値を日付に設定し、デフォルトのExcel日付形式を適用する方法

既存のExcel 2003ファイルをプログラムで読み取るために、しばらくの間、Apache POIを使用しています。現在、メモリ内に.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が割り当てたのと同じデフォルトの日付形式でスプレッドシートセルを表示したいです。

91
Jim Tough

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

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

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

私はxlsxでそれをやった、それはうまくいった。

22
BlondCode

この例は、.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);
11
Mr. Port St Joe

ここで質問をする人とは少し異なる要件があるかもしれない他の読者に役立つかもしれないので、私はここに私の答えを書いています。

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

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

以下の例では、セルA1は既に[$-409]mmm yyyyという形式でExcel内からフォーマットされており、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を開くと、日付は正しくフォーマットされます。

1
gordon613

このコードサンプルを使用して、日付形式を変更できます。ここで、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
Gaurav Khare

推測せずに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);
0
Luke