prosource

SQL 쿼리 결과를 csv 또는 Excel로 내보내는 중

probook 2023. 6. 27. 22:23
반응형

SQL 쿼리 결과를 csv 또는 Excel로 내보내는 중

SQL 쿼리 결과를 csv나 excel 파일에 작성하여 특정 폴더에 저장하고 싶습니다.다음과 같은 요청이 있습니다.

  1. SQL 쿼리 결과에 재사용할 수 있는 Java 프로그램을 사용하여 이를 달성할 수 있는지 알고 싶습니다.
  2. 다른 데이터베이스(Oracle, MySQL, SQL Server 등)에 사용할 수 있는지도 알고 싶습니다.
  3. 저는 저장된 파일을 이메일에 첨부할 계획입니다.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();

가장 간단한 해결책.

주 방법

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

 }

데이터베이스에서 데이터 가져오기

아래 코드는 테이블의 열 수를 계산하고 결과 배열에 저장합니다.

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

        }

Csv로 인쇄

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

    }

어떤 도구에서도 결과 집합 데이터를 내보내는 것은 어렵습니다.

ex: 결과 집합 데이터를 .csv 파일로 내보내는 동안 데이터에 포함된(,) 경우 제대로 내보내지 않습니다.

아래 Java 코드를 참조하십시오.

모든 쿼리 입력 및 결과 집합의 모든 유형의 데이터와 완벽하게 작동합니다.

package com.demo.export;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class dataExportService {
    public void getDefendants(Connection con , String db) throws Exception  { 
        @SuppressWarnings("unused")
        Workbook readWorkbook = WorkbookFactory.create(new FileInputStream(".xls file path(C:\\Users\\CEPL\\Desktop\\test.xls)") );
        @SuppressWarnings("resource")
        Workbook writeWorkbook = new HSSFWorkbook();
        Sheet desSheet = writeWorkbook.createSheet("new sheet");

        Statement stmt = null;
        ResultSet rs = null;
        try{
            String query ="QUERY";

            stmt = con.createStatement();
            rs = stmt.executeQuery(query);
            ResultSetMetaData rsmd = rs.getMetaData();
            int columnsNumber = rsmd.getColumnCount();

            Row desRow1 = desSheet.createRow(0);
            for(int col=0 ;col < columnsNumber;col++) {
                Cell newpath = desRow1.createCell(col);
                newpath.setCellValue(rsmd.getColumnLabel(col+1));
            }
            while(rs.next()) {
                System.out.println("Row number" + rs.getRow() );
                Row desRow = desSheet.createRow(rs.getRow());
                for(int col=0 ;col < columnsNumber;col++) {
                    Cell newpath = desRow.createCell(col);
                    newpath.setCellValue(rs.getString(col+1));  
                }
                FileOutputStream fileOut = new FileOutputStream(".xls file path(C:\\Users\\CEPL\\Desktop\\test.xls)");
                writeWorkbook.write(fileOut);
                fileOut.close();
            }
        }
        catch (SQLException e) {
            System.out.println("Failed to get data from database");
        }
    }

}

다음은 예입니다.

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

언급

이게 제 해결책입니다.기본 클래스에 삽입할 코드:

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 column=   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, column, 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 columnName;
    public String charSep;

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

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

                // WRITE COLUMN NAME
            ResultSetMetaData rsmd = rset.getMetaData();
            cname = new FileWriter(filename);
            if (columnName) {
                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();
            }
        }
    }
}

이것은 엑셀 데이터 시트입니다.

레코드를 포함하는 입력 엑셀 파일 안녕하세요 이것은 당신이 필요로 하는 3개의 파일 1. 입력 스레드 2. 출력 스레드 3. 데이터 구조 4. 엑셀을 읽기 위한 입력 스레드와 sql 출력을 쓰기 위한 출력 스레드 2. 데이터 구조는 데이터를 보유하고 전송하는 것입니다.

(입력 스레드.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;
        }
    }*/


}

(출력 스레드.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);
         }
    }
}

(메인.자바)

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

출력 결과

JDBC를 사용하여 Java의 DB에서 레코드를 가져온 다음 Apache POI를 사용하여 데이터를 CSV/Excel로 내보낼 수 있습니다.

또한 Java의 Desktop API를 사용하여 기본 전자 메일 클라이언트를 사용하여 전자 메일을 보낼 수 있습니다.

