一.数据库与Excel报表的动态生成
(1)读取数据库的数据动态生成Excel报表,这是JSP应用中常遇到的问题,本节采用的基本方法是:
在Excel工作薄中,将报表模板制作在第一张工作表中,从数据库中读取数据,利用POI组件复制模板工作表
而得到一张新的工作表,将查询数据填写到新的工作表中。
(2) 实例分析
写一个Servlet程序,查询pubs数据库的titles表和sales表,把查询结果集数据填写到图6-14的报表中,
操作步骤如下:
第1步:新建一个名类为“DBExcelServlet”的Servlet类
第2步:编译DBExcelServlet程序。
package my; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; import org.apache.poi.hssf.usermodel.*; import java.sql.*; import javax.sql.*; public class DBExcelServlet extends HttpServlet { Connection con=null; Statement st=null; ResultSet rs=null; protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,java.io.IOException { ServletContext application=getServletContext() ; ServletConfig config=getServletConfig() ; response.setContentType("application/vnd.ms-excel"); //定义返回给客户端的是excel数据文件 ServletOutputStream out=response.getOutputStream(); HttpSession session =request.getSession(); request.setCharacterEncoding("gb2312"); String inputFileName="c:\\tomcat\\webapps\\ROOT\\bookSales.xls"; //存放报表文件的路径 HSSFWorkbook sale = new HSSFWorkbook(new FileInputStream(inputFileName)); //打开一个模板工作薄 HSSFSheet sheet=null; //一个工作表的引用 HSSFRow row=null; //一个数据航的对象引用 HSSFCell cell=null;//一个单元格对象 int rowNumber=3; //记录当前数据行的行数 double sum=0; //统计金额 try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); String url="jdbc:sqlserver://localhost:1433;databaseName=pubs;user=sa;password="; con = DriverManager.getConnection(url); String sql="select a.title_id,title,price,qty from titles a join sales b on a.title_id=b.title_id"; st=con.createStatement(); rs=st.executeQuery(sql); sheet=sale.cloneSheet(0); //克隆工作薄中的模板工作表 得到一张新的工作表 while(rs.next()) //遍历循环 { row=sheet.getRow(rowNumber); //获得待填写数据行对象 String title_id=rs.getString(1); cell=row.getCell((short)0); cell.setCellValue(title_id); String title=rs.getString(2); cell=row.getCell((short)1); cell.setCellValue(title); double price=rs.getDouble(3); cell=row.getCell((short)4); cell.setCellValue(price); int qty=rs.getInt(4); cell=row.getCell((short)5); cell.setCellValue(qty); double s=price*qty; cell=row.getCell((short)6); cell.setCellValue(s); sum=sum+s; rowNumber++; if(rowNumber==8) { row=sheet.getRow(8); cell=row.getCell((short)6); cell.setCellValue(sum); sum=0; sheet=sale.cloneSheet(0); rowNumber=3; row=sheet.getRow(rowNumber); } } if(rowNumber<8) { row=sheet.getRow(8); cell=row.getCell((short)6); cell.setCellValue(sum); } rs.close(); st.close(); con.close(); } catch(Exception e) { out.print(e.getMessage()); } finally { try { if(rs!=null) rs.close(); if(st!=null) st.close(); if(con!=null) con.close(); }catch(Exception em) {System.out.println(em);} } sale.removeSheetAt(0); //完成工作表填写后,将工作薄中的模板工作表删除,他是第一张工作表 sale.write(out); //将工作薄写入response缓冲区,并返回给客户端游览器显示 out.close(); } protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,java.io.IOException { doGet(request,response); } }
(3)由于最近在很多的论坛看到自己的好多原创帖子,希望大家在转载的时候注明出处,是对我努力的更大肯定!谢谢支持!