2011-12-19 74 views
8

Quiero escribir el resultado de una consulta SQL a un archivo CSV o Excel y guardarlo en un folder.I particular, le gustaría saber si esto se puede lograr mediante un programa Java que pueden ser reutilizados para cualquier consulta SQL result.I también le gustaría saber si esto puede ser usado para diferentes tipos de bases de datos (Oracle, MySQL, MS SQL Server, etc) .I planea adjuntar el archivo guardado a un correo electrónico (es este posible exportar directamente un resultado de consulta SQL a un correo electrónico). Por favor ayuda.exportar resultado de la consulta SQL a un csv o sobresalir

+0

Esto es exactamente lo que está buscando: https://www.youtube.com/watch?v=hlY_PoJhlMk (https://mvnrepository.com/ artefact/net.sf.automatic-report-generator) –

Respuesta

2

Aquí se muestra un ejemplo:

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í!

Puede conectarse a los diferentes tipos de bases de datos usando JDBC y luego crear un archivo de Excel con los resultados (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

Esta es una manera muy hábil de manejarlo si se encuentra en un entorno Windows. También es relativamente "portátil", ya que la misma idea funciona con cualquier idioma. La alternativa de Apache tampoco es una mala idea. –

+0

El ejemplo muestra cómo leer desde una hoja de cálculo Excel, no cómo crear una. – datguy

0

para que esto funcione es necesario trabajar escribir un pequeño código que puede absorber cualquier consulta y cualquier controlador. La primera entrada debe ser el nombre del controlador como la entrada al software que está escribiendo. Entonces, el software que está escribiendo debe estar en condiciones de ejecutar cualquier SQL que se le haya otorgado y dar solo filas y columnas.

La siguiente tarea viene a analizar el conjunto de resultados que viene del JDBC de aplicación Java. O desea escribir los resultados en un archivo CSV o EXCEL se basa en qué tan bueno es el API de Java para hacer eso.

Escribir el resultado en el CVS es fácil y no es trivial. No he trabajado en exportar los datos a Excel. Estoy seguro de que encontrarás frascos para eso.

1

Esta es mi solución. Código para insertar en la clase principal:

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 clase principal:

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



     } 


    } 
} 

Este es el dbconn clase para la conexión a la base de datos

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


} 

Esta es la clase de datos recupera de la tabla de resultados búsqueda y escribe en el archivo 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 el uso de la API openCSV, puede exportar los datos en el archivo 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

Esta es la hoja de datos Excel

input excel file containing records Hola esta es la solución que necesita 3 archivos 1.Input hilo estructura 3.data hilo de rosca 2.Output 4.Main 1.Input a leer el excel y el hilo de salida para escribir el sql out put 2.data estructura es para mantener y transferir los datos

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

// Esta clase representa la estructura de datos para mantener y transformar la entrada // datos como una lista vinculada de sentencias 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

solución más simple.

principal método

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

El código siguiente cuenta el número de columnas en una tabla, y almacenar en una matriz resultado.

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

    } 
Cuestiones relacionadas