2011-12-19 29 views
8

Voglio scrivere il risultato di una query sql in un file csv o excel e salvarlo in una cartella particolare. Vorrei sapere se questo può essere ottenuto utilizzando un programma java che può essere riutilizzato per qualsiasi risultato di query SQL. Vorrei anche sapere se questo può essere utilizzato per diversi tipi di database (Oracle, MySQL, MS SQL Server ecc.). Ho intenzione di allegare il file salvato a una e-mail (è questo possibile esportazione diretta di un risultato di query sql a una e-mail) .Si prega di aiutare.esportazione sql risultato della query su csv o excel

+0

Questo è esattamente quello che stai cercando: https://www.youtube.com/watch?v=hlY_PoJhlMk (https://mvnrepository.com/ artefatto/net.sf.automatic-report-generator) –

risposta

2

Ecco un esempio:

import java.io.*; 
import java.sql.*; 
import org.apache.poi.hssf.usermodel.HSSFSheet; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.hssf.usermodel.HSSFRow; 
import org.apache.poi.hssf.usermodel.HSSFCell; 

public class ExcelFile { 
     public static void main(String[] args) { 
       try { 
         Class.forName("com.mysql.jdbc.Driver").newInstance(); 
         Connection connection = DriverManager.getConnection(
             "jdbc:mysql://localhost:3306/test", "root", "root"); 
         PreparedStatement psmnt = null; 
         Statement st = connection.createStatement(); 
         ResultSet rs = st.executeQuery("Select * from student"); 

         HSSFWorkbook wb = new HSSFWorkbook(); 
         HSSFSheet sheet = wb.createSheet("Excel Sheet"); 
         HSSFRow rowhead = sheet.createRow((short) 0); 
         rowhead.createCell((short) 0).setCellValue("Roll No"); 
         rowhead.createCell((short) 1).setCellValue("Name"); 
         rowhead.createCell((short) 2).setCellValue("Class"); 
         rowhead.createCell((short) 3).setCellValue("Marks"); 
         rowhead.createCell((short) 4).setCellValue("Grade"); 

         int index = 1; 
         while (rs.next()) { 

           HSSFRow row = sheet.createRow((short) index); 
           row.createCell((short) 0).setCellValue(rs.getInt(1)); 
           row.createCell((short) 1).setCellValue(rs.getString(2)); 
           row.createCell((short) 2).setCellValue(rs.getString(3)); 
           row.createCell((short) 3).setCellValue(rs.getInt(4)); 
           row.createCell((short) 4).setCellValue(rs.getString(5)); 
           index++; 
         } 
         FileOutputStream fileOut = new FileOutputStream("c:\\excelFile.xls"); 
         wb.write(fileOut); 
         fileOut.close(); 
         System.out.println("Data is saved in excel file."); 
         rs.close(); 
         connection.close(); 
       } catch (Exception e) { 
       } 
     } 
} 

Reference

1

Sì!

È possibile connettersi ai diversi tipi di database utilizzando jdbc e quindi creare un Excel con i risultati (Seen here).

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class TestAccessExcel { 
    public static Connection getConnection() throws Exception { 
    String driver = "sun.jdbc.odbc.JdbcOdbcDriver"; 
    String url = "jdbc:odbc:excelDB"; 
    String username = "username"; 
    String password = "pass"; 
    Class.forName(driver); 
    return DriverManager.getConnection(url, username, password); 
    } 

    public static void main(String args[]) { 
    Connection conn = null; 
    Statement stmt = null; 
    ResultSet rs = null; 
    try { 
     conn = getConnection(); 
     stmt = conn.createStatement(); 
     String excelQuery = "select * from [Sheet1$]"; 
     rs = stmt.executeQuery(excelQuery); 

     while (rs.next()) { 
     System.out.println(rs.getString("BadgeNumber") + " " + rs.getString("FirstName") + " " 
      + rs.getString("LastName")); 
     } 
    } catch (Exception e) { 
     System.err.println(e.getMessage()); 
    } finally { 
     try { 
     rs.close(); 
     stmt.close(); 
     conn.close(); 

     } catch (SQLException e) { 
     e.printStackTrace(); 
     } 
    } 
    } 
} 
+0

