jqGrid结合POI实现自定义Excel列导出
通过之前讲过的jqGrid的columnChooser可以动态隐藏或者显示列,将显示列的列名和字段名传入后端,通过POI就可以实现自定义字段导出Excel
以下是js代码
- $(function(){
- //页面加载完成之后执行
- pageInit();
- });
- function pageInit(){
- //创建jqGrid组件
- jQuery("#list2").jqGrid(
- {
- url : \'selectAll\',//组件创建完成之后请求数据的url
- datatype : "json",//请求数据返回的类型。可选json,xml,txt
- colModel : [ //jqGrid每一列的配置信息。包括名字,索引,宽度,对齐方式.....
- {label : \'学号\',name : \'id\',width : 255},
- {label : \'姓名\',name : \'name\',width : 300},
- {label : \'年龄\',name : \'age\',width : 290},
- ],
- rowNum : 10,//一页显示多少条
- rowList : [ 10, 20, 30 ],//可供用户选择一页显示多少条
- pager : \'#pager2\',//表格页脚的占位符(一般是div)的id
- mtype : "post",//向后台请求数据的ajax的类型。可选post,get
- viewrecords : true,
- caption : "JSON Example"//表格的标题名字
- });
- $("#list2").jqGrid(\'navGrid\',\'#pager2\',{add:false,edit:false,del:false,search:false,refresh:false});
- $("#list2").jqGrid(\'navButtonAdd\',\'#pager2\',{
- caption: "Columns",
- title: "Reorder Columns",
- onClickButton : function (){
- $("#list2").jqGrid(\'columnChooser\');
- }
- });
- }
- $("#export").click(function () {
- var columns = $("#list2").jqGrid("getGridParam","colModel");
- var nameList = new Array();
- var indexList = new Array();
- columns.forEach(function (column) {
- //将非隐藏的字段名和字段抽取出来
- if(column.hidden == false){
- nameList.push(column.label);
- indexList.push(column.name);
- }
- })
- //这里之所以用跳转是因为ajax不能进行下载,数组直接拼接
- window.location.href = "export?indexList=" + indexList + "&nameList=" + nameList;
- });
HTML代码就不贴了,在之前的博客中有现成的可以下载,放一张页面的效果图,隐藏一列
Controller端代码
- public void export(HttpServletRequest request, HttpServletResponse response,String[]indexList,String[]nameList){
- //获取数组
- List<Person> list = userMapper.select();
- //通过传入Class,列名以及字段名的数组得到service处理后的workbook
- HSSFWorkbook workbook = exportService.getWorkbook(Person.class,nameList,indexList,list);
- String fileName = "test.xls";
- //xls对应的content-type
- response.setContentType("application/x-xls");
- //通知浏览器下载附件
- response.setHeader("Content-Disposition","attachment;fileName=" + fileName);
- OutputStream out = null;
- try{
- out = response.getOutputStream();
- workbook.write(out);
- }catch(Exception e){
- e.printStackTrace();
- }finally {
- try {
- out.flush();
- out.close();
- workbook.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
Service的处理代码
- public HSSFWorkbook getWorkbook(Class cls , String[]nameList, String[] indexList, List<Person> persons){
- HSSFWorkbook workbook = null;
- try{
- workbook = new HSSFWorkbook();
- //生成一个sheet
- HSSFSheet sheet = workbook.createSheet();
- //创建第一行标题
- Row row = sheet.createRow(0);
- //根据传入的name创建cell并赋值
- for(int i = 0; i < nameList.length; i++){
- Cell c = row.createCell(i);
- c.setCellValue(nameList[i]);
- }
- for(int i = 0; i < persons.size(); i++){
- Person p = persons.get(i);
- //第一行为标题,从第二行开始插入数据
- row = sheet.createRow(i+1);
- //遍历字段数组通过类的反射获取get方法得到数据
- for(int j = 0; j < indexList.length; j++){
- String methodName = "get" + indexList[j].substring(0,1).toUpperCase() + indexList[j].substring(1);
- Method method = cls.getDeclaredMethod(methodName);
- Object obj = method.invoke(p);
- if(obj == null){
- obj = "";
- }
- Cell c = row.createCell(j);
- c.setCellValue(obj.toString());
- }
- }
- }catch (Exception e){
- e.printStackTrace();
- }
- return workbook;
- }
生成的Excel预览
代码写的比较粗糙,service处理workbook那也只是写了一个大概,具体对值的处理以及cell样式也没有涉及。这里只是提供一个导出的思路供大家参考
版权声明:本文为guofx原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。