이 작업을 수행하려면 모든 쿼리와 드라이버를 처리할 수 있는 작은 코드를 작성해야 합니다.첫 번째 입력은 작성 중인 소프트웨어에 대한 입력으로 드라이버 이름이어야 합니다.그런 다음 작성 중인 소프트웨어는 주어진 SQL을 실행하고 행과 열만 제공할 수 있는 위치에 있어야 합니다.

다음 작업은 Java 응용 프로그램의 JDBC에서 가져온 ResultSet을 구문 분석하는 작업입니다.결과를 CSV 파일에 쓰거나 EXCEL은 Java API를 얼마나 잘 사용하는지에 따라 달라집니다.

출력을 CVS에 기록하는 것은 쉽고 간단한 작업이 아닙니다.나는 엑셀로 데이터를 내보내는 일을 하지 않았습니다.나는 당신이 그것을 위한 항아리를 찾을 것이라고 확신합니다.

솔루션은 속성 파일을 기반으로 합니다.

이 옵션이 구성된 위치:

  • 데이터베이스의 매개 변수입니다.
  • 선택적 추가 SQL Where 절입니다.
  • 출력 파일의 매개 변수입니다.

프로세스는 bis 4 스레드를 시작하여 4개의 테이블을 동시에 다운로드할 수 있습니다.다시 실행하려면 생성된 파일을 삭제해야 합니다.프로세스 데이터가 포함된 텍스트 파일(logs.txt)도 생성됩니다.

PROP 파일: ExportProperties.prop --------- 솔루션은 다음 위치에 구성 초안 버전을 작성합니다.

C:\tmp\test\속성을 내보냅니다.버팀목

## configuration properties
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@ldap://localhost
username=user
password=pass
fileExtension=_20200623.csv
columSeparator=;
charsetName=CP1252
## export only 10 rows change to false
only10Rows=true
##tables
tableName.1=USER
tableName.1.sqlWhere= user.name IS NOT NULL
tableName.2=ROLL
tableName.3=FIRMA

주 파일 ----------

public class ExportTable2CSVMain implements Runnable {
    static SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss SSS|");
    static final String folder = "C:\\tmp\\test\\";
    static final Properties prop = getProperties();

    public static void main(String[] args) {
        for (int x = 1; x < 6; x++) {
            try {
                writieLog(0, "Start thread " + x);
                new ExportTable2CSVMain();
                Thread.sleep(1000);
            } catch (final Exception e) {
                e.printStackTrace();
            }
        }
    }

    public ExportTable2CSVMain() {
        final Thread t = new Thread(this);
        t.start(); // start the thread -> run
    }

    @Override
    public void run() {
        int pos = 1;
        String tableName = prop.getProperty("tableName." + pos);
        while (tableName != null) {
            try {
                export(tableName, pos++);
            } catch (final Exception e) {
                e.printStackTrace();
            }
            tableName = prop.getProperty("tableName." + pos);
        }
    }

    private void export(String tableName, int filePos) throws Exception {
        final boolean only10Rows = prop.getProperty("only10Rows", "false").equals("true");
        String extraWhere = prop.getProperty("tableName."+filePos+".sqlWhere");
        if(extraWhere ==null)
            extraWhere = prop.getProperty("sqlWhere");
        if(extraWhere ==null)
            extraWhere = "";
        final String sql = "select * from " + tableName + extraWhere
                + (only10Rows ? " FETCH NEXT 10 ROWS ONLY" : "");
        final String fileName = folder + tableName + prop.getProperty("fileExtension");
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        ExportTable2CSV data2csv = null;
        try {
            data2csv = new ExportTable2CSV(fileName, tableName, filePos);
            if (data2csv.toDo()) {
                conn = getConnection();
                stmt = conn.createStatement();
                rs = stmt.executeQuery(sql);
                data2csv.createFileCsv(rs);
            }
        } catch (final Exception e) {
            final int row = data2csv == null ? -1 : data2csv.row;
            writieLog(filePos, "SQL", "Error", "rows:" + row, tableName, e.getMessage());
            e.printStackTrace();
        } finally {
            try {
                rs.close();
            } catch (final Exception e) {
            }
            try {
                stmt.close();
            } catch (final Exception e) {
            }
            try {
                conn.close();
            } catch (final Exception e) {
            }
        }
    }

