在web业务中,有时候会需要把查询结果以excel保存下来。实现的方法有很多,这里以jxl.jar+servlet为例。
假定查询页面为cx.jsp
cx.jsp中添加了两个按钮,即将分页查询的当前页结果转存为excel,或将所有页记录转存为excel。
代码如下:
<!-- 查询页面 cx.jsp -->
<html>
<head></head>
<body>
<form>
<table>
……
<tr>
<td><input type="submit" name="excel1" onclick= "pageThis(0)" value="本页转Excel保存" class="mybutton"></td>
<td><input type="submit" name="excel2" onclick= "pageThis(1)" value="所有页转Excel保存" class="mybutton"></td>
</tr>
<table>
</form>
<script language="JavaScript">
//转存为excel
function pageThis(key)
{
form1.action="cx_impexcel.jsp?key="+key;
form1.submit();
}
</script>
</body>
</html>
点击按钮,调用excel导出页面 cx_impexcel.jsp
cx_impexcel.jsp中的action.getMethodA(),action.getMethodB()方法即查询当前页和所有页记录的集合。
调用ActionImpExcel.writeExcel()方法生成excel数据文件到服务器端的指定配置路径,并通过servlet读取该文件转存到客户端。
代码如下:
<!-- excel导出页面 cx_impexcel.jsp -->
<html>
<head>
</head>
<body>
<%
// 配置文件中定义的放置excel的路径。
String sFilePath = PropertyManager.getProperty("tempfilepath");
// 获取该项目的绝对路径
String url=request.getRealPath("/")+"\\"+sFilePath;
String path = request.getContextPath();
// 获取该项目的相对路径
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
// 查询结果集
ArrayList listall =new ArrayList();
// 生成excel数据的结果
boolean rtn=false;
String key = request.getParameter("key");
// 定义将要导出记录的字段列名,用自定义的分隔符隔开(这里用的是';')
String colName= "columnA;columnB;columnC;columnD;columnE";
// 定义生成的文件名MakeFileName()
String fileName=MakeFileName() + ".xls";
// 返回满足条件的记录列表
if(key.equals("0"))
{
// TODO 调用自己定义的方法,返回查询的当前页记录
listall= action.getMethodA();
}
else
{
// TODO 调用自己定义的方法,返回查询的所有页记录
listall= action.getMethodB();
}
// 生成EXCEL数据
rtn = ActionImpExcel.writeExcel(url+fileName,listall,colName,";");
if (rtn) {
// 自动文件下载
response.sendRedirect(basePath+"servletdownloadfile?filename="+fileName+"&downloadFlag=1");
} else
out.print("<div align=center >导出EXCEL失败</div>");
%>
</body>
</html>
用于生成excel的ActionImpExcel类:
/**生成excel文件*/
public class ActionImpExcel {
static int rowcount = 0;
static HashMap hmp = new HashMap();
static String arrColName[] = null;
static int colcount = 0;
/**
* 将查询结果写入生成的excel
* @param filename String 带路径的文件名
* @param list ArrayList 待写入的查询结果
* @param colName String 导出的列名集合
* @param sign String 列名的分隔符
* @return
**/
public static boolean writeExcel(String fileName, ArrayList list,
String colName,String sign) {
String key = "";
WritableWorkbook wwb = null;
try {
// 首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象
wwb = Workbook.createWorkbook(new File(fileName));
} catch (IOException e) {
e.printStackTrace();
}
if (wwb != null) {
// 创建一个可写入的工作表
// Workbook的createSheet方法有两个参数,第一个是工作表的名称,第二个是工作表在工作薄中的位置
WritableSheet ws = wwb.createSheet("sheet1", 0);
arrColName = colName.split(sign);
for (int k = 0; k < arrColName.length; k++) {
Label labelName = new Label(k, 0, arrColName[k]);
try {
ws.addCell(labelName);
} catch (RowsExceededException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
}
}
// 下面开始添加单元格
for (int i = 0; i < list.size(); i++) {
hmp = (HashMap) list.get(i);
for (int j = 0; j < hmp.size(); j++) {
// 这里需要注意的是,在Excel中,第一个参数表示列,第二个表示行
key = String.valueOf(j+1);
String colvalue = (String) hmp.get(key);
Label labelC = new Label(j, i + 1, colvalue);
try {
// 将生成的单元格添加到工作表中
ws.addCell(labelC);
} catch (RowsExceededException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
}
}
}
try {
// 从内存中写入文件中
wwb.write();
// 关闭资源,释放内存
wwb.close();
} catch (IOException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
}
}
return true;
}
}
用于文件下载的servlet类:
public class ServletDownLoadFile extends HttpServlet {
//Initialize global variables
public void init() throws ServletException {
}
//Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String sFileName = "";//文件名
String sFilePath = "";//文件路径
sFileName = request.getParameter("filename");
// 配置文件中定义的存放excel的路径
sFilePath = PropertyManager.getProperty("tempfilepath");
sFilePath=(sFilePath==null)?"":sFilePath;
response.reset();
if("1".equals(request.getParameter("downloadFlag")))
{
//downloadFlag为1时为下载文件
response.setContentType("application/x-msdownload");
response.setHeader("Content-disposition","faxfile; filename="+new String(sFileName.getBytes("GBK"), "ISO8859_1"));
}
else if("0".equals(request.getParameter("downloadFlag")))
{
//downloadFlag为0时为用指定的程序打开文件
response.setContentType("application/x-msdownload");
}//downloadFlag为其他值时用IE默认的方式打开文件
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try
{
bis = new BufferedInputStream(new FileInputStream(getServletContext().getRealPath(sFilePath+ sFileName)));
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
int bytesRead;
while(-1 != (bytesRead = bis.read(buff, 0, buff.length)))
{
bos.write(buff,0,bytesRead);
}
}
catch(final IOException e)
{
System.out.println ( "IOException." + e );
}
finally
{
if (bis != null)
bis.close();
if (bos != null)
bos.close();
}
}
//Clean up resources
public void destroy() {
}
}
好了,最后在web.xml中添加servlet的配置信息;并在application.properties配置好存放excel的目录变量tempfilepath即可。