java后台生成Excel并下载

java生成Excel并下载(业务需求:前台点击导出按钮,后台生成Excel并下载)

导入所需要的jar包

<dependency>
	<groupId>net.sourceforge.jexcelapi</groupId>
	<artifactId>jxl</artifactId>
	<version>2.6.12</version>
</dependency>

编写所需要的类

		ServletRequestAttributes requestAttributes =
		(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
		HttpServletResponse response = requestAttributes.getResponse();
		HttpServletRequest request = requestAttributes.getRequest();

		// 文件名
		String filename = "房间列表.xls";

		try {

			// 写到服务器上
			String path = request.getSession().getServletContext().getRealPath("") + "/" + filename;

			// 写到服务器上(这种测试过,在本地可以,放到linux服务器就不行)
			//String path =  this.getClass().getClassLoader().getResource("").getPath()+"/"+filename;

			File name = new File(path);
			// 创建写工作簿对象
			WritableWorkbook workbook = Workbook.createWorkbook(name);
			// 工作表
			WritableSheet sheet = workbook.createSheet("房间列表", 0);
			// 设置字体;
			WritableFont font = new WritableFont(WritableFont.ARIAL,
			14, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);

			WritableCellFormat cellFormat = new WritableCellFormat(font);
			// 设置背景颜色;
			cellFormat.setBackground(Colour.WHITE);
			// 设置边框;
			cellFormat.setBorder(Border.ALL, BorderLineStyle.DASH_DOT);
			// 设置文字居中对齐方式;
			cellFormat.setAlignment(Alignment.CENTRE);
			// 设置垂直居中;
			cellFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
			// 分别给1,3,6列设置不同的宽度;
			// sheet.setColumnView(0, 15);
			// sheet.setColumnView(2, 60);
			// sheet.setColumnView(5, 35);
			// 给sheet电子版中所有的列设置默认的列的宽度;
			sheet.getSettings().setDefaultColumnWidth(20);
			// 给sheet电子版中所有的行设置默认的高度,高度的单位是1/20个像素点,但设置这个貌似就不能自动换行了
			// sheet.getSettings().setDefaultRowHeight(30 * 20);
			// 设置自动换行;
			cellFormat.setWrap(true);

			// 单元格
			Label label0 = new Label(0, 0, "房间ID", cellFormat);
			Label label1 = new Label(1, 0, "房间名称", cellFormat);
			Label label2 = new Label(2, 0, "房间状态", cellFormat);
			Label label3 = new Label(3, 0, "房间地址", cellFormat);

			sheet.addCell(label0);
			sheet.addCell(label1);
			sheet.addCell(label2);
			sheet.addCell(label3);

			// 给第二行设置背景、字体颜色、对齐方式等等;
			WritableFont font2 = new WritableFont(WritableFont.ARIAL, 
			14, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
			WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
			// 设置文字居中对齐方式;
			cellFormat2.setAlignment(Alignment.CENTRE);
			// 设置垂直居中;
			cellFormat2.setVerticalAlignment(VerticalAlignment.CENTRE);
			cellFormat2.setBackground(Colour.WHITE);
			cellFormat2.setBorder(Border.ALL, BorderLineStyle.THIN);
			cellFormat2.setWrap(true);

			// 记录行数
			int n = 1;

			// 查找所有房间
			List<kfzt> kfztList = kfztDao.queryByJms(userId);
			if (kfztList != null && kfztList.size() > 0) {
				// 遍历
				for (kfzt kf : kfztList) {

					// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
					// String createTime = sdf.format(a.getCreateTime());

					Label lt0 = new Label(0, n, kf.getKefangID()+"", cellFormat2);//房间ID
					Label lt1 = new Label(1, n, kf.getMingcheng(), cellFormat2);//房间名称
					Label lt2 = new Label(2, n, kf.getZhuangTai(), cellFormat2);//房间状态
					Label lt3 = new Label(3, n, kf.getDizhi(), cellFormat2);//房间地址

					sheet.addCell(lt0);
					sheet.addCell(lt1);
					sheet.addCell(lt2);
					sheet.addCell(lt3);

					n++;
				}
			}

			//开始执行写入操作
			workbook.write();
			//关闭流
			workbook.close();

		} catch (Exception e) {
			e.printStackTrace();
		}
		// 第六步,下载excel

		OutputStream out = null;
		try {

			// 1.弹出下载框,并处理中文
			/** 如果是从jsp页面传过来的话,就要进行中文处理,在这里action里面产生的直接可以用
			 * String filename = request.getParameter("filename");
			 */
			/**
			 if (request.getMethod().equalsIgnoreCase("GET")) {
			 filename = new String(filename.getBytes("iso8859-1"), "utf-8");
			 }
			 */
			// 各浏览器不同的编码,防止中文出现乱码
			String userAgent=request.getHeader("User-Agent");
			if (userAgent.contains("MSIE") || userAgent.contains("Trident") || userAgent.contains("Edge")) {//IE
				response.addHeader("content-disposition", "attachment;filename=" +
						java.net.URLEncoder.encode(filename, "utf-8"));
			} else {
				response.addHeader("content-disposition", "attachment;filename=" +
						new String(filename.getBytes("UTF-8"), "ISO8859-1"));// 谷歌/火狐
			}

			// 2.下载
			out = response.getOutputStream();
			String path3 = request.getSession().getServletContext().getRealPath("") + "/" + filename;

			// inputStream:读文件,前提是这个文件必须存在,要不就会报错
			InputStream is = new FileInputStream(path3);

			byte[] b = new byte[4096];
			int size = is.read(b);
			while (size > 0) {
				out.write(b, 0, size);
				size = is.read(b);
			}
			out.close();
			is.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

你可能感兴趣的:(后台)