Questo è un modo davvero intelligente per gestirlo se ci si trova in un ambiente Windows. Inoltre è relativamente "portatile" in quanto la stessa idea funziona con qualsiasi linguaggio. L'alternativa Apache non è una cattiva idea neanche. –

+0

L'esempio mostra come leggere da un foglio di calcolo Excel, non come crearne uno. – datguy

0

Per far funzionare questo è necessario lavorare scrivere un piccolo codice che può occupare qualsiasi query e qualsiasi driver. Il primo input dovrebbe essere il nome del driver come input per il software che stai scrivendo. Quindi il software che si sta scrivendo dovrebbe essere in grado di eseguire qualsiasi SQL assegnato e fornire solo righe e colonne.

L'attività successiva viene eseguita per analizzare il ResultSet proveniente dal JDBC dell'applicazione java. O vuoi scrivere i risultati in un file CSV o EXCEL si basa su quanto sei bravo a fare con java api.

Scrivere l'output nel CVS è semplice e non trival. Non ho lavorato all'esportazione dei dati in Excel. Sono sicuro che trovi vasi per questo.

1

Questa è la mia soluzione. codice da inserire nella classe principale:

import java.io.*; 
import java.sql.*; 
import com.company.*; 
/** 
* Created by MAXNIGELNEGRO 
*/ 
    String[] filePath =  new String[] {"C:\\Users\\Documents\\MyFile.csv"}; 
    String[] driverDB =  new String[] {"oracle.jdbc.driver.OracleDriver"}; 
    String[] stringConnDB = new String[] {"jdbc:oracle:thin:@//127.0.0.1:1881/mydb"}; 
    String[] userDB =   new String[] {"pippo"}; 
    String[] passDB =   new String[] {"pluto"}; 
    String[] charSep =  new String[] {";"}; 
    Boolean colomn= new Boolean (true); 
    String[] queryDB =  new String[] {"select * FROM MYQUERY"}; 


try{ 
    System.out.println("---------------File exist?------------" + filePath[0]); 
    File fileTemp = new File(filePath[0].toString()); 
    if (fileTemp.exists()){ 
     fileTemp.delete(); 
     System.out.println("---------------DELETE FILE------------" + filePath[0]); 
       } 
    System.out.println("QUERY: ---->"+ queryDB[0].toString()); 
    exportQueryToCsv exp = new exportQueryToCsv(); 
    exp.exportQueryToCsv(filePath,driverDB,stringConnDB,userDB,passDB,queryDB, colomn,charSep); 
    if (fileTemp.exists()){ 
    System.out.println("---File created---" + filePath[0]); 
    } 

} 
catch(Exception e){ 
     e.printStackTrace(); 
     } 

La classe di base:

import java.io.IOException; 
import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

/** 
* Created by MAXNIGELNEGRO 
*/ 
public class exportQueryToCsv { 
    public exportQueryToCsv(){} 
    public static void exportQueryToCsv (String[] filename, String[] driverDB, String[] connDB 
              , String[] userDB, String[] passDB, String[] queryDB, Boolean intestaFile 
              , String[] charSep) throws SQLException, IOException { 
     Statement stmt=null; 
     ResultSet rset=null; 
     Connection conn=null; 
     try { DBConn connessione = new DBConn(); 
     conn=connessione.connect(driverDB[0],connDB[0],userDB[0],passDB[0]); 
     conn.setAutoCommit(false); 

     stmt = conn.createStatement(); 

     rset = stmt.executeQuery(queryDB[0]); 

     ExportData2CSV csv = new ExportData2CSV(); 
     csv.ExportData2CSV(rset,filename[0],intestaFile,charSep[0]); 

      csv.createFileCsv(); 
     } catch (SQLException e) { 
       e.printStackTrace(); 
     } catch (IOException e) { 
       e.printStackTrace(); 
     } 
     finally { 
      if (stmt != null) {stmt.close();} 
      if (conn != null) {conn.close();} 
      if (rset != null) {rset.close();} 



     } 


    } 
} 

