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

时间: 2024-12-25 07:35:57

数据库与Excel报表的动态生成的相关文章

RDLC报表之动态生成报表

首先,必须感谢和致敬蜡人张前辈: http://waxdoll.cnblogs.com/archive/2006/02/25/337713.html 2.微软GotReportViewer官方的案例: http://www.gotreportviewer.com/(约有20来个,很详细.有时候会上不了) ) 前段时间,做了RDLC报表,主要是三块功能: 1.从DataGrid提取数据,然后创建对应的RDLC报表文件,以利用ReportViewer类的打印排版的功能(其中做了个提取数据的通用函数,

JAVA操作Excel 可配置,动态 生成复杂表头 复杂的中国式报表表头

转载:开源社区http://www.oschina.net/code/snippet_1424099_49530?p=2代码] [Java]代码 该代码实现了Excel复杂表头的生成 基于sql server 的一张树表 你们可以 看代码自行建库 package com.jingjiu.util; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; i

在.NET中使用EPPlus生成Excel报表 .

--摘抄自:http://blog.csdn.net/zhoufoxcn/article/details/14112473 在开发.NET应用中可能会遇到需要生成带图表(Chart)的Excel报表的需求,特别是在一些ASP.NET网站中,有时候我们并不能保证Web服务器上一定安装了Office组件,所以使用微软的Office来生成Excel并不保证在所有情况下都使用,有时候即使Web服务器上安装了Office也会出现一些运行权限方面的原因到导致调用Excel组件生成Excel失败,所以在这里介

Cglib根据数据库表数据动态生成对象

最近有个任务:根据查询SQL直接导出报表 实现关键是,怎么根据sql查询的数据动态生成对象列表,想到Cglib动态代理实现 废话少说,上代码: 定义动态生成Java Bean类: import java.util import net.sf.cglib.beans.{BeanGenerator, BeanMap} /** * 动态Bean生成 * * @author BarryWang create at 2018/6/19 11:54 * @version 0.0.1 */class Dyna

从数据库中导出excel报表

通常需要将后台数据库中的数据集或者是其他列表等导出excel 报表,这里主要引用了Apose.cells dll 类库, (1)直接上主要代码: protected void txtExport_Click(object sender, EventArgs e)         { try             { // 获取测试商品报表 IList<ProductEntity> pList = ProductBLL.getProductList(); // 导出到Excel中 Workbo

构建施耐德楼控系统数据库后台服务器示例工程五(JAVA动态生成类)

在做数据库简易工具的过程中遇到了这么一个问题,即程序部署在tomcat下启动运行后,我们无法事先定义数据库中后续创建的表结构的Hibernate Bean对象,这样就需要我们在服务器运行起来后动态创建bean对象.cglib这个开源库即可解决我们的问题,动态创建JAVA对象. 1.cglib开源库简介 CGLIB(Code Generation Library)是一个开源项目,是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口. 反编译后CGLIB结构

ExtJS4 动态生成的grid导出为excel(纯前台)

搜索了蛮久,找到一些例子,因为我是初学者的缘故大多不知道怎么使用.. 研究了一下那个源码,搞到现在终于实现了基本的下载..解决了一个表格不能重复下载的小BUG,一个使用grid初始化发生的BUG 下面记录一下步骤..说不定下次还有用 1.下载需要用到js代码,我已经上传 http://download.csdn.net/detail/hu8471479/7281703 2.在你的html文件中加入引用,路径问题自己 注意下,下面是我的路径 <script type="text/javasc

用C#从数据库动态生成AdminLTE菜单的一种方法

用C#从数据库动态生成AdminLTE菜单的一种方法 当前的应用设计风格趋于Flat扁平化,很多基于BootStrap实现了很多UI非常漂亮的管理界面(Bootstrap admin template). 此核心文件开源在Github:https://github.com/JackWangCUMT/AdminLTE-Menu-Generate.首先看一下主界面: 查看左边导航的菜单html结构(下面代码有错误,HTML自定义属性直接用空格进行分割,而不是,号进行分割,不然jquery获取定义属性

web项目之BBS---从数据库查询动态生成版块信息问题分析和小结

前期学习了 html5.0   css3   javascript, jsp 页面也已经入门,老师通过BBS 的web项目来给我们讲述这些知识点在实际项目中的应用. 具体的注册.登陆都只是简单的业务层逻辑问题,不予说明.项目开始的第二天,老师布置了作业: 想清楚动态生成版块信息的流程,给的提示如下: 这是 board表的字段:boardid.name.和一个父版块id 用 map 来存入,map 的键就是父版块编号,值就是 List<Board>,这个 parentid 下面的所有Board