    public Connection getConnection() throws Exception {
        Class.forName(prop.getProperty("driver"));
        return DriverManager.getConnection(//
                prop.getProperty("url"),
                prop.getProperty("username"),
                prop.getProperty("password"));
    }

    static private Properties getProperties() {
        File file = new File(folder);
        if (!file.exists()) { // if the folder do not exist create it 
            file.mkdirs();
        }
        file = new File(folder + "ExportProperties.prop");
        if (!file.exists()) {
            try {
                final PrintWriter out = new PrintWriter(
                        new BufferedWriter(new FileWriter(folder + "ExportProperties.prop", true)));

                out.println(//
                        "## configuration properties\n" +
                                "driver=oracle.jdbc.driver.OracleDriver\n" +
                                "url=jdbc:oracle:thin:@ldap://localhost\n"+
                                "username=USER\n" +
                                "password=PASSWORD\n" +
                                "sqlWhere=\n" +
                                "fileExtension=_20200619.csv\n" +
                                "columSeparator=;\n" +
                                "charsetName=CP1252\n" +
                                "##tables\n" +
                                "tableName.1=USER\n" + //
                                "tableName.2=ROLL\n" 
                );
                out.close();
            } catch (final Exception e) {
                e.printStackTrace();
            }
        }
        final Properties prop = new Properties();
        try {
            prop.load(new FileInputStream(folder + "ExportProperties.prop"));
        } catch (final IOException e) {
            e.printStackTrace();
        }
        return prop;
    }

    public static void writieLog(int filePos, String... txt) throws Exception {
        final PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(folder + "logs.txt", true)));
        String sb = "";
        sb += formatter.format(new Date()) + "\t";
        sb += filePos == 0 ? "" : "F-" + filePos + "\t";
        for (final String s : txt) {
            sb += s + "\t";
        }
        System.out.println(sb);
        out.println(sb);
        out.close();
    }
}

ExportTable2CSV 파일 -------

/**
 * Created by Jose Manuel Davila (Mel) kailas.mel@gmail.com
 */
public class ExportTable2CSV {
    final String fileName;
    final String table;
    final String columSeparator;
    final Boolean columnName = true;
    final int filePos;
    int row = 0;
    int column = 0;

    public ExportTable2CSV(String fileName, String table, int filePos) {
        this.filePos = filePos;
        this.fileName = fileName;
        this.table = table;
        columSeparator = ExportTable2CSVMain.prop.getProperty("columSeparator", ";");
    }

    public boolean toDo() throws Exception {
        if (new File(fileName).exists()) {// the file exist jet return
            return false;
        }
        writeLine("");
        return true;
    }

    public void createFileCsv(ResultSet rs) throws Exception {
        String sb = "";
        try {
            ExportTable2CSVMain.writieLog(filePos, "FILE", "INI ", table, fileName);
            // WRITE COLUMN NAME
            final ResultSetMetaData rsmd = rs.getMetaData();
            sb = "";
            final List<String> list = new ArrayList<String>();
            if (columnName) {
                for (int i = 1; i <= rsmd.getColumnCount(); i++) {
                    sb += rsmd.getColumnName(i) + columSeparator;
                    list.add(rsmd.getColumnName(i));
                }
                writeLine(sb.toString());
            }
            // WRITE DATA
            while (rs.next()) {
                sb = "";
                column = 0;
                for (int i = 1; i <= rsmd.getColumnCount(); i++) {
                    final Object obj = rs.getObject(i);
                    String data = "";
                    if (obj != null) {
                        if (obj instanceof String) {
                            data = obj.toString();
                            if (data.indexOf(columSeparator) != -1) {
                                if (data.indexOf("\"") != -1) {
                                    data = data.replaceAll("\"", "'");
                                    ExportTable2CSVMain.writieLog(filePos, "FILE", "WITH comm and ; ", "row:" + row,
                                            "Column:" + list.get(column), table, fileName);
                                }
                                data = "\"" + data + "\"";
                            }
                        } else {
                            data = obj.toString();
                        }
                    }
                    sb += data + columSeparator;
                    column++;
                }
                writeLine(sb.toString());
                row++;
            }
            ExportTable2CSVMain.writieLog(filePos, "FILE", "END ", "rows:" + row, table, fileName);
        } catch (final Exception e) {
            ExportTable2CSVMain.writieLog(filePos, "FILE", "Error ", "rows:" + row, table, fileName, e.getMessage());
            e.printStackTrace();
        } finally {
            if (rs != null) {
                rs.close();
            }
        }
    }

