2016-04-28 5 views
1

Ich nehme Daten aus Xlsx-Datei, Die Daten der XLSX-Datei wie unten .java.text.ParseException: Unparseable Datum: "42321" (Es handelt sich um Konvertierung Datum von Excel-Format in Java-Format, nicht über DateFormat.parse.)

1 1 13/11/15 00:00:02 3 42.61 xxxx to xxxx 9 2 2 Axle Truck or Bus 
2 1 13/11/15 00:00:12 1 27.11 xxxx to xxxx 3 2 3 Wheeler 
3 1 13/11/15 00:00:15 3 22.65 xxxx to xxxx 7 2 LMV 2 Axle Light Motor Vehicle 
4 1 13/11/15 00:00:21 2 18.76 xxxx to xxxx 7 2 LMV 2 Axle Light Motor Vehicle 
5 1 13/11/15 00:00:21 3 18.76 xxxx to xxxx 9 2 2 Axle Truck or Bus 

aus diesen Daten i Lese sind zeilenweise und Einfügen in der Datenbank von unten Code.

aber das Problem ist, ich bin nicht in der Lage, Datum der dritten Spalte von XLSX-Datei zu bekommen, aber ich bleibe noch zu drucken.

unten ist mein Code:

processOneSheet("C:/Users/Penchalaiah/Desktop/New folder/"+hs.getAttribute("filename1")); 
     System.out.println(hs.getAttribute("filename1")); 
     System.out.println("clossing the connnection"); 
     ps.close(); 
     con1.close(); 
     System.out.println("execution completed"); 
     //request.setAttribute("message","THE XLSX DATA TRANSFERRED SUCCEFULLY"); 
     // request.getRequestDispatcher("/HomePage.jsp").forward(request, response); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    /*try { 
     ps.close(); 
     con1.close(); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }*/ 


} 



public void processOneSheet(String filename) throws Exception { 
    System.out.println("executing Process Method"); 
    OPCPackage pkg = OPCPackage.open(filename); 
    XSSFReader r = new XSSFReader(pkg); 
    SharedStringsTable sst = r.getSharedStringsTable(); 

    XMLReader parser = fetchSheetParser(sst); 

    // To look up the Sheet Name/Sheet Order/rID, 
    // you need to process the core Workbook stream. 
    // Normally it's of the form rId# or rSheet# 
    InputStream sheet2 = r.getSheet("rId2"); 
    System.out.println("Sheet2"); 
    InputSource sheetSource = new InputSource(sheet2); 
    parser.parse(sheetSource); 
    sheet2.close(); 
} 



public XMLReader fetchSheetParser(SharedStringsTable sst) throws SAXException { 
    XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); 
    ContentHandler handler = new SheetHandler(sst); 
    parser.setContentHandler(handler); 
    return parser; 
} 

/** 
* See org.xml.sax.helpers.DefaultHandler javadocs 
*/ 
private class SheetHandler extends DefaultHandler { 

    private SharedStringsTable sst; 
    private String lastContents; 
    private boolean nextIsString; 

    String TxnNo; 
    String SurveyId; 
    Date date; 
    String Time; 
    String Lane; 
    String Avspeed; 
    String Direction; 
    String VehicleCategory; 
    String Axle_count; 
    String Vehicle; 


    int i = 1; 

    private SheetHandler(SharedStringsTable sst) { 
     this.sst = sst; 

    } 

    public void startElement(String uri, String localName, String name, 
      Attributes attributes) throws SAXException { 
     // c => cell 
     if(name.equals("c")) { 
      // Print the cell reference 
      //System.out.print(attributes.getValue("r") + " - "); 
      // Figure out if the value is an index in the SST 
      String cellType = attributes.getValue("t"); 
      if(cellType != null && cellType.equals("s")) { 
       nextIsString = true; 
      } else { 
       nextIsString = false; 
      } 
     } 
     // Clear contents cache 
     lastContents = ""; 
    } 

    public void endElement(String uri, String localName, String name) 
      throws SAXException { 
     // Process the last contents as required. 
     // Do now, as characters() may be called more than once 
     if(nextIsString) { 
      int idx = Integer.parseInt(lastContents); 
      lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString(); 
      nextIsString = false; 
     } 
     // v => contents of a cell 
     // Output after we've seen the string contents 
     if(name.equals("v")) { 

      if(i == 1){ 
       TxnNo = lastContents; 
      } 
      if(i == 2){ 
       SurveyId = lastContents; 
      } 
      if(i == 3){ 
       try { 
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
        date = new SimpleDateFormat("dd/MM/yyyy",Locale.ENGLISH).parse(lastContents); 
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
        System.out.println("The Date is: "+date); 
       } catch (ParseException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       //System.out.print(lastContents+"("+i+")"); 
      } 
      if(i == 4){ 
       Time = lastContents; 
       //System.out.print(lastContents+"("+i+")"); 
      } 
      if(i == 5){ 
       Lane = lastContents; 
       //System.out.print(lastContents+"("+i+")"); 
      } 
      if(i == 6){ 
       Avspeed = lastContents; 
       //System.out.print(lastContents+"("+i+")"); 
      } 
      if(i == 7){ 
       Direction = lastContents; 
       //System.out.print(lastContents+"("+i+")"); 
      } 
      if(i == 8){ 
       VehicleCategory = lastContents; 
       //System.out.print(lastContents+"("+i+")"); 
      } 
      if(i == 9){ 
       Axle_count = lastContents; 
       //System.out.print(lastContents+"("+i+")"); 
      } 
      if(i == 10){ 
       Vehicle = lastContents; 
       //System.out.print(lastContents+"("+i+")"); 

       //System.out.print(lastContents+"("+i+")"); 
       insertInToDb(TxnNo, SurveyId, date, Time, Lane, Avspeed,Direction, VehicleCategory, Axle_count, Vehicle); 
       i = 0; 
      } 


      i++; 


     } 

    } 


    public void characters(char[] ch, int start, int length) 
      throws SAXException { 
     lastContents += new String(ch, start, length); 
    } 
} 
    int gcc = 0; 
    public void insertInToDb(String TxnNo,String SurveyId,Date date, String Time,String Lane,String Avspeed,String Direction, String VehicleCategory, String Axle_count, String Vehicle){ 

     try { 

      ps.setString(1, TxnNo); 
      ps.setString(2, SurveyId); 
      ps.setDate(3, (java.sql.Date) date); 
      ps.setString(4, Time); 
      ps.setString(5, Lane); 
      ps.setString(6, Avspeed); 
      ps.setString(7, Direction); 
      ps.setString(8, VehicleCategory); 
      ps.setString(9, Axle_count); 
      ps.setString(10, Vehicle); 
      ps.setString(11, (String)hs.getAttribute("zoneId1")); 
      ps.setString(12, (String)hs.getAttribute("location1")); 
      ps.executeUpdate(); 

ich bin immer Ausnahme zwischen // @@@@@@@@@@@@
// @@@@@@@@@ @@ des oben gezeigten Codes
Wenn ich Datum Spalte der Zeichenfolge drucke, bekomme ich 42321 diesen Wert.

Wie zum Datum dieses Spaltenwertes zu konvertieren und in die Datenbank einzufügen?

+0

Funktioniert 'dd/M/yy'? – soufrk

+0

Funktioniert dd/M/yy? - Soufrk mit diesem ich bekomme die gleiche Ausnahme – honey1

+0

Btw, ändern 'if (i == X)' zu 'switch' - es wäre effizienter und lesbarer. –

Antwort

1

Excel speichert Datum als Tageszählung seit Januar 0, 1900. Sie müssen also das tatsächliche Datum von Hand erstellen, nicht nur analysieren.

@Test 
public void excel() { 
    Calendar cl = Calendar.getInstance(); 
    cl.set(Calendar.YEAR, 1900); 
    cl.set(Calendar.MONTH, Calendar.JANUARY); 
    cl.set(Calendar.DAY_OF_MONTH, 0); 
    cl.add(Calendar.DAY_OF_MONTH, 42321 - 1); 
    System.out.println(new SimpleDateFormat("dd/MM/yyyy").format(cl.getTime())); 

    double excel = 2.31481481481481E-005; 
    cl.set(Calendar.SECOND, (int) Math.round(excel * 86400)); 
    cl.set(Calendar.MINUTE, (int) Math.round(excel * 86400/60)); 
    cl.set(Calendar.HOUR_OF_DAY, (int) Math.round(excel * 86400/60/60)); 
    System.out.println(new SimpleDateFormat("HH:mm:ss").format(cl.getTime())); 
} 

Ausgabe

13/11/2015 
00:00:02 

bearbeiten

Hinweis -1 in der Nähe von 43231 nach https://support.microsoft.com/en-us/kb/214326 es Fehler in Excel ist, so brauchen wir nicht vorhandene 29/02/1900 überspringen.

bearbeiten

Added Zeitberechnung.

+0

ich bekomme auch 14.11.2015. Ich brauche 13.11.15 nur nicht 2015 – honey1

+0

@ honey1 verwenden Sie "TT/MM/JJ" als Format Zeichenfolge –

+0

mit TT/MM/JJ bekomme ich 14.11.15. aber was ist mit Datum – honey1

Verwandte Themen