Bagaimana cara mengatur nilai sel ke Tanggal dan menerapkan format tanggal default Excel?

101

Saya telah menggunakan Apache POI selama beberapa waktu untuk membaca file Excel 2003 yang ada secara terprogram. Sekarang saya memiliki persyaratan baru untuk membuat seluruh file .xls di dalam memori (masih menggunakan Apache POI) dan kemudian menulisnya ke file di akhir. Satu-satunya masalah yang menghalangi saya adalah penanganan sel dengan kurma.

Perhatikan kode berikut:

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

Ketika saya menulis buku kerja yang berisi sel ini ke sebuah file dan membukanya dengan Excel, sel tersebut ditampilkan sebagai angka. Ya, saya menyadari bahwa Excel menyimpan 'tanggal' sebagai jumlah hari sejak 1 Januari 1900 dan itulah yang diwakili oleh angka dalam sel.

PERTANYAAN: Panggilan API apa yang dapat saya gunakan dalam POI untuk memberitahukan bahwa saya ingin format tanggal default diterapkan ke sel tanggal saya?

Idealnya saya ingin sel spreadsheet ditampilkan dengan format tanggal default yang sama dengan yang ditetapkan Excel jika pengguna membuka spreadsheet secara manual di Excel dan mengetik dalam nilai sel yang dikenali Excel sebagai tanggal.

Jim Tough
sumber

Jawaban:

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);
ninja
sumber
21
Terima kasih ninja, ini berhasil untukku. Satu komentar untuk orang lain yang perlu melakukan ini. Ada kelas POI bernama BuiltinFormatsyang mencantumkan semua format standar (bukan hanya format tanggal) yang diketahui Excel. Saya tetap menggunakan salah satu parameter tersebut untuk digunakan sebagai parameter saya pada getFormat()metode yang ditunjukkan pada cuplikan di atas.
Jim Tough
Bagian penting ada di komentar tautan: kami memberi gaya sel kedua sebagai tanggal (dan waktu). Penting untuk membuat gaya sel baru dari buku kerja, jika tidak, Anda bisa mengubah gaya bawaan dan tidak hanya memengaruhi sel ini tetapi juga sel lainnya.
CGK
Terima kasih, @ninja. Tahukah Anda mengapa getCreationHelper()dibutuhkan? Saya bekerja dengan Mule sekarang untuk menghasilkan file keluaran Excel dan saya sebenarnya dapat menggunakan createDataFormat()tanpa bantuan kreasi dan menghasilkan file Excel dalam pengujian saya. Apakah ada kerugian jika tidak menggunakannya? Terima kasih!
Rashiki
@Rashiki Jawaban ini diposting 6 tahun yang lalu. Saya kira API Apache POI telah berubah selama ini. Jawaban saya untuk pertanyaan Anda adalah 'Tidak, tidak ada kerugian (jika berfungsi seperti yang diharapkan)'
ninja
Saya tidak melihat format apa pun untuk mm/dd/yyyy. Ketika saya menggunakan format lain, excel menampilkan kesalahan File error, some number formats may have been lost, itu memang Datetipe tampilan di excel. Saya tidak tahu bagaimana ini bisa diperbaiki.
akash
24

Untuk menyetel ke default jenis Excel Tanggal (default ke lokal tingkat OS / -> yaitu xlsx akan terlihat berbeda ketika dibuka oleh orang Jerman atau Inggris / dan ditandai dengan tanda bintang jika Anda memilihnya di pemilih format sel Excel) Anda harus:

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

Saya melakukannya dengan xlsx dan berhasil dengan baik.

BlondCode
sumber
2
Sangat setuju dengan komentar fiffy. Saya hanya punya satu pertanyaan. Apa pendekatan terbaik. Andalkan nilai pendek dataFormat (14) atau nilai string ("m / d / yy"). Manakah yang merupakan nilai konstan yang menggambarkan format tanggal standar di Excel? DataFormat.getFormat () memiliki parameter dengan string dan nilai pendek.
Miklos Krivan
Miklos, saya tidak tahu bagaimana cara kerja solusi nilai string. Saya akan senang jika seseorang dapat memberikan umpan balik apakah itu juga menampilkan "format tanggal default berbeda berdasarkan bahasa" di Excel dengan bahasa berbeda juga.
BlondCode
13

Contoh ini untuk bekerja dengan jenis file .xlsx. Contoh ini berasal dari halaman .jsp yang digunakan untuk membuat spreadsheet .xslx.

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);
Tuan Port St Joe
sumber
1

Saya menulis jawaban saya di sini karena mungkin bermanfaat bagi pembaca lain, yang mungkin memiliki persyaratan yang sedikit berbeda dari penanya di sini.

Saya menyiapkan template .xlsx; semua sel yang akan diisi tanggal, sudah diformat sebagai sel tanggal (menggunakan Excel).

Saya membuka template .xlsx menggunakan Apache POI dan kemudian hanya menulis tanggal ke sel, dan berhasil.

Dalam contoh di bawah ini, sel A1 sudah diformat dari dalam Excel dengan format tersebut [$-409]mmm yyyy, dan kode Java hanya digunakan untuk mengisi sel.

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

Saat Excel dibuka, tanggal diformat dengan benar.

gordon613
sumber
0

Contoh kode ini dapat digunakan untuk mengubah format tanggal. Di sini saya ingin mengubah dari tttt-BB-hh ke hh-BB-tttt. Berikut posadalah posisi kolom.

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();
}}
Gaurav Khare
sumber
0

Untuk mengetahui format string yang digunakan oleh Excel tanpa harus menebaknya: buat file excel, tulis tanggal di sel A1 dan format sesuai keinginan. Kemudian jalankan baris berikut:

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

Kemudian salin-tempel string yang dihasilkan, hapus garis miring terbalik (misalnya d/m/yy\ h\.mm;@menjadi d/m/yy h.mm;@) dan gunakan di http://poi.apache.org/spreadsheet/quick-guide.html#CreateDateCells kode:

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