JAVA项目后台查询的数据生成Excel表格并提供给用户下载

最近需求:把Hive语句查询出来的数据在生成Excel,并提供给用户下载

想了2方案,第一种自然就是用js,但是有个问题,浏览器需要安装插件

第二种方法就是在后台生成文件,存放到服务器里,通过数据集来把数据塞到文件里,后缀名为.xls,这种方法明显靠谱得多嘛

第一步:JSP页面添加一个按钮,给个URL能跳转到相应的Controller的方法里

"<a href=\"/hiveadmin/exportExcel.do?id="+haJob.getId()+"&jobType="+ haJob.getJobType()+"&jobName="+ haJob.getJobName() + " \" title='导出数据'>导出数据</a>"
传了三个参数 ,id,name,type,id用于后面查找到底是哪个数据(因为查询出来的数据我先保存为txt文件,这个txt文件带有固定编号,id用于定位txt文件),name就是生成的excel的名字,jobType用来获取excel表格表头的名字(这些表头名称存放在一个单独的表中)

第二步:在Controller里新加方法,用于查询数据

@RequestMapping(value = "/exportExcel")
    public ModelAndView exportExcel(HttpServletRequest request, HttpServletResponse response, ModelMap model) {
    	
    	List<Map<String, Object>> rowlst = new ArrayList<Map<String, Object>>();
    	
    	String jobId = request.getParameter("id");
    	String jobType = request.getParameter("jobType") ;
    	String jobName = request.getParameter("jobName") ;
    	
    	// 读取数据文本内容
    	File file = new File(HiveAdminJobConstants.JOB_WORK_DATA_DIR + "/data-" + jobId + ".txt");
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(file));
            String line = null;
            int n = 0;
            // 一次读入一行,直到读入null为文件结束
            while ((line = reader.readLine()) != null) {
                String[] arryLine = line.split(",");
                Map<String, Object> map = new HashMap<String, Object>();
                for (int i = 0; i < arryLine.length; i++) {
                    map.put(String.valueOf(i), arryLine[i]);
                }
                rowlst.add(map);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                }
            }
        }
        
        if(jobName == null){
        	jobName = "未命名" ;
        }
        
        //获取表头
        HiveAdminJobTemplate template = hiveAdminJobTemplateService.getHiveAdminJobTemplateByUid(jobType);
        List<String> colTitleList = new ArrayList<String>();
        if (template != null) {
            String strListTitle = template.getShowListTitle();
            String[] arryListTitle = strListTitle.split(",");
            for (int i = 0; i < arryListTitle.length; i++) {
                colTitleList.add(arryListTitle[i]);
            }
        }
        
        model.put("colTitleList", colTitleList) ;
        model.put("exclName", jobName) ;
        model.put("list", rowlst) ;
    	
    	return new ModelAndView(new HiveAdminStatDateExportExcelView(), model);
    }
注意上面的方法的返回值类型:ModelAndView,不是String

return一个 new ModelAndView,事实上new的事HiveAdminStatDateExportExcelView(),我把参数model给他,model里存了数据集、文件名、表头名

那么HiveAdminStatDateExportExcelView()是什么呢,他其实是个类,是excel文件的生成策略

/**
 * 生成excel视图,可用excel工具打开或者保存 由ViewController的return new ModelAndView(viewExcel,
 * model)生成
 */
public class HiveAdminStatDateExportExcelView extends AbstractExcelView {
	@SuppressWarnings("unchecked")
	public void buildExcelDocument(Map model, HSSFWorkbook workbook, HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		// 设置文件名称
		String jobName = model.get("exclName").toString() ;
		String excelName = jobName+".xls";
		// 设置sheet名称
		String sheetName = jobName;

		// 设置response方式,使执行此controller时候自动出现下载页面,而非直接使用excel打开
		response.setContentType("APPLICATION/OCTET-STREAM");
		response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(excelName, "UTF-8"));

		// Excel表头
		HSSFSheet sheet = workbook.createSheet(sheetName);

		// 产生标题列
		List<String> headerNamesList = new ArrayList<String>() ;
		headerNamesList = (List<String>) model.get("colTitleList") ;
		String[] headerNames = new String[headerNamesList.size()] ;
		for(int i=0; i<headerNamesList.size(); i++){
			headerNames[i] = headerNamesList.get(i) ;
		}
		SpringExcelUtil excelUtil = new SpringExcelUtil();
		excelUtil.setHeader(sheet, headerNames);

		//
		HSSFCellStyle cellStyle = workbook.createCellStyle();
		cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("mm/dd/yyyy"));

		// 填充数据
		List<Map<String, Object>> stuList = (List<Map<String, Object>>) model.get("list");
		for (Map<String, Object> map : stuList) {
			if (map != null) {
				String[] data = new String[map.size()];
				for(int j=0; j<map.size(); j++){
					data[j] = String.valueOf(map.get(String.valueOf(j))) ;
				}
				excelUtil.addRecord(sheet, data);
			}
		}
	}
}

完成以上步骤,就实现了excel表格后台生成,前台获取的功能了!


点击导出数据:


下载成功,打开看看:


OK。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值