    void writeLine(String line) throws Exception {
        if (row > 0 && row % 1000 == 0) {
            System.out.println(filePos + " " + row + " working ...");
        }
        final PrintWriter cname = new PrintWriter(new BufferedWriter((new OutputStreamWriter(
                new FileOutputStream(fileName, true), ExportTable2CSVMain.prop.getProperty("charsetName", "CP1252")))));
        if (line.equals("")) {
            cname.print(line);
        } else {
            cname.println(line);
        }
        cname.close();
    }
}

POM 파일 pom.xml -------------

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>ExportTable2CSV</groupId>
  <artifactId>ExportTable2CSV</artifactId>
  <version>1.1.0</version>
  <name>ExportTable2CSV</name>
  <properties>
        <ojdbc8.version>18.3.0.0.0</ojdbc8.version>
  </properties>

  <dependencies>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>${ojdbc8.version}</version>
            <scope>runtime</scope>
        </dependency>
  </dependencies>
</project>

탭으로 구분된 열로 내보냅니다.

속성 파일에서 이 속성을 변경합니다.

fileExtension=_mel.txt
columSeparator=\t

이것은 완벽하게 잘 작동합니다.

PreparedStatement statement = famuat.prepareStatement(sql query);
ResultSet result = statement.executeQuery();
ResultSetMetaData md = result.getMetaData();

FileWriter fw = new FileWriter(filepath);
int columnCount = md.getColumnCount();

for (int i = 1; i <= columnCount; i++) {
    columnheader = md.getColumnName(i);
   // System.out.println(columnheader);
    if (i > 1) System.out.print(" | ");
    if (i > 1) System.out.print(",  ");
    if (i > 1) System.out.print("\t");

    fw.append(columnheader.toUpperCase());
    fw.append(",");

    System.out.println(columnheader);
}

while (result.next()) {
    fw.append("\r\n");
    for (int i = 1; i <= columnCount; i++) {
        if (i > 1) System.out.print(" | ");
        if (i > 1) System.out.print(",  ");
        if (i > 1) System.out.print("\t");

        fw.append(result.getString(i));
        fw.append(",");
        row = result.getString(i);
        System.out.println(row);
    }
}

csv와 txt로 내보내기 위한 이 작업

