Hücre değerini Tarih olarak nasıl ayarlayabilirim ve varsayılan Excel tarih biçimini nasıl uygularım?


102

Varolan Excel 2003 dosyalarını programlı olarak okumak için bir süredir Apache POI'sini kullanıyorum. Şimdi tüm .xls dosyalarını bellek içinde (hala Apache POI kullanarak) oluşturmak ve ardından bunları bir dosyaya yazmak için yeni bir gereksinimim var. Yolumdaki tek sorun, tarihlerin bulunduğu hücrelerin işlenmesi.

Aşağıdaki kodu göz önünde bulundurun:

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

Bu hücreyi içeren çalışma kitabını bir dosyaya yazdığımda ve Excel ile açtığımda, hücre bir sayı olarak görüntüleniyor. Evet, Excel'in 'tarihlerini' 1 Ocak 1900'den bu yana geçen gün sayısı olarak sakladığının farkındayım ve hücredeki sayı bunu temsil ediyor.

SORU: Tarih hücreme varsayılan bir tarih biçiminin uygulanmasını istediğimi söylemek için İÇN'de hangi API çağrılarını kullanabilirim?

İdeal olarak, elektronik tablo hücresinin, bir kullanıcı elektronik tabloyu Excel'de manuel olarak açıp Excel'in tarih olarak algıladığı bir hücre değerini yazmış olsaydı, Excel'in atayacağı aynı varsayılan tarih biçimiyle görüntülenmesini istiyorum.

Yanıtlar:


174

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
Teşekkürler ninja, bu benim için çalışıyor. Bunu yapması gerekenler için bir yorum. BuiltinFormatsExcel'in bildiği tüm standart biçimleri (yalnızca tarih biçimlerini değil) listeleyen bir POI sınıfı vardır . getFormat()Yukarıdaki kod parçacığında gösterilen yönteme parametrem olarak kullanmak için bunlardan birine bağlı kalıyorum .
Jim Tough

Önemli kısım, bağlantının yorumlarında: ikinci hücreye tarih (ve saat) olarak stil veriyoruz. Çalışma kitabından yeni bir hücre stili oluşturmak önemlidir, aksi takdirde yerleşik stili değiştirebilir ve yalnızca bu hücreyi değil, diğer hücreleri de etkileyebilirsiniz.
CGK

Teşekkürler @ninja. Neden getCreationHelper()gerekli olduğunu biliyor musunuz ? Şu anda bir Excel çıktı dosyası oluşturmak için Mule ile çalışıyorum ve aslında createDataFormat()yaratma yardımcısı olmadan kullanabildim ve testimde bir Excel dosyası oluşturdum. Kullanmamanın bir dezavantajı var mı? Teşekkürler!
Rashiki

@Rashiki Bu cevap 6 yıl önce gönderilmiştir. Sanırım bu süre zarfında Apache POI'sinin API'sı değişti. Sorunuza cevabım 'Hayır, olumsuz bir yanı yok (beklendiği gibi çalışıyorsa)'
ninja

İçin herhangi bir format görmüyorum mm/dd/yyyy. Ben başka biçimini kullandığınızda, Excel bir hata görüntüler File error, some number formats may have been losto ekran yapar, Dateexcel türü. Bunun nasıl düzeltilebileceği hakkında hiçbir fikrim yok.
Akash

24

Varsayılan Excel türü Tarih'i ayarlamak için (varsayılan olarak işletim sistemi düzeyinde yerel ayar / -> yani xlsx, bir Alman veya İngiliz kişi tarafından açıldığında farklı görünecek / ve Excel'in hücre biçimi seçicisinde seçerseniz yıldız işaretiyle işaretlenmiş) şunları yapmalısınız:

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

Bunu xlsx ile yaptım ve iyi çalıştı.


2
Fiffy'nin yorumuna kesinlikle katılıyorum. Tek bir sorum var. En iyi yaklaşım nedir. DataFormat kısa değerine (14) veya dize değerine ("m / g / yy") güvenin. Excel'deki standart tarih biçimini tanımlayan gerçekten sabit değer hangisidir? DataFormat.getFormat (), parametre olarak hem string hem de kısa değere sahiptir.
Miklos Krivan

Miklos, string değeri çözümünün nasıl çalıştığını bilmiyorum. Excel'lerde farklı dillerde "dil tabanlı farklı varsayılan tarih biçimini" de gösterip göstermediğine dair geri bildirimde bulunulsa çok memnun olurum.
BlondCode

13

Bu örnek, .xlsx dosya türleriyle çalışmak içindir. Bu örnek, bir .xslx elektronik tablosu oluşturmak için kullanılan bir .jsp sayfasından gelmektedir.

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

Cevabımı burada yazıyorum çünkü buradaki soru soran kişiden biraz farklı bir gereksinimi olabilecek diğer okuyuculara yardımcı olabilir.

Bir .xlsx şablonu hazırlıyorum; tarihlerle doldurulacak tüm hücreler zaten tarih hücreleri olarak biçimlendirilmiştir (Excel kullanılarak).

.Xlsx şablonunu Apache POI kullanarak açıyorum ve sonra sadece tarihi hücreye yazıyorum ve çalışıyor.

Aşağıdaki örnekte, A1 hücresi zaten Excel'in içinden biçimlendirilmiştir [$-409]mmm yyyyve Java kodu yalnızca hücreyi doldurmak için kullanılır.

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 açıldığında, tarih doğru biçimlendirilir.


0

Bu kod örneği, tarih formatını değiştirmek için kullanılabilir. Burada yyyy-AA-gg'den gg-AA-yyyy'ye değiştirmek istiyorum. İşte possütunun konumu.

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 tarafından kullanılan biçim dizesini tahmin etmek zorunda kalmadan öğrenmek için: bir excel dosyası oluşturun, A1 hücresine bir tarih yazın ve istediğiniz gibi biçimlendirin. Ardından aşağıdaki satırları çalıştırın:

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

Ardından, ortaya çıkan dizeyi kopyalayıp yapıştırın, ters eğik çizgileri kaldırın (örneğin d/m/yy\ h\.mm;@olur d/m/yy h.mm;@) ve http://poi.apache.org/spreadsheet/quick-guide.html#CreateDateCells kodunda kullanın:

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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.