Questa è la classe dbconn per il collegamento al database di

import java.sql.*; 

/** 
* Created by MAXNIGELNEGRO 
*/ 
public class DBConn { 
    public DBConn() { 
    } 
    public Connection connect(String driverDB, String db_connect_str, String db_userid, String db_password) { 
     Connection conn; 

     try { 
      Class.forName(driverDB).newInstance(); 
      conn = DriverManager.getConnection(db_connect_str, db_userid, db_password); 


     } catch (Exception e) { 
      e.printStackTrace(); 
      conn = null; 

     } 
     return conn; 
    } 


} 

Questa è la classe per recuperare i dati dal tavolo per ResultSet e scrive file CSV

package com.company; 

import java.io.FileWriter; 
import java.io.IOException; 
import java.sql.ResultSet; 
import java.sql.ResultSetMetaData; 
import java.sql.SQLException; 

/** 
* Created by MAXNIGELNEGRO 
*/ 
public class ExportData2CSV { 
    public ResultSet rset; 
    public String filename; 
    public Boolean colomnName; 
    public String charSep; 

    public void ExportData2CSV(ResultSet rset, String filename, Boolean colomnName, String charSep) { 
     this.rset = rset; 
     this.filename = filename; 
     this.colomnName = colomnName; 
     this.charSep = charSep; 
    } 

    public void createFileCsv() throws SQLException, IOException { 
     FileWriter cname = null; 
     try { 

       // WRITE COLOMN NAME 
      ResultSetMetaData rsmd = rset.getMetaData(); 
      cname = new FileWriter(filename); 
      if (colomnName) { 
       for (int i = 1; i <= rsmd.getColumnCount(); i++) { 
        cname.append(rsmd.getColumnName(i)); 
        cname.append(charSep); 
        cname.flush(); 
       } 
       cname.append(System.getProperty("line.separator")); 
      } 

      // WRITE DATA 
      while (rset.next()) { 
       for (int i = 1; i <= rsmd.getColumnCount(); i++) { 
        if (rset.getObject(i) != null) { 
         String data = rset.getObject(i).toString().replaceAll(charSep, ""); 
         cname.append(data); 
         cname.append(charSep); 
        } else { 
         String data = "null"; 
         cname.append(data); 
         cname.append(charSep); 
        } 

       } 
       //new line entered after each row 
       cname.append(System.getProperty("line.separator")); 

      } 


     } catch (Exception e) { 
      e.printStackTrace(); 

     } finally { 
      if (cname != null) { 
       cname.flush(); 
       cname.close(); 
      } 
      if (rset != null) { 
       rset.close(); 
      } 

     } 

    } 
} 
7

Con l'uso di openCSV API, è possibile esportare i dati in file CSV.

CSVWriter writer = new CSVWriter(new FileWriter("yourfile.csv"), '\t'); 
Boolean includeHeaders = true; 

java.sql.ResultSet myResultSet = .... //your resultset logic here 

writer.writeAll(myResultSet, includeHeaders); 

writer.close(); 
1

Questa è la scheda dati di Excel

input excel file containing records Hi questa è la soluzione avete bisogno di 3 file 1.Input filo struttura filo 2.Output 3.data 4.Main filo 1.Input a leggere la stringa excel e di output per scrivere sql out put 2. struttura dati è per contenere e trasferire i dati

(InputThread.java)

import java.io.*; 
public class InputThread extends Thread{ 


