【问题标题】:Exporting Resultset from Java database to Excel using Apache Poi使用 Apache Poi 将结果集从 Java 数据库导出到 Excel
【发布时间】:2014-07-24 12:35:44
【问题描述】:

帮助我坚持这个从结果集导出到 excel 的项目。.这里以前的解决方案没有回答我的问题,但他们有帮助..这是我的代码到目前为止它只在数据库中显示一行。 我的代码

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;


public class Plexada2 {


        public static void main(String[] args) {
        try {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
         Connection conn = DriverManager.getConnection("jdbc:odbc:Storeway","root", "");
         Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
         ResultSet rs = st.executeQuery("Select * from Storeway.order");

         HSSFWorkbook workbook = new HSSFWorkbook();
         HSSFSheet sheet = workbook.createSheet("lawix10");


         Row row = sheet.createRow(0);
         int x=0;
         while (rs.next()){
         String crate_id=  rs.getString(2);
         String content=rs.getString(3);
         String Order_type=  rs.getString(4);
         java.sql.Date date= rs.getDate(5);
         String datex= String.valueOf(date);

         row.createCell(0).setCellValue(crate_id);
         row.createCell(1).setCellValue(content);
         row.createCell(2).setCellValue(Order_type);
         row.createCell(3).setCellValue(datex); 

                }
         x+=1;  



        String yemi = "C:\\Users\\lawix10\\Desktop\\testlno9.xls";
        FileOutputStream fileOut;
        try {
             fileOut = new FileOutputStream(yemi);
             workbook.write(fileOut);
             fileOut.close();
                }

【问题讨论】:

  • 每次迭代 ResultSet 对象后,您在哪里创建新行?更好的是,您在第 0 行创建标题并开始在 while 循环中创建行,使用 x 进行迭代
  • 您在 excel 表中看到了什么,您可以使用 java 程序访问该位置吗?
  • 你能分享一下你在 excel 表中得到了什么吗?另外,如果可能,请正确格式化上述代码。
  • 我只能从 excel 的数据库中看到一行
  • 有点晚了,但是看看 MemPOI 的未来github.com/firegloves/MemPOI

标签: java apache-poi resultset


【解决方案1】:

我建议另一种解决方案,利用MemPOI lib。 看看:

public class Plexada2 {

    public static void main(String[] args) {
        try {
           Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
           Connection conn = DriverManager.getConnection("jdbc:odbc:Storeway","root", "");
           PreparedStatement prepStmt = conn.prepareStatement("Select * from Storeway.order");

           File fileDest = new File("C:\\Users\\lawix10\\Desktop\\testlno9.xls");

           new MempoiBuilder()
                .setFile(fileDest)
                .addMempoiSheet(new MempoiSheet(prepStmt))
                .build()
                .prepareMempoiReportToFile()
                .get();
         } catch (Exception e) {
            // TODO manage exception
         }
    }
}

【讨论】:

  • 嗨@firegloves,大数据量好吗?将存储过程结果转换为 excel?
  • @AskWarvin 是的,它用于处理大量数据:出于这个原因,它不使用任何 ORM。我没有尝试使用存储过程,但概念是您必须创建查询,然后将 PreparedStatement 传递给库,因此 DBMS 返回到 ResultSet 的任何内容都可用于 MemPOI。
【解决方案2】:

啊,在您发布代码之前尝试对其进行格式化非常难以检查您的代码,关于您的查询,请尝试这样的操作。

try {
    Class.forName("driverName");
    Connection con = DriverManager.getConnection("url", "user", "pass");
    Statement st = con.createStatement();
    ResultSet rs = st.executeQuery("Select * from tablename");
    HSSFWorkbook workbook = new HSSFWorkbook();
    HSSFSheet sheet = workbook.createSheet("lawix10");
    HSSFRow rowhead = sheet.createRow((short) 0);
    rowhead.createCell((short) 0).setCellValue("CellHeadName1");
    rowhead.createCell((short) 1).setCellValue("CellHeadName2");
    rowhead.createCell((short) 2).setCellValue("CellHeadName3");
    int i = 1;
    while (rs.next()){
        HSSFRow row = sheet.createRow((short) i);
        row.createCell((short) 0).setCellValue(Integer.toString(rs.getInt("column1")));
        row.createCell((short) 1).setCellValue(rs.getString("column2"));
        row.createCell((short) 2).setCellValue(rs.getString("column3"));
        i++;
    }
    String yemi = "g:/test.xls";
    FileOutputStream fileOut = new FileOutputStream(yemi);
    workbook.write(fileOut);
    fileOut.close();
    } catch (ClassNotFoundException e1) {
       e1.printStackTrace();
    } catch (SQLException e1) {
        e1.printStackTrace();
    } catch (FileNotFoundException e1) {
        e1.printStackTrace();
    } catch (IOException e1) {
        e1.printStackTrace();
    }

【讨论】:

  • 非常感谢大家,这是我第一次发问题,所以格式不习惯。谢谢
  • 天哪,它工作得很好......谢谢 M.sharma,你真的是一个天才......不介意有你的联系人......请你能解释一下代码中的 short 作用
  • 这是基本的兄弟,只需阅读 poi 文档并了解代码中使用的类和方法,顺便说一句,如果你得到问题的答案,你可以通过在右边打勾来接受它作为你的答案ans附近的符号。
  • 像魅力一样工作,请添加workbookclose()。
【解决方案3】:

我们可以让 for 循环在 getString() 中输入动态值吗?我试过了,但我无法获取准确的结果。

我的代码: 公共静态无效 excel(字符串 appDB) { List headerValues=new ArrayList();

    XSSFWorkbook workbook = new XSSFWorkbook();
    try {
    setConnection(appDB);

    String queryName="SELECT * FROM ALL_TABLES where table_name='table_name'";

    Reporter.addStepLog("----------------------------------- " + queryName.toUpperCase()
            + "\n - Validation Start" + " -----------------------------------");
    ps = con.prepareStatement(queryName, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
    rs = ps.executeQuery();

    Statement statement = con.createStatement();
    XSSFSheet spreadsheet = workbook.createSheet("employedb");
      ResultSet resultSet = statement.executeQuery("select * from all_tab_columns where table_name='table_name'"); 
      XSSFRow row = spreadsheet.createRow(0);
      XSSFCell cell;
      int cc=resultSet.getMetaData().getColumnCount();
      for(int i=1;i<=cc;i++)
      {
          String headerVal=resultSet.getMetaData().getColumnName(i);
          headerValues.add(headerVal);
          cell = row.createCell(i-1);
          cell.setCellValue(resultSet.getMetaData().getColumnName(i));
      }
      System.out.println(headerValues);
      int i = 1;
      while (resultSet.next())
      {  
          for(int j=1;j<=cc;j++)
          {  
          System.out.println(resultSet.getString(j));
          XSSFRow row1 = spreadsheet.createRow((short) i);
          row1.createCell((short) i).setCellValue(resultSet.getString(resultSet.getMetaData().getColumnName(j)));
          i++;

      }  
      }

      FileOutputStream out = new FileOutputStream(new File("S:\\Downloads\\excel.xlsx"));
      workbook.write(out);
      out.close();  
      System.out.println("exceldatabase.xlsx written successfully");

}catch(Exception e){}
}

【讨论】:

    【解决方案4】:

    以上问题已解决。

    public static void excel(String appDB)
    {
        List<String> headerValues=new ArrayList<String>();
    
        XSSFWorkbook workbook = new XSSFWorkbook();
        try {
        setConnection(appDB);
    
        String queryName="SELECT * FROM ALL_TABLES where table_name='table_name";
    
        Reporter.addStepLog("----------------------------------- " + queryName.toUpperCase()
                + "\n - Validation Start" + " -----------------------------------");
        ps = con.prepareStatement(queryName, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
        rs = ps.executeQuery();
    
        Statement statement = con.createStatement();
        XSSFSheet spreadsheet = workbook.createSheet("employedb");
          ResultSet resultSet = statement.executeQuery("select * from all_tab_columns where table_name='table_name'");
    
    
          XSSFRow row = spreadsheet.createRow(0);
          XSSFCell cell;
          int cc=resultSet.getMetaData().getColumnCount();
          for(int i=1;i<=cc;i++)
          {
              String headerVal=resultSet.getMetaData().getColumnName(i);
              headerValues.add(headerVal);
              cell = row.createCell(i-1);
              cell.setCellValue(resultSet.getMetaData().getColumnName(i));
          }
          System.out.println(headerValues);
    
          int i = 1;
          while (resultSet.next())
          {  
    
              XSSFRow row1 = spreadsheet.createRow((short) i);
              for(int p=0;p<headerValues.size();p++)
              {
              row1.createCell((short) p).setCellValue(resultSet.getString(headerValues.get(p)));
              }
              i++;
          } 
          FileOutputStream out = new FileOutputStream(new File("S:\\Downloads\\excel.xlsx"));
          workbook.write(out);
          out.close();  
          System.out.println("exceldatabase.xlsx written successfully");
    
    }catch(Exception e){}
    }
    

    【讨论】: