Необходимо получить данные из базы данных и сохранить их в Excel, используя Java - PullRequest
0 голосов
/ 26 июня 2019

Я должен экспортировать данные из базы данных в таблицу Excel с помощью java. У меня есть около 500+ столбцов в БД, поэтому мне нужна помощь в коде, где мне не нужно указывать имя столбца.Я получил некоторый код из интернета, но он специфичен для конкретного имени столбца, если я буду реализовывать таким образом, будет много ручной работы. Есть предложения по коду?

      import  java.io.*;  
import  java.sql.*;
import  org.apache.poi.hssf.usermodel.HSSFSheet;  
import  org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import  org.apache.poi.hssf.usermodel.HSSFRow;
import  org.apache.poi.hssf.usermodel.HSSFCell;  

public class DatabaseTesting{
    public static void main(String[]args){
try{
String filename="c:/data.xls" ;
HSSFWorkbook hwb=new HSSFWorkbook();
HSSFSheet sheet =  hwb.createSheet("new sheet");

//HSSFRow rowhead=   sheet.createRow((short)0);


Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
Statement st=con.createStatement();
ResultSet rs=st.executeQuery("Select * from employee");

XSSFRow row = spreadsheet.createRow(1);
XSSFCell cell;
// use ResultSetMetaData to fetch the column names
ResultSetMetaData rsmd = resultSet.getMetaData();
int columnCount = rsmd.getColumnCount();
for (int c=1; c <= columnCount; ++c) {
    String name = rsmd.getColumnName(c);
    cell = row.createCell(c);
    cell.setCellValue(name);
}

int i = 2;

while (resultSet.next()) {
    row = spreadsheet.createRow(i);
    for (int c=1; c <= columnCount; ++c) {
        cell = row.createCell(c);
        cell.setCellValue(resultSet.getObject(C));
    }
}

System.out.println("Your excel file has been generated!");

} catch ( Exception ex ) {
    System.out.println(ex);

}
    }
}

1 Ответ

0 голосов
/ 26 июня 2019

Класс ResultSet предоставляет геттеры, которые принимают индекс столбца (начиная с позиции 1), в дополнение к именованным геттерам, с которыми мы знакомы. Вы можете воспользоваться этим здесь:

XSSFRow row = spreadsheet.createRow(1);
XSSFCell cell;
// use ResultSetMetaData to fetch the column names
ResultSetMetaData rsmd = resultSet.getMetaData();
int columnCount = rsmd.getColumnCount();
for (int c=1; c <= columnCount; ++c) {
    String name = rsmd.getColumnName(c);
    cell = row.createCell(c);
    cell.setCellValue(name);
}

int i = 2;

while (resultSet.next()) {
    row = spreadsheet.createRow(i);
    for (int c=1; c <= columnCount; ++c) {
        cell = row.createCell(c);
        cell.setCellValue(resultSet.getObject(c));
    }
}

Примечания:

Если вы посмотрите на вызов XSSFCell#setCellValue(), вы увидите, что я использую ResultSet#getObject для получения значения. Причина этого в том, что мы априори не знаем, каким будет тип столбца в столбце базы данных. Я предполагаю, что setCellValue может принять Object в качестве ввода. Если нет, то вам придется использовать какую-то альтернативу, например, используя ResultSet#getString() везде.

...