Come si imposta il valore della cella su Data e si applica il formato di data Excel predefinito?


101

Sto usando Apache POI per un po 'di tempo per leggere i file Excel 2003 esistenti a livello di programmazione. Ora ho un nuovo requisito per creare interi file .xls in memoria (ancora utilizzando Apache POI) e quindi scriverli in un file alla fine. L'unico problema che mi ostacola è la gestione delle celle con le date.

Considera il codice seguente:

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

Quando scrivo la cartella di lavoro contenente questa cella su un file e la apro con Excel, la cella viene visualizzata come un numero. Sì, mi rendo conto che Excel memorizza le sue "date" come numero di giorni dal 1 gennaio 1900 e questo è ciò che rappresenta il numero nella cella.

DOMANDA: Quali chiamate API posso utilizzare in POI per comunicargli che desidero applicare un formato di data predefinito alla cella della mia data?

Idealmente, voglio che la cella del foglio di calcolo venga visualizzata con lo stesso formato di data predefinito che Excel le avrebbe assegnato se un utente avesse aperto manualmente il foglio di calcolo in Excel e avesse digitato un valore di cella che Excel ha riconosciuto come una data.

Risposte:


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
Grazie ninja, questo funziona per me. Un commento per gli altri che hanno bisogno di farlo. Esiste una classe POI denominata BuiltinFormatsche elenca tutti i formati standard (non solo i formati di data) conosciuti da Excel. Mi attengo a uno di quelli da utilizzare come parametro per il getFormat()metodo mostrato nello snippet sopra.
Jim Tough

La parte importante è nei commenti del collegamento: definiamo la seconda cella come una data (e ora). È importante creare un nuovo stile di cella dalla cartella di lavoro altrimenti si può finire per modificare lo stile integrato ed effettuare non solo questa cella ma anche altre celle.
CGK

Grazie, @ninja. Sai perché getCreationHelper()è necessario? Sto lavorando con Mule in questo momento per generare un file di output Excel e sono stato effettivamente in grado di utilizzare createDataFormat()senza l'helper di creazione e ho generato un file Excel nel mio test. C'è uno svantaggio nel non usarlo? Grazie!
Rashiki

@Rashiki Questa risposta è stata pubblicata 6 anni fa. Immagino che l'API del POI Apache sia cambiata durante questo periodo. La mia risposta alla tua domanda è "No, non ci sono svantaggi (se funziona come previsto)"
ninja

Non vedo alcun formato per mm/dd/yyyy. Quando utilizzo qualsiasi altro formato, Excel visualizza un errore File error, some number formats may have been lost, visualizza il Datetipo in Excel. Non ho idea di come questo possa essere risolto.
akash

24

Per impostare il tipo di Excel predefinito Data (predefinito a livello di sistema operativo locale / -> cioè xlsx avrà un aspetto diverso quando viene aperto da un tedesco o britannico / e contrassegnato con un asterisco se lo scegli nel selettore del formato cella di Excel) dovresti:

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

L'ho fatto con xlsx e ha funzionato bene.


2
Assolutamente d'accordo sul commento di Fiffy. Ho solo una domanda. Qual è l'approccio migliore. Affidati al valore breve dataFormat (14) o al valore stringa ("m / g / aa"). Qual è davvero il valore costante che descrive il formato di data standard in Excel? DataFormat.getFormat () ha sia con stringa che con valore breve come parametro.
Miklos Krivan

Miklos, non so come funziona la soluzione del valore stringa. Sarei felice se qualcuno potesse esprimere un feedback se questo mostra anche il "formato di data predefinito diverso basato sulla lingua" in Excels con lingue diverse.
BlondCode

13

Questo esempio è per lavorare con i tipi di file .xlsx. Questo esempio proviene da una pagina .jsp utilizzata per creare un foglio di calcolo .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);

1

Sto scrivendo la mia risposta qui perché potrebbe essere utile ad altri lettori, che potrebbero avere un requisito leggermente diverso rispetto all'interrogante qui.

Preparo un template .xlsx; tutte le celle che verranno popolate con le date, sono già formattate come celle di data (usando Excel).

Apro il modello .xlsx usando Apache POI e poi scrivo semplicemente la data nella cella, e funziona.

Nell'esempio seguente, la cella A1 è già formattata da Excel con il formato [$-409]mmm yyyye il codice Java viene utilizzato solo per popolare la cella.

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

Quando Excel è aperto, la data è formattata correttamente.


0

Questo esempio di codice può essere utilizzato per modificare il formato della data. Qui voglio passare da yyyy-MM-dd a dd-MM-yyyy. Ecco la posposizione della colonna.

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

Per conoscere la stringa di formato utilizzata da Excel senza doverla indovinare: crea un file excel, scrivi una data nella cella A1 e formattala come desideri. Quindi esegui le seguenti righe:

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

Quindi copia e incolla la stringa risultante, rimuovi le barre rovesciate (ad esempio, d/m/yy\ h\.mm;@diventa d/m/yy h.mm;@) e usalo nel codice 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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.