    String fp; 
    InputString is; 
    String tableName="emp"; 
    String outFile; 
    InputThread(String FilePath,String nameOfTheTable,String outFileName){ 
     fp=FilePath; 
     outFile=outFileName; 
     tableName=nameOfTheTable; 
    } 
    public void run(){ 
     File file = new File(fp); 
     String line; 
     try{ 
      BufferedReader br = new BufferedReader(new FileReader(file)); 
      if((line=br.readLine()) != null) 
       is = new InputString(line); 

      //transform(is);  

      InputString tmp = new InputString(createTable(line)); 
      //tmp.next = is; 
      is = tmp; 
      //tmp = tmp.next; 

      for(; (line = br.readLine()) != null;) { 
       tmp.next = new InputString(line); 
       tmp = tmp.next; 
       transform(tmp); 
       }    

     }catch(Exception e){ System.out.println("Error is :"+e); } 

     //traverse(); 
     new OutputThread(is,outFile).start(); 
    } 
    void transform(InputString x){ 

     String[] arr = x.getLine().split(","); 
     String sql = "insert into "+tableName+" values("; 
     for(int i=0;i<arr.length;i++){ 
      sql+="'"+arr[i]+"'"; 
      if((i+1) < arr.length) sql+=","; 
     } 
     sql+=");"; 
     x.setLine(sql); 

    } 
    String createTable(String x){ 
     String[] arr = x.split(","); 
     String sql = "create database vamsidb "+ "use vamsidb "+"create table "+tableName+"("; 
     for(int i=0;i<arr.length;i++){ 
      sql+=arr[i]+" varchar(50)"; 
      if((i+1) < arr.length) sql+=","; 
     } 
     sql+=");"; 
     return sql; 
    } 
    /*public void traverse(){ 
     InputString tmp = is; 
     while(is != null){ 
      System.out.println(is.getLine()); 
      is=is.next; 
     } 
    }*/ 


} 

(OutputThread.java)

import java.io.*; 
public class OutputThread extends Thread{ 
    InputString is; 
    String outFile; 
    OutputThread(InputString linkedList,String outFileName){ 
     is=linkedList; 
     outFile = outFileName; 
    } 
    public void run(){ 

     try{ 
      FileOutputStream fos = new FileOutputStream(outFile); 
      while(is != null){    
       fos.write(is.getLine().getBytes());    
       is=is.next; 
      } 
      fos.close(); 
     }catch(Exception e){ 
      System.out.println("Error is :"+e); 
     } 
    } 
} 

(Main.java)

public class Main{ 
public static void main(String[] args){ 

     InputThread it = new InputThread("sasken.csv","emp","output.sql"); 

     it.start();  
    } 
} 

(DataStructure.java)

// Questa classe rappresenta la struttura di dati per contenere e trasformare l'input // dati come un elenco collegato di istruzioni sql

class InputString{ 

    String line; 
    InputString next; 

    InputString(String x){ 
     line = x; 
    } 
    String getLine(){ 
     return line; 
    } 
    void setLine(String x){ 
     line = x; 
    } 
} 

output result

2

soluzione più semplice.

Metodo principale

private List<String> resultSetArray=new ArrayList<>(); 
private String username ="";  // Enter DB Username 
private String password = ""; // Enter DB password 
private String url = "";   // Enter DB URL 

Connection connection=DriverManager.getConnection(url,user,pwd); 

public static void main(String args[]) throws Exception{ 

     fetchDataFromDatabase("SQL queries", connection); 
     printToCsv(resultArray);     

} 

fetchDataFromDatabase

Il codice sotto contare il numero di colonne in una tabella, e conservare in una matrice risultato.

private void fetchDataFromDatabase(String selectQuery,Connection connection) throws Exception{ 
      try { 


       Statement stmt = connection.createStatement(); 
       ResultSet rs = stmt.executeQuery(selectQuery); 
       int numCols = rs.getMetaData().getColumnCount(); 

       while(rs.next()) { 
        StringBuilder sb = new StringBuilder(); 

        for (int i = 1; i <= numCols; i++) { 
         sb.append(String.format(String.valueOf(rs.getString(i))) + " "); 

        } 
        resultSetArray.add(sb.toString()); 

       } 

      } catch (SQLException e) { 
       LOGGER.error("Sql exception " + e.getMessage()); 
      } 

     } 

printToCsv

public static void printToCsv(List<String> resultArray) throws Exception{ 

     File csvOutputFile = new File(file_name); 
     FileWriter fileWriter = new FileWriter(csvOutputFile, false); 


     for(String mapping : resultArray) { 
      fileWriter.write(mapping + "\n"); 
     } 

     fileWriter.close(); 

    } 
Problemi correlati