【问题标题】:How to create multiple sheets in a excel based on the values passed from output of query如何根据从查询输出传递的值在 excel 中创建多个工作表
【发布时间】:2016-11-11 15:44:08
【问题描述】:

# 我的要求是生成一个包含多张工作表的 excel 工作簿。在这种情况下,执行具有特定日期范围的查询并获取输出并将这些值传递到具有基于日期的不同工作表的 excel 工作簿中,例如:工作表 1 应仅包含日期 1 值,工作表 2 应仅包含日期 2 值等等直到给定的日期范围。 #

## 在下面的代码中,我只完成了对选定日期范围的查询,并只用一张表传递给 excel 工作簿。请帮助我了解如何从这里继续前进并实现我的要求。 ##

import java.sql.*;
import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

public class CreateExcelFile{
public static void main(String[]args){
try{
XSSFWorkbook wb=new XSSFWorkbook();
XSSFSheet sheet =  wb.createSheet("new sheet");

XSSFRow rowhead=   sheet.createRow((short)0);
rowhead.createCell((short) 0).setCellValue("EMPNO");
rowhead.createCell((short) 1).setCellValue("ENAME");
rowhead.createCell((short) 2).setCellValue("JOB");
rowhead.createCell((short) 3).setCellValue("MGR");
rowhead.createCell((short) 4).setCellValue("HIREDATE");

Class.forName("oracle.jdbc.driver.OracleDriver");
  Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","pass");
Statement st=con.createStatement();
ResultSet rs=st.executeQuery("SELECT * FROM emp
WHERE HIREDATE
BETWEEN TO_DATE ('1980/12/17', 'yyyy/mm/dd')AND TO_DATE ('1981/02/20','yyyy/mm/dd')");
int i=1;
while(rs.next()){
XSSFRow row=   sheet.createRow((short)i);
row.createCell((short) 0).setCellValue(Integer.toString(rs.getInt("empno")));
row.createCell((short) 1).setCellValue(rs.getString("ename"));
row.createCell((short) 2).setCellValue(rs.getString("job"));
row.createCell((short) 3).setCellValue(rs.getString("mgr"));
row.createCell((short) 4).setCellValue(rs.getString("hiredate"));
i++;
}

FileOutputStream fileOut =  new FileOutputStream(new File("data.xlsx"));
wb.write(fileOut);
fileOut.close();
System.out.println("Your excel file has been generated!");


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

}
}
}

【问题讨论】:

  • 我无法理解您的问题。您已经能够创建工作表并进行输入。
  • 我可以创建一个带有单张工作表的 excel 工作簿,其中包含我在查询中使用的整个日期范围的数据。但我需要为每个日期创建单独的工作表并将值传递给它。
  • 触发单个日期对应的sql并创建名称与日期相同的工作表,如果找到任何结果,则将所有数据添加到该工作表中。

标签: java sql excel apache-poi


【解决方案1】:

首先,我将通过分离代码来获取数据并将 Excel 文件写入不同的类来更改您的应用设计。
其次,在获得结果集后,将数据存储在 Map 中。例如。 HashMap<Date, List<DbRow>> 其中 DbRow 是一个具有字段 empnameename 等的类。这样您就可以将数据按hiredate 拆分为列表。
之后,检查地图值并将每个列表中的数据添加到新工作表中。

【讨论】:

  • 你能给我一些例子如何在我的代码中使用 HasMap 并请澄清你的观点,它令人困惑@svz
  • 我确实尝试过使用它工作的哈希映射。谢谢你。 @svz
【解决方案2】:

工作表 1 应仅包含日期 1 值,工作表 2 应包含 仅日期 2 值,依此类推,直到给定的日期范围

显然您只调用了一次wb.createSheet("new sheet")。 如果您的要求是根据日期范围创建多个工作表,您应该在 while loop 块内多次调用该方法。

查询,

SELECT * FROM emp WHERE HIREDATE BETWEEN TO_DATE ('1980/12/17', 'yyyy/mm/dd')AND TO_DATE ('1981/02/20','yyyy/mm/dd')

返回给你不同雇佣者的行数。检查这些日期并将它们适当地放在不同的工作表中。

【讨论】:

    猜你喜欢
    • 2021-10-21
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2021-06-10
    • 1970-01-01
    相关资源
    最近更新 更多