首页 > 代码库 > 数据库与Excel报表的动态生成

数据库与Excel报表的动态生成

一.数据库与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)由于最近在很多的论坛看到自己的好多原创帖子,希望大家在转载的时候注明出处,是对我努力的更大肯定!谢谢支持!


数据库与Excel报表的动态生成