public void ExportTxt(){
        FileWriter texto = null;
        ResultSet rs2 = null;
        ResultSet rs = null;
        try {
            texto = new FileWriter("texto.txt");
            PrintWriter pw = new PrintWriter(texto);
            Statement consulta = conn.createStatement();
            Statement consulta2 = conn.createStatement();
            String query = "SELECT * FROM coches";
            rs = consulta.executeQuery(query);
            int i=1;
            pw.println("----------------");
            while (rs.next()) {
                pw.println(i + ",Coche: Matricula:" + rs.getString("matricula") + ", Marca:" + rs.getString("marca") + ", Modelo:" + rs.getString("modelo"));
                String query2 = "SELECT * FROM reparaciones WHERE coche = '" + rs.getString("matricula") + "'";
                rs2 = consulta2.executeQuery(query2);
                pw.println("----------------");
                while(rs2.next()){
                    pw.println(rs2.getRow() + ",Reparacion: Fecha entrada:" + rs2.getString("fecha_entrada") + ", Fecha salida:" + rs2.getString("fecha_salida"));                
                }
                i++;
            }
            rs.close();
            rs2.close();
            consulta.close();
        } catch (IOException ex) {
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                texto.close();
            } catch (IOException ex) {
                Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    public void ExportCSV(){
        PrintWriter pw = null;
        try {
            File archivo = new File("excel.csv");
            pw = new PrintWriter((new FileWriter(archivo)));
            Statement consulta = conn.createStatement();
            String query = "SELECT * FROM clientes";
            ResultSet rs = consulta.executeQuery(query);
            pw.println("id;nombre;apellidos;direccion;nif;telefono");
            while(rs.next()){
                pw.println(rs.getInt("id") + ";" + rs.getString("nombre") + ";" + rs.getString("Apellidos") + ";" + rs.getString("direccion") + ";" + rs.getString("nif") + ";" + rs.getString("telefono"));
            }
        } catch (IOException ex) {
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            pw.close();
        }
    }

몇 가지 다른 답변을 시도했지만 제대로 작동하지 않거나 라이브러리를 추가하도록 요청하지 않았습니다. 특히 CSV와 같은 단순한 형식의 경우는 피하고 싶습니다.

자, 이것이 제가 할 일입니다.SQL 드라이버를 제외한 특별한 라이브러리 요구 사항이 없으므로 바닐라 Java 8 이상이 작동해야 합니다.또한 빈셸과 함께 작동합니다(따라서 리소스로 시도하는 것이 아니라 최종적으로 시도합니다).내가 만든(게시한) Junit 테스트가 올바르다고 가정하면 모든 필드가 올바르게 이스케이프되어야 하며, 따라서 모든 RFC 4180 호환 CSV 리더는 오류 없이 구문 분석하거나 잘못 이해할 수 있어야 하며, 이 코드의 목적에는 Microsoft Excel이 포함됩니다.

import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.Statement;
import java.util.List;
import java.util.ArrayList;
import java.io.FileWriter;
// Replace this with your own SQLServerDriver class
import com.microsoft.sqlserver.jdbc.SQLServerDriver;

public class Sandbox {

  /**
   * Replaces null with an empty string, surrounds values that have commas or
   * newlines with quotes, and if a value begins with a quote it escapes any
   * quotes with another quote
   *
   * @param value
   * @return
   */
  public String csvEscape(String value) {
    if (value == null) {
      value = "";
    } else if (value.contains(",") || value.contains("\n") || value.startsWith("\"")) {
        value = "\"" + value.replace("\"", "\"\"") + "\"";
    }
    return value;
  }

  /**
   * Run an SQL query and dump the output into a CSV file as we receive it
   *
   * @param url       URL to your server in a format that the driver expects, i.e.
   *                  "jdbc:sqlserver://server.com:1433;IntegratedSecurity=true;databaseName=foo"
   * @param statement SQL statement, i.e. "SELECT foo FROM bar". Do NOT pass user
   *                  generated strings!
   * @param csvPath   File path to the csv file, i.e. /foo/bar.csv
   * @throws SQLException
   * @throws IOException
   */
  public void sqlToCsv(String url, String statement, String csvPath) throws SQLException, IOException {
    Connection connection = DriverManager.getConnection(url);
    Driver driverSelect = new SQLServerDriver();
    DriverManager.registerDriver(driverSelect);

    Statement stmt = connection.createStatement();
    ResultSet rs = stmt.executeQuery(statement);
    ResultSetMetaData md = rs.getMetaData();
    int colCount = md.getColumnCount();
    List<String> cols = new ArrayList<String>();

    for (int i = 1; i <= colCount; i++) {
      String value = csvEscape(md.getColumnName(i));
      cols.add(value);
    }

    List<String> row = new ArrayList<String>();

    FileWriter fileWriter = null;
    try {
      fileWriter = new FileWriter(csvPath, false);
      fileWriter.write(String.join(",", cols) + "\n");
      while (rs.next()) {
        row.clear();
        for (int i = 1; i <= colCount; i++) {
          String value = csvEscape(rs.getString(i));
          row.add(value);
        }
        fileWriter.write(String.join(",", row) + "\n");
      }
    } finally {
      fileWriter.close();
    }

  }

  @Test
  public void testCsvEscape() {
    assertEquals("say \"cheese!\"", csvEscape("say \"cheese!\""));
    assertEquals("\"\"\"say cheese\"\"!\"", csvEscape("\"say cheese\"!"));
    assertEquals("\"cheese\nplease\"", csvEscape("cheese\nplease"));
    assertEquals("\"cheese, please\"", csvEscape("cheese, please"));
    assertEquals("\"say \"\"cheese,\n please!\"\"\"", csvEscape("say \"cheese,\n please!\""));
    assertEquals("\"\"\"say \"\"cheese,\n please!\"\"\"\"\"", csvEscape("\"say \"cheese,\n please!\"\""));
  }
}

네!

jdbc를 사용하여 다양한 데이터베이스 유형에 연결한 다음 결과를 사용하여 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();
      }
    }
  }
}

언급URL : https://stackoverflow.com/questions/8563376/exporting-sql-query-result-to-csv-or-excel

반응형