jsp页面点击连接,生成excel文件,然后下载(excel不是原来生成好的,是根据点击的连接,取数据库的内容动态生成excel文件)
jsp页面点击连接,生成excel文件,然后下载(excel不是原来生成好的,是根据点击的连接,取数据库的内容动态生成excel文件)
最好给个代码
[解决办法]
在serverlet中用poi生成excel文件
[解决办法]
希望对你有所帮助
----------------------------------------------
Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该 API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为是使用Java编写的,所以我们在Web应用中可以通过JSP、 Servlet来调用API实现对Excel数据表的访问。
提供以下功能:
* 从Excel 95、97、2000等格式的文件中读取数据;
* 读取Excel公式(可以读取Excel 97以后的公式);
* 生成Excel数据表(格式为Excel 97);
* 支持字体、数字、日期的格式化;
* 支持单元格的阴影操作,以及颜色操作;
* 修改已经存在的数据表;
* 能够读取图表信息
1.应用示例:
包括从Excel读取数据,生成新的Excel,以及修改Excel
package common.util;
import jxl.*;
import jxl.format.UnderlineStyle;
import jxl.write.*;
import jxl.write.Number;
import jxl.write.Boolean;
import java.io.*;
/**
* Created by IntelliJ IDEA.
* User: xl
* Date: 2005-7-17
* Time: 9:33:22
* To change this template use File | Settings | File Templates.
*/
public class ExcelHandle
{
public ExcelHandle()
{
}
/**
* 读取Excel
*
* @param filePath
*/
public static void readExcel(String filePath)
{
try
{
InputStream is = new FileInputStream(filePath);
Workbook rwb = Workbook.getWorkbook(is);
//Sheet st = rwb.getSheet("0")这里有两种方法获取sheet表,1为名字,而为下标,从0开始
Sheet st = rwb.getSheet("original");
Cell c00 = st.getCell(0,0);
//通用的获取cell值的方式,返回字符串
String strc00 = c00.getContents();
//获得cell具体类型值的方式
if(c00.getType() == CellType.LABEL)
{
LabelCell labelc00 = (LabelCell)c00;
strc00 = labelc00.getString();
}
//输出
System.out.println(strc00);
//关闭
rwb.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
* 输出Excel
*
* @param os
*/
public static void writeExcel(OutputStream os)
{
try
{
/**
* 只能通过API提供的工厂方法来创建Workbook,而不能使用WritableWorkbook的构造函数,
* 因为类WritableWorkbook的构造函数为protected类型
* method(1)直接从目标文件中读取
WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile));
* method(2)如下实例所示 将WritableWorkbook直接写入到输出流
*/
WritableWorkbook wwb = Workbook.createWorkbook(os);
//创建Excel工作表 指定名称和位置
WritableSheet ws = wwb.createSheet("Test Sheet 1",0);
//**************往工作表中添加数据*****************
//1.添加Label对象
Label label = new Label(0,0,"this is a label test");
ws.addCell(label);
//添加带有字型Formatting对象
WritableFont wf = new WritableFont(WritableFont.TIMES,18,WritableFont.BOLD,true);
WritableCellFormat wcf = new WritableCellFormat(wf);
Label labelcf = new Label(1,0,"this is a label test",wcf);
ws.addCell(labelcf);
//添加带有字体颜色的Formatting对象
WritableFont wfc = new WritableFont(WritableFont.ARIAL,10,WritableFont.NO_BOLD,false,
UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.RED);
WritableCellFormat wcfFC = new WritableCellFormat(wfc);
Label labelCF = new Label(1,0,"This is a Label Cell",wcfFC);
ws.addCell(labelCF);
//2.添加Number对象
Number labelN = new Number(0,1,3.1415926);
ws.addCell(labelN);
//添加带有formatting的Number对象
NumberFormat nf = new NumberFormat("#.##");
WritableCellFormat wcfN = new WritableCellFormat(nf);
Number labelNF = new jxl.write.Number(1,1,3.1415926,wcfN);
ws.addCell(labelNF);
//3.添加Boolean对象
Boolean labelB = new jxl.write.Boolean(0,2,false);
ws.addCell(labelB);
//4.添加DateTime对象
jxl.write.DateTime labelDT = new jxl.write.DateTime(0,3,new java.util.Date());
ws.addCell(labelDT);
//添加带有formatting的DateFormat对象
DateFormat df = new DateFormat("dd MM yyyy hh:mm:ss");
WritableCellFormat wcfDF = new WritableCellFormat(df);
DateTime labelDTF = new DateTime(1,3,new java.util.Date(),wcfDF);
ws.addCell(labelDTF);
//添加图片对象,jxl只支持png格式图片
File image = new File("f:\2.png");
WritableImage wimage = new WritableImage(0,1,2,2,image);//0,1分别代表x,y.2,2代表宽和高占的单元格数
ws.addImage(wimage);
//写入工作表
wwb.write();
wwb.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
* 拷贝后,进行修改,其中file1为被copy对象,file2为修改后创建的对象
* 尽单元格原有的格式化修饰是不能去掉的,我们还是可以将新的单元格修饰加上去,
* 以使单元格的内容以不同的形式表现
* @param file1
* @param file2
*/
public static void modifyExcel(File file1,File file2)
{
try
{
Workbook rwb = Workbook.getWorkbook(file1);
WritableWorkbook wwb = Workbook.createWorkbook(file2,rwb);//copy
WritableSheet ws = wwb.getSheet(0);
WritableCell wc = ws.getWritableCell(0,0);
//判断单元格的类型,做出相应的转换
if(wc.getType == CellType.LABEL)
{
Label label = (Label)wc;
label.setString("The value has been modified");
}
wwb.write();
wwb.close();
rwb.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
//测试
public static void main(String[] args)
{
try
{
//读Excel
ExcelHandle.readExcel("f:/testRead.xls");
//输出Excel
File fileWrite = new File("f:/testWrite.xls");
fileWrite.createNewFile();
OutputStream os = new FileOutputStream(fileWrite);
ExcelHandle.writeExcel(os);
//修改Excel
ExcelHandle.modifyExcel(new file(""),new File(""));
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
2.在jsp中做相关测试,创建一个writeExcel.jsp
<%
response.reset();//清除Buffer
response.setContentType("application/vnd.ms-excel");
File fileWrite = new File("f:/testWrite.xls");
fileWrite.createNewFile();
new FileOutputStream(fileWrite);
ExcelHandle.writeExcel(new FileOutputStream(fileWrite));
%>
在IE中浏览writeExcel.jsp就可以动态生成Excel文档了,其中
response.setContentType ("application/vnd.ms-excel");语句必须要,才能确保不乱码,在jsp中输入<%@page contentType ="application/vnd.ms-excel;charset=GBK"%>不行。
[解决办法]
完整代码,数据库连接文件conndb.java自己写。。。。。
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*"%>
<jsp:useBean id="conn" scope="page" class="com.core.ConnDB"/>
<%
String sql="SELECT * FROM tb_pay ORDER BY month desc";
ResultSet rs=conn.executeQuery(sql);
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>将Web页面中的数据导出到Excel</title>
<body>
<table width="643" border="0" align="center" cellpadding="0" cellspacing="0" class="tab_border">
<tr>
<td height="68" colspan="2" background="Images/H_pay.gif"> </td>
</tr>
<tr>
<td width="4%"> </td>
<td width="96%" align="left"><table width="643" border="0" cellspacing="1" bgcolor="#000000" id="pay">
<tr>
<td width="37" height="27" align="center" bgcolor="#efefef">编号</td>
<td width="152" align="center" bgcolor="#efefef">手机号码</td>
<td width="106" align="center" bgcolor="#efefef">月份</td>
<td width="85" align="center" bgcolor="#efefef">通话费用</td>
<td width="74" align="center" bgcolor="#efefef">IP费用</td>
<td width="80" align="center" bgcolor="#efefef">短信息费用</td>
<td width="87" align="center" bgcolor="#efefef">合计</td>
</tr>
<%
int i=1;
String telno="";
int year=0;
int month=0;
float telPay=0f;
float infoPay=0f;
float ipPay=0f;
try{
while(rs.next()){
telno=rs.getString(2);
telPay=rs.getFloat(3);
infoPay=rs.getFloat(4);
ipPay=rs.getFloat(5);
month=rs.getInt(6);
year=rs.getInt(7);
%>
<tr>
<td height="25" align="center" bgcolor="#FFFFFF"><%=i%></td>
<td align="center" bgcolor="#FFFFFF"> <%=telno%></td>
<td align="center" bgcolor="#FFFFFF"> <%=year%>年<%=month%>月</td>
<td align="center" bgcolor="#FFFFFF"> <%=telPay%></td>
<td align="center" bgcolor="#FFFFFF"> <%=infoPay%></td>
<td align="center" bgcolor="#FFFFFF"> <%=ipPay%></td>
<td align="center" bgcolor="#FFFFFF"> <%=telPay+infoPay+ipPay%></td>
</tr>
<%
i++;
}
}catch(Exception e){
System.out.println(e.getMessage());
}
%>
</table>
<script language="javascript">
function outExcel(){
var table=document.all.pay;
row=table.rows.length;
column=table.rows(1).cells.length;
var excelapp=new ActiveXObject("Excel.Application");
excelapp.visible=true;
objBook=excelapp.Workbooks.Add(); //添加新的工作簿
var objSheet = objBook.ActiveSheet;
for(i=0;i<row;i++){
for(j=0;j<column;j++){
objSheet.Cells(i+1,j+1).value=table.rows(i).cells(j).innerHTML.replace(" ","");
}
}
objBook.SaveAs("C:\payList.xls");
excelapp.UserControl = true;
}
</script>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td> </td>
</tr>
</table></td>
</tr>
</table>
</body>
</html>
[解决办法]
up
[解决办法]
mark!
[解决办法]
学习
[解决办法]
使用POI比较好:
一.POI简介
Jakarta POI 是apache的子项目,目标是处理ole2对象。它提供了一组操纵Windows文档的Java API
目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。
二.HSSF概况
HSSF 是Horrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”。 也许HSSF的名字有点滑稽,就本质而言它是一个非常严肃、正规的API。通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。
HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。前者很好理解,后者比较抽象,但操作效率要高得多。
三.开始编码
1 . 准备工作
要求:JDK 1.4+POI开发包
可以到 http://www.apache.org/dyn/closer.cgi/jakarta/poi/ 最新的POI工具包
2 . EXCEL 结构
HSSFWorkbook excell 文档对象介绍
HSSFSheet excell的表单
HSSFRow excell的行
HSSFCell excell的格子单元
HSSFFont excell字体
HSSFName 名称
HSSFDataFormat 日期格式
在poi1.7中才有以下2项:
HSSFHeader sheet头
HSSFFooter sheet尾
和这个样式
HSSFCellStyle cell样式
辅助操作包括
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 错误信息表
3 .具体用法实例 (采用 usermodel )
如何读Excel
读取Excel文件时,首先生成一个POIFSFileSystem对象,由POIFSFileSystem对象构造一个HSSFWorkbook,该HSSFWorkbook对象就代表了Excel文档。下面代码读取上面生成的Excel文件写入的消息字串:
POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:\test.xls")); HSSFWorkbook wb = new HSSFWorkbook(fs); } catch (IOException e) { e.printStackTrace(); } HSSFSheet sheet = wb.getSheetAt(0); HSSFRow row = sheet.getRow(0); HSSFCell cell = row.getCell((short) 0); String msg = cell.getStringCellValue();
[解决办法]
你就按照以前的方法把查询结果显示到jsp页面上
在页面的开头位置加上:
<%
//转换成excel文件输出
response.setContentType("application/msexcel");
response.setHeader("Content-disposition","inline;filename=cargo_reckoningExcel.xls");//定义文件名
%>