# Apache POI Excel Datum auslesen



## vodn7v (22. Sep 2010)

Hi,
ich bin dabei via apache poi ein excelsheet auszulesen. Alles kein Problem, jedoch verzweifle ich an den Datumsfeldern.


```
case NumberRecord.sid:
                NumberRecord numrec = (NumberRecord) record;
                System.out.println("Cell found with value " + numrec.getValue()
                        + " at row " + numrec.getRow() + " and column " + numrec.getColumn());
                break;
```
So, das ist der Teil aus dem HowTo,dort kommt der numerische Datumswert an (z.B. 3981). Die umrechnungsformel habe ich hier auch gefunden. Die funktioniert auch super. 

Problem jetzt: Wie erkenne ich, dass es ein Datum ist? Ich habe Felder mit numerischen Werten und Datumswerten. Beide könnten jetzt 3981 sein, dabei einmal numerisch und einmal als Datumswert. Gibt es da eine Möglichkeit, wie ich herausbekommen kann, was es jetzt ist?


vielen Dank !!


----------



## SlaterB (22. Sep 2010)

an interessanten Methoden sehe ich nur
cell.getCellStyle(), cell.getCellType(),  cell.getDateCellValue()

schaue dir die drei an, ob die bei Date-Zellen im Vergleich zu anderen Zellen unterscheidbar andere Werte liefern


----------



## Atze (22. Sep 2010)

cellType sollte doch aufschluss bringen!


----------



## vodn7v (22. Sep 2010)

Hi und Danke erstmal. Ich habe meine Klasse leider etwas anders aufgebaut. und zwar nach diesem Beispiel:


```
/**
 * This example shows how to use the event API for reading a file.
 */
public class EventExample
        implements HSSFListener
{
    private SSTRecord sstrec;

    /**
     * This method listens for incoming records and handles them as required.
     * @param record    The record that was found while reading.
     */
    public void processRecord(Record record)
    {
        switch (record.getSid())
        {
            // the BOFRecord can represent either the beginning of a sheet or the workbook
            case BOFRecord.sid:
                BOFRecord bof = (BOFRecord) record;
                if (bof.getType() == bof.TYPE_WORKBOOK)
                {
                    System.out.println("Encountered workbook");
                    // assigned to the class level member
                } else if (bof.getType() == bof.TYPE_WORKSHEET)
                {
                    System.out.println("Encountered sheet reference");
                }
                break;
            case BoundSheetRecord.sid:
                BoundSheetRecord bsr = (BoundSheetRecord) record;
                System.out.println("New sheet named: " + bsr.getSheetname());
                break;
            case RowRecord.sid:
                RowRecord rowrec = (RowRecord) record;
                System.out.println("Row found, first column at "
                        + rowrec.getFirstCol() + " last column at " + rowrec.getLastCol());
                break;
            case NumberRecord.sid:

--------------->>>> an dieser stelle fidnet sich das Datum wieder..
                NumberRecord numrec = (NumberRecord) record;
                System.out.println("Cell found with value " + numrec.getValue()
                        + " at row " + numrec.getRow() + " and column " + numrec.getColumn());
                break;
                // SSTRecords store a array of unique strings used in Excel.
            case SSTRecord.sid:
                sstrec = (SSTRecord) record;
                for (int k = 0; k < sstrec.getNumUniqueStrings(); k++)
                {
                    System.out.println("String table value " + k + " = " + sstrec.getString(k));
                }
                break;
            case LabelSSTRecord.sid:
                LabelSSTRecord lrec = (LabelSSTRecord) record;
                System.out.println("String cell found with value "
                        + sstrec.getString(lrec.getSSTIndex()));
                break;
        }
    }

    /**
     * Read an excel file and spit out what we find.
     *
     * @param args      Expect one argument that is the file to read.
     * @throws IOException  When there is an error processing the file.
     */
    public static void main(String[] args) throws IOException
    {
        // create a new file input stream with the input file specified
        // at the command line
        FileInputStream fin = new FileInputStream(args[0]);
        // create a new org.apache.poi.poifs.filesystem.Filesystem
        POIFSFileSystem poifs = new POIFSFileSystem(fin);
        // get the Workbook (excel part) stream in a InputStream
        InputStream din = poifs.createDocumentInputStream("Workbook");
        // construct out HSSFRequest object
        HSSFRequest req = new HSSFRequest();
        // lazy listen for ALL records with the listener shown above
        req.addListenerForAllRecords(new EventExample());
        // create our event factory
        HSSFEventFactory factory = new HSSFEventFactory();
        // process our events based on the document input stream
        factory.processEvents(req, din);
        // once all the events are processed close our file input stream
        fin.close();
        // and our document input stream (don't want to leak these!)
        din.close();
        System.out.println("done.");
    }
}
```

Also mit den einzelnen Cell values habe ich gar nichts zu tun....hm


----------



## vodn7v (22. Sep 2010)

hi,
ich habe etwas ähnliches gefunden, und zwar: Listener.getFormatString(Cell);

Jedoch bekomme ich, egal bei welchem Datentyp immer den String "General" zurück.. puh.. oder als index "0".

Hier eine Liste der indexparamteter die zurückkommen können. Leider bekomme ich keinen Datumsindex zurück..

HSSFDataFormat (javadocexamples.COM JAVA DOC BY EXAMPLES) - API, Usage, Demos and code examples


----------



## vodn7v (22. Sep 2010)

mahlzeit, ich habs raus 


```
int formatIndex = myListener.getFormatIndex(numrec);
			thisStr = myListener.formatNumberDateCell( numrec );
					
			if(formatIndex == 193) {
				double d = numrec.getValue();
				java.text.SimpleDateFormat fmt = new java.text.SimpleDateFormat( "dd.MM.yyyy");
				java.util.Date date = HSSFDateUtil.getJavaDate(d);
				thisStr = fmt.format(date);
 			}
```


----------



## BurnedToast (4. Nov 2010)

Nach dem Modell der gefundenen Klasse funktioniert es eigentlich ganz sauber! Auch interne Formate werden beachtet!

klick mich


----------

