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