2011-12-19 379 views
8

我想將sql查詢的結果寫入csv或excel文件並將其保存在特定的文件夾中。我想知道是否可以使用java程序來實現它可以重用任何SQL查詢結果。我也想知道這是否可以用於不同類型的數據庫(甲骨文,MySQL,MS SQL服務器等)。我打算將保存的文件附加到電子郵件(這是可能直接將sql查詢結果導出到電子郵件)。請幫助。將sql查詢結果導出到csv或excel

+0

這正是你要尋找的:https://www.youtube.com/watch?v=hlY_PoJhlMk(https://mvnrepository.com/ artifact/net.sf.automatic-report-generator) – 2016-09-15 20:26:29

回答

2

下面是一個例子:

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

是的!

您可以使用jdbc連接到不同的數據庫類型,然後使用結果創建Excel(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

如果您處於Windows環境中,這是一種非常流暢的方式來處理它。它也相對「便攜」,因爲相同的想法適用於任何語言。 Apache的選擇也不是一個壞主意。 – 2011-12-19 15:37:45

+0

該示例顯示如何從Excel電子表格中讀取數據,而不是如何創建數據表格。 – datguy 2014-01-23 17:37:11

0

爲了這個工作,你需要編寫一個小代碼,可以接受任何查詢和任何驅動程序。第一個輸入應該是驅動程序名稱,作爲您正在編寫的軟件的輸入。然後,你正在編寫的軟件應該能夠執行任何給予它的SQL,並只發出行和列。

下一個任務是解析來自java應用程序的JDBC的ResultSet。要麼將結果寫入CSV文件中,要麼EXCEL基於您擁有java api的能力。

將輸出寫入CVS很容易,而不是繁瑣。我沒有將數據導出到Excel中。我相信你會爲此找到罐子。

1

這是我的解決方案。 代碼在主類中插入:

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

核心類:

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



     } 


    } 
} 

這是類DBConn用於連接到數據庫

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


} 

這是從表中檢索數據的ResultSet類和寫入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

利用openCSV API,你可以在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

這是Excel數據表

input excel file containing records 你好,這是你需要3個文件的解決方案1,輸入線2.輸出線3.data結構4.主要 1,輸入線程讀取excel和輸出線程把sql寫出來put 2.數據結構是保存和傳輸數據

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

//此類表示該數據結構保存並轉換輸入 //數據作爲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

最簡單的解決方案。

主要方法

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

下面的代碼計數的列在表中的結果陣列的數量,並存儲。

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

    }