【问题标题】:Java - Eclipse to Excel from SQL QueryJava - 从 SQL 查询到 Excel 的 Eclipse
【发布时间】:2017-08-30 19:51:45
【问题描述】:

从返回的每条记录中获取我想要第 5 行的 SQL 查询的结果。

我想将数据以 13 行的形式导出到 Excel 电子表格,从第二行开始(我有标题)。

我的 SQL 逻辑现在显然已经关闭,因为我在增加行和列的过程中得到了 13 次第一个结果,尽管它从第二行正确开始并且只输出 13 列。第二个结果以这种方式重复,每个连续的结果也是如此。

我怀疑我的麻烦始于 while (rs.next()) { for (int i = 0; i

package process;

import java.util.Scanner;
import java.io.*;
import java.sql.*;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFCell;



public class Sec_Completions {

    public static void main(String[] args) {
        Sec_Completions obj_Sec_Completions=new Sec_Completions();
        obj_Sec_Completions.Check_Data();
    }


public void Check_Data() {

    Scanner scanner = new Scanner(System.in);
    System.out.println("Enter the beginning date of completion  YYYY/MM/DD");
    String doc = scanner.nextLine();
    doc = doc + " 00:00";
    System.out.println("Date is" + " " + doc);




    final String sql = "SELECT DISTINCT wp_grassblade_completions.user_id, wp_grassblade_completions.status, wp_grassblade_completions.content_id, wp_usermeta.meta_key, CASE WHEN meta_value = 'male' THEN 'M' WHEN meta_value = 'female' THEN 'F' WHEN meta_value = 'Louisiana' THEN 'LA' ELSE meta_value END AS '1', wp_usermeta.meta_value, wp_usermeta.user_id, wp_grassblade_completions.timestamp\r\n" + 
            "FROM wp_grassblade_completions \r\n" + 
            "INNER JOIN wp_usermeta ON wp_grassblade_completions.user_id = wp_usermeta.user_id\r\n" + 
            "WHERE wp_grassblade_completions.timestamp >= ? AND meta_key IN ('mepr_full_name', 'mepr_address', 'mepr_city', 'mepr_state', 'mepr_zip_code', 'mepr_home_phone_with_area_code', \r\n" + 
            "  'mepr_drivers_license_or_id', 'mepr_id_state', 'mepr_LAst_four_of_social_security_number', 'mepr_date_of_birth_mmddyyyy', 'mepr_sex_mf', 'mepr_height', 'mepr_weight') AND content_id IN ('1575, 642, 1580') \r\n" + 
            "ORDER BY wp_grassblade_completions.timestamp, content_id, wp_usermeta.user_id";
Class.forName("com.mysql.jdbc.Driver");
        Connection connection=DriverManager.getConnection("jdbc:mysql://wpengine.com:3306/wp_database","user", "passsword");
        PreparedStatement ps =null;
        ps=connection.prepareStatement(sql);
        ps.setString(1, doc);

        Statement st = connection.createStatement();
        ResultSet rs = ps.executeQuery();

        XSSFWorkbook wb = new XSSFWorkbook();
        XSSFSheet sheet = wb.createSheet("Security");
        XSSFRow rowhead = sheet.createRow((short) 0);

int index = 1;
            while (rs.next()) {
                for (int i = 0; i < 13; i++) {

             XSSFRow row = sheet.createRow((short) index);
             row.createCell((short) i).setCellValue(rs.getString(5));
             index++;
 }
            }

  FileOutputStream fileOut = new FileOutputStream("D://OneDrive//ABSEC//ATC_Reporting//expdata1.xlsx");
  wb.write(fileOut);
  fileOut.close();
  System.out.println("Data is saved in excel file.");
  rs.close();
  connection.close();


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

【问题讨论】:

  • 你循环了两次,因为while已经是一个循环了,如何删除for循环和change to i = 0,然后在index++;之后添加i++;
  • 试过了,Excel中什么也没有打印出来......
  • 你知道吗,我注意到你的代码有一些错误。首先,当您有catch 时,没有try 语句。我不认为这是有效的,除非你只展示你的程序的一部分。其次,整个程序没有正确包装。您至少缺少两个花括号。请先修复这些,然后尝试您原来拥有的。顺便说一句,不要忘记缩进你的代码以使其更具可读性。

标签: java mysql sql-server excel eclipse


【解决方案1】:

再次编辑

试试这样的:

// META_KEY values, in the order that the columns should be. This should be a
// private static final outside of in the class, along with the query's text...
String[] keys = { "mepr_full_name", "mepr_address", "mepr_city", "mepr_state",
                  "mepr_zip_code", "mepr_home_phone_with_area_code",
                  "mepr_drivers_license_or_id", "mepr_id_state",
                  "mepr_LAst_four_of_social_security_number", "mepr_date_of_birth_mmddyyyy",
                  "mepr_sex_mf", "mepr_height", "mepr_weight" };

// Running thru the ResultSet
short index = 1;
while ( rs.next() )
{
   XSSFRow row = sheet.createRow( index );
   String key = rs.getString(4); // meta_key
   String value = rs.getString( 5 ); // meta_value
   for ( short i = 0; i < keys.length; ++i )
   {
      if ( keys[i].equals( key)) 
      {
         // Retrieving cell, creating if not exists
         XSSFCell cell = row.getCell( i, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK );
         // if the cell is used, increment index o get to the next row
         if ( cell.getCellTypeEnum() != CellType.BLANK )
            ++index;
         // Set the value
         cell.setCellValue( value );
         // No need to walk thru the rest of the array...
         break;
      }
   }
}

这仅适用于任何“下一行”不以在前一行中没有值的列开头的情况...
因此,您还应该将meta_key 添加到ORDER BY 子句...
通过一些额外的清理,如下所示:

SELECT DISTINCT wpgc.user_id, wpgc.status, wpgc.content_id, wpu.meta_key,
                CASE wpu.meta_value WHEN 'male' THEN 'M' WHEN 'female' THEN 'F'
                                    WHEN 'Louisiana' THEN 'LA' ELSE wpu.meta_value END AS '1',
                wpu.user_id, wpgc.timestamp
FROM wp_grassblade_completions AS wpgc
JOIN wp_usermeta AS wpu ON wpgc.user_id = wpu.user_id
WHERE wpgc.timestamp >= ?
  AND wpu.meta_key IN ('mepr_full_name', 'mepr_address', 'mepr_city', 'mepr_state',
                       'mepr_zip_code', 'mepr_home_phone_with_area_code',
                       'mepr_drivers_license_or_id', 'mepr_id_state',
                       'mepr_LAst_four_of_social_security_number',
                       'mepr_date_of_birth_mmddyyyy', 'mepr_sex_mf', 'mepr_height',
                       'mepr_weight')
  AND content_id IN ('1575, 642, 1580')
ORDER BY wpgc.timestamp, wpgc.content_id, wpu.user_id, wpu.meta_key

【讨论】:

  • java.sql.SQLException: 列索引超出范围,9 > 8。
  • 我只需要每条记录中的 getString(5) 。这是使用 XML 存储在元表中的数据。所以获取 string(5) 13 次,然后是新行。
  • 感谢更新代码宫本先生!然而,现在的结果是,该行在所有 13 列中都填充了值 A,然后在下一行,值 B 在列中填充......不知道如何让它获得下一个值并放置它在循环期间的下一列中。
  • 添加了两张图片,一张是预期的结果,第二张是使用你帮助我的代码的实际结果;)
  • 非常感谢您花时间找出解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
相关资源
最近更新 更多