将sql查询结果导出到csv或excel

我想写一个sql查询的结果到一个CSV或Excel文件,并将其保存在一个特定的文件夹。我想知道这是否可以实现使用一个Java程序,可以重用任何SQL查询结果。我会也想知道这是否可以用于不同types的数据库(甲骨文,MySQL,MS SQL服务器等)。我打算把保存的文件附加到一个电子邮件(这是可能的直接导出一个SQL查询结果到一个电子邮件)。请帮忙。

通过使用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(); 

这里是一个例子:

 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) { } } } 

参考

最简单的解决scheme

主要方法

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

是!

您可以使用jdbc连接到不同的数据库types,然后使用结果创build一个Excel(请参阅此处 )。

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

这是我的解决scheme。 在主类中插入的代码:

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

这是用于从表格中检索数据到结果集并写入到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(); } } } } 

这是excel数据表

inputexcel文件包含logging嗨,这是你需要的解决scheme3文件1.input线程2.输出线程3.数据结构4.main 1.input线程读取excel和输出线程写入SQL输出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)

//这个类表示数据结构来保存和转换input//数据作为sql语句的链表

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

输出结果

为了这个工作,你需要写一个小代码,可以接受任何查询和任何驱动程序。 第一个input应该是作为您正在编写的软件的input的驱动程序名称。 那么你正在编写的软件应该能够执行给它的任何SQL,并且只发出行和列。

接下来的任务是parsing来自java应用程序的JDBC的ResultSet。 要么你想把结果写入CSV文件,要么EXCEL是基于你有多好的Java API来做到这一点。

将输出写入CVS很容易,而不是繁琐。 我还没有将数据导出到Excel中。 我相信你find那个jar子。