欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

javaweb中如何使用POI把数据导出为Excel(有下载提示框)详细教程

程序员文章站 2024-03-21 12:44:40
...

准备步骤:

1.首先要在Apache官网上下载poi的jar包(以poi-3.17为例)

2.地址:http://mirrors.tuna.tsinghua.edu.cn/apache/poi/release/bin/poi-bin-3.17-20170915.zip

3.下载完成后解压文件

4.将里面的jar包都引到项目中去,也可以单独引poi的jar包

示例代码:

package com.lzy.Controller;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.HorizontalAlignment;

import com.lzy.dao.LoginDao;
import com.lzy.dao.UserDao;
import com.lzy.entity.LoginLog;
import com.lzy.entity.Users;
import com.lzy.imp.LoginDaoimpl;
import com.lzy.imp.UserDaoimpl;

public class Excel extends HttpServlet {

	/**
	 * Constructor of the object.
	 */
	public Excel() {
		super();
	}

	/**
	 * Destruction of the servlet. <br>
	 */
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}

	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
	}

	/**
	 * The doPost method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to post.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse res)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		res.setCharacterEncoding("UTF-8");
		// 以下为生成Excel操作
		// 创建一个workbook,对应一个Excel文件
		HSSFWorkbook wb = new HSSFWorkbook();
		// 在workbook中添加一个sheet,对应Excel中的一个sheet
		HSSFSheet sheet = wb.createSheet("XXX表");
		// 在sheet中添加表头第0行,老版本poi对excel行数列数有限制short
		HSSFRow row = sheet.createRow((int) 0);
		// 创建单元格,设置值表头,设置表头居中
		HSSFCellStyle style = wb.createCellStyle();
		// 居中格式
		style.setAlignment(HorizontalAlignment.CENTER);
		// 设置表头
		List<LoginLog> logs = new ArrayList<LoginLog>();
		//接受LogListServelt传过来的日志集合
		logs = (List<LoginLog>) request.getAttribute("sr");
		String url = (String) request.getAttribute("url");
		Map<Integer,String> users = new HashMap<Integer,String>();
		users=(Map<Integer, String>) request.getAttribute("user");
		String[] titles =(String[]) request.getAttribute("title");
		HSSFCell cell;
		for(int x=0;x<titles.length;x++){
		    cell = row.createCell(x);
		    cell.setCellValue(titles[x]);
			cell.setCellStyle(style);
		}
		//生成excel格式后要将数据写入excel:
		// 循环将数据写入Excel
		      for (int i = 0; i < logs.size(); i++) {
		        row = sheet.createRow((int) i + 1);
		        LoginLog list= logs.get(i);
		        row.createCell(0).setCellValue(list.getLogId());
		        row.createCell(1).setCellValue(users.get(list.getUserId()));
		        row.createCell(2).setCellValue(list.getLoginDate());
		        row.createCell(3).setCellValue(list.getRemoteIP());
		        row.createCell(4).setCellValue(list.getRemark());
		      }
		 

		/*之后将生成的Excel以流输出。 
		*不弹出下载框
		*/
		 
		//FileOutputStream out =new FileOutputStream("E:/XXX.xls");
		//wb.write(out); 
		//out.close();
		 

		//弹出下载框

		String fileName = "example";
		      ByteArrayOutputStream os = new ByteArrayOutputStream();
		      wb.write(os);
		      byte[] content = os.toByteArray();
		      InputStream is = new ByteArrayInputStream(content);
		      // 设置response参数,可以打开下载页面
		      res.reset();
		      //设置编码格式
		      res.setContentType("application/vnd.ms-excel;charset=utf-8");
		      res.setHeader("Content-Disposition", "attachment;filename="
		          + new String((fileName + ".xls").getBytes(), "iso-8859-1"));
		      ServletOutputStream out1 = res.getOutputStream();
		      BufferedInputStream bis = null;
		      BufferedOutputStream bos = null;
		 
		      try {
		        bis = new BufferedInputStream(is);
		        bos = new BufferedOutputStream(out1);
		        byte[] buff = new byte[2048];
		        int bytesRead;
		        // Simple read/write loop.
		        while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
		          bos.write(buff, 0, bytesRead);
		        }
		      } catch (Exception e) {
		        // TODO: handle exception
		        e.printStackTrace();
		      } finally {
		        if (bis != null)
		          bis.close();
		        if (bos != null)
		          bos.close();
		      }
		 
		     request.getRequestDispatcher(url).forward(request,res);
	}

	/**
	 * The doPut method of the servlet. <br>
	 *
	 * This method is called when a HTTP put request is received.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPut(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// Put your code here
	}

	/**
	 * Initialization of the servlet. <br>
	 *
	 * @throws ServletException if an error occurs
	 */
	public void init() throws ServletException {
		// Put your code here
	}

}

注释:

1.这是一段我写好的servelt,用来处理转出Excel表格!

2.传入url是为了在处理完成后再跳转的页面地址

3.传入map集合是用来书写每行的列名

4.res是request