查询数据并导出报表

## 需求

页面查询用户表信息, 并实现数据导出(以.xlsx格式保存至本地)

报表导出展示效果:

一, 环境搭建

1, 新建一SSM测试项目(ssm_test), 用于测试报表导出功能, 具体搭建过程不再赘述;

2, 报表导出需要用到apache提供的两个jar包, 添加对应依赖

<!-- 用于进行数据报表导出操作 -->
	<dependency>
	    <groupId>org.apache.poi</groupId>
	    <artifactId>poi</artifactId>
	    <version>3.14</version>
	</dependency>
	<dependency>
	    <groupId>org.apache.poi</groupId>
	    <artifactId>poi-ooxml</artifactId>
	    <version>3.14</version>
	</dependency>

 

二, 后台接口实现

1, DataExportController .java

## 这里查询数据库环节以固定结果集替代, 用于简单测试

package cn.tedu.test.controller;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/*
 * 查询数据以报表的形式导出
 */
@Controller
public class DataExportController {
	public static final String[] HEADERS = {"姓名", "性别", "年龄", "工作", "住址"};

	@RequestMapping("/export.do")
	@ResponseBody
	public void doExport(HttpServletResponse response) throws Exception {
		List<List<String>> data = new ArrayList<List<String>>();
		for (int i = 0; i < 6; i++) {
			List<String> userInfo = new ArrayList<String>();
			userInfo.add("小明" + i);
			userInfo.add("男" + i);
			userInfo.add("27" + i);
			userInfo.add("软件开发" + i);
			userInfo.add("上海浦东" + i);
			data.add(userInfo);
		}
		ExcelUtil excelUtil = new ExcelUtil("userInfo");
		Workbook workbook = new XSSFWorkbook();
		Sheet sheet = workbook.createSheet();
		excelUtil.formData(Arrays.asList(HEADERS), data, sheet);
		excelUtil.buildExcelDocument(workbook, response);
	}

}

## 备注: for循环中进行字符串加号拼接的性能不高, 建议使用 StringBuilder 或 StringBuffer的append()方法; 

参考文章:《诡异的字符串问题。。。》

 

2, ExcelUtil.java

package cn.tedu.test.controller;

import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

/**
 * excel报表工具类
 */
public class ExcelUtil {

	private String filename = "";
	
	public ExcelUtil(String filename) {
		this.filename = filename;
	}
	
	public void buildExcelDocument(Workbook workbook, HttpServletResponse response) throws Exception {
		response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
		response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(filename + ".xlsx", "UTF-8"));
		OutputStream ouputStream = response.getOutputStream();
		workbook.write(ouputStream);
		ouputStream.flush();
		ouputStream.close();
	}
	
	// 填充表头和数据
	public void formData(List<String> headers, List<List<String>> data, Sheet sheet){
		int rowIndex = 0;
	    int colIndex = 0;
	    Row head= sheet.createRow(rowIndex++);
	    for (String title : headers) {
	    	Cell tCell = head.createCell(colIndex++);
	    	tCell.setCellValue(title);
		}
	    for (List<String>  record : data) {
	    	Row row = sheet.createRow(rowIndex++);
			colIndex = 0;
			for (String value : record) {
				Cell tCell = row.createCell(colIndex++);
				tCell.setCellValue(value);
			}
		}
	}

	public String getFilename() {
		return filename;
	}

	public void setFilename(String filename) {
		this.filename = filename;
	}
	
}

 

三, 前台代码实现

1, index,html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>guess</title>

<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript">
  //body加载完调用;
  $(function(){
	  //导出数据报表
	  $("#export").click(function(){
		  alert('导出报表')
		  window.open("/ssm_test/export.do");
		}
	  );
  });  
</script>


</head>
<body>
    <input type="button" value="导出数据报表" id="export">
</body>
</html>

 

四, 功能测试

1, 访问路径   

http://localhost:8080/ssm_test/

2, 如果访问被拦截, 需要设置下, 选中始终允许即ok!

3, 弹出自定义存储位置弹框, 点击保存, 保存成功即ok!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值