您的位置:首页 > 编程语言 > Java开发

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

2016-08-24 11:13 706 查看
最近需求:把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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: