2016-04-14 19 views
1

Şu anda bir SQL tablosundaki tüm verileri almak ve bir CSV dosyasına indirmek için aşağıda listelenen java sınıfımda bir dosya indirme işlemi yaşıyorum. Bununla birlikte, dosyayı indirdiğimde, tüm veriler, rastgele noktalarda (genellikle en az 100 satırlık veri olduğu için verilerin 20 satırı civarında) kesilmesi dışında iyidir. Sormak istiyorum, ne yapmalıyım? Oturum süresi ile ilgili mi yoksa kod sadece sorunlu mu?Eclipse CSV İndirme verilerini kes

public String processFileDownload() { 

    DataBaseBean ckear = new DataBaseBean(); 
    ckear.clearContens(); 
    FacesContext fc = FacesContext.getCurrentInstance(); 
    ExternalContext ec = fc.getExternalContext(); 
    Map<String, Object> m = fc.getExternalContext().getSessionMap(); 
    dbase = (DbaseBean) m.get("dbaseBean"); 
    message = (MessageBean) m.get("messageBean"); 
    dataBean = (DataBean) m.get("dataBean"); 
    dbmsUser = (DbmsUserBean) m.get("dbmsUserBean"); 
    FileOutputStream fos = null; 

    String path = fc.getExternalContext().getRealPath("/temp"); 
    String tableName = dbmsUser.getTableName(); 
    String fileNameBase = tableName + ".csv"; 
    java.net.URL check = getClass().getClassLoader().getResource(
      "config.properties"); 
    File check2 = new File(check.getPath()); 
    path = check2.getParent(); 
    String fileName = path + "/" + dbmsUser.getUserName() + "_" 
      + fileNameBase; 

    File f = new File(fileName); 
    try { 
     f.createNewFile(); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    dbase.connect(); 
    dbase.setQueryType("SELECT"); 
    dbase.executeSQL("select * from " + tableName); 
    if (dbase.getResultSet() == null) { 
     FacesContext.getCurrentInstance().addMessage("myForm3:errmess", 
       new FacesMessage("Table doesn't exist!")); 
     return "failed"; 
    } 
    Result result = ResultSupport.toResult(dbase.getResultSet()); 
    downlaodedrows = result.getRowCount(); 
    Object[][] sData = result.getRowsByIndex(); 
    String columnNames[] = result.getColumnNames(); 
    StringBuffer sb = new StringBuffer(); 
    try { 
     fos = new FileOutputStream(fileName); 

     for (int i = 0; i < columnNames.length; i++) { 
      sb.append(columnNames[i].toString() + ","); 
     } 

     sb.append("\n"); 

     fos.write(sb.toString().getBytes()); 

     for (int i = 0; i < sData.length; i++) { 
      sb = new StringBuffer(); 
      for (int j = 0; j < sData[0].length; j++) { 
       sb.append(sData[i][j].toString() + ","); 
      } 

      sb.append("\n"); 
      fos.write(sb.toString().getBytes()); 
     } 

     fos.flush(); 
     fos.close(); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    String mimeType = ec.getMimeType(fileName); 
    FileInputStream in = null; 
    byte b; 

    ec.responseReset(); 
    ec.setResponseContentType(mimeType); 
    ec.setResponseContentLength((int) f.length()); 
    ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" 
      + fileNameBase + "\""); 

    try { 
     in = new FileInputStream(f); 
     OutputStream output = ec.getResponseOutputStream(); 
     while (true) { 
      b = (byte) in.read(); 
      if (b < 0) 
       break; 
      output.write(b); 
     } 
    } catch (NullPointerException e) { 
     fc.responseComplete(); 
     return "SUCCESS"; 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } finally { 
     try { 
      in.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    fc.responseComplete(); 
    return "SUCCESS"; 

} 

cevap

0

sorun sadece değerler arasındaki virgül sona eklendiğini gibi görünüyor ve muhtemelen değilse bir ayırıcı, çizgi ayırıcı veya tırnak karakteri, will "mola" CSV formatında içeren yazıyorsun değerlerden biri var doğru kaçtı.

Bunun için CSV kitaplığını kullanmak daha kolay ve hızlı olabilir. uniVocity-parsers, sonuçlarınızı doğru biçimlendirilmiş CSV'ye dökmek için önceden oluşturulmuş yordamlarla birlikte gelir. senin durumda, aşağıdaki şekilde bu kütüphaneyi kullanabilirsiniz:

ResultSet resultSet = dbase.getResultSet(); 

    // Configure the output format as needed before actually dumping the data: 
    CsvWriterSettings writerSettings = new CsvWriterSettings(); //many settings here, check the tutorials & examples. 
    writerSettings.getFormat().setLineSeparator("\n"); 
    writerSettings.setHeaderWritingEnabled(true); // we want the column names to be printed out as well. 

    // Then create a routines object: 
    CsvRoutines routines = new CsvRoutines(writerSettings); 

    // The write() method takes care of everything. The resultSet and any other resources required are closed by the routine. 
    routines.write(resultSet, new File(fileName), "UTF-8"); 

Umut bu

Yasal yardımcı olur: Bu kütüphanenin yazarım. Bu açık kaynak ve ücretsiz (Apache 2.0 lisans)

+0

Hey, Cevabınız için teşekkürler ve doğru. Ancak, çerçeve olmadan "UTF-8" eklemenin bir yolu var mı? Sınırlı kaynaklara sahip belirli bir proje olması nedeniyle bunu kullanamıyorum. – jni4

+0

Sevindim Yardımcı olabilirim. Sadece "UTF-8" parçasını atlayın ve bunun yerine "rutines.write (resultSet, new File (fileName))" yazın. Ayrıca bir FileOutputStream veya herhangi bir java.io.Writer örneğini de kullanabilirsiniz. –