2011-12-19 8 views
8

Chcę napisać wynik kwerendy sql do pliku csv lub excel i zapisz go w określonym folderze.Chciałbym wiedzieć, czy można to osiągnąć za pomocą programu java które mogą być ponownie użyte dla dowolnego wyniku zapytania sql. Chciałbym również wiedzieć, czy można go użyć do różnych typów baz danych (Oracle, mysql, MS sql server itp.) .Planuję dołączyć zapisany plik do e-maila (czy to możliwe bezpośrednie eksportowanie wyniku kwerendy sql do e-maila) .Proszę o pomoc.eksportowanie wyniku kwerendy sql do csv lub excel

+0

To jest dokładnie to, czego szukasz: https://www.youtube.com/watch?v=hlY_PoJhlMk (https://mvnrepository.com/ artefact/net.sf.automatic-report-generator) –

Odpowiedz

2

Oto przykład:

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

Tak!

Można łączyć się z różnymi typami baz danych za pomocą jdbc, a następnie utworzyć Excel z wynikami (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

To naprawdę dobry sposób na obsługę, jeśli jesteś w środowisku Windows. Ponadto jest względnie "przenośny", ponieważ ten sam pomysł działa z dowolnym językiem. Alternatywa Apache też nie jest złym pomysłem. –

+0

Przykład pokazuje, jak czytać z arkusza kalkulacyjnego programu Excel, a nie jak go utworzyć. – datguy

0

Aby to działało, musisz napisać mały kod, który może zająć się dowolnymi zapytaniami i dowolnym sterownikiem. Pierwszym sygnałem wejściowym powinna być nazwa sterownika jako dane wejściowe do oprogramowania, które piszesz. Wtedy program, który piszesz, powinien być w stanie wykonać każdy podany mu SQL i podać tylko wiersze i kolumny.

Następnym zadaniem jest przeanalizowanie ResultSet, który pochodzi z JDBC aplikacji java. Albo chcesz zapisać wyniki w pliku CSV, albo EXCEL zależy od tego, jak dobrze masz to aplety java.

Zapisywanie wyników w CVS jest łatwe, a nie trival. Nie pracowałem nad eksportem danych do Excela. Jestem pewien, że znajdziesz na to słoiki.

1

To jest moje rozwiązanie. Kod do wstawienia w głównej klasie:

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

Klasa bazowa:

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



     } 


    } 
} 

Jest to klasa DBConn do połączenia z bazą danych

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


} 

Jest to klasa dla pobiera dane z tabeli do wynikowego i zapisuje do pliku 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

Dzięki wykorzystaniu openCSV API, można wyeksportować dane w pliku 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

Jest to KARTA EXCEL

input excel file containing records Cześć jest to rozwiązanie trzeba 3 pliki 1.input wątek struktura nici 2.output 3.data 4.main wątek 1.input czytać wątek excel i output do zapisu sql out put 2. struktura danych ma przechowywać i przekazywać dane

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

// Klasa przedstawia strukturę danych do przechowywania i przekształcania danych wejściowych // dane jako połączoną listę instrukcji 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

Najprostszym rozwiązaniem.

Metoda Main

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

Kod poniżej policzyć liczbę kolumn w tabeli, i przechowywać w tablicy wynikowej.

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

    } 
Powiązane problemy