ExtJS Grid导出excel文件

删除回忆录丶 提交于 2020-03-29 19:21:10

ExtJS Grid导出excel文件,

需下载POI:链接:http://pan.baidu.com/s/1i3lkPhF 密码:rqbg

1、将Grid表格数据连同表格列名传到后台

2、后台导出excel文件,返回相对路径

3、根据相对路径,下载excel文件

 

JS代码,按钮点击事件

 1     /**
 2      *点击“导出”按钮触发事件
 3      *
 4      */
 5     onClickExport:function(btn){
 6 //        获取表格数据
 7         var conditionForm = btn.up('form');
 8         var grid = conditionForm.nextSibling('grid');
 9         var store = grid.getStore();
10         var obj = {};
11         obj.projectIncomes = this.tools.storeToArray(store);
12         if(obj.projectIncomes.length != 0){
13             obj.projectIncomes.splice(0, 0, this.tools.getColumnName(grid));
14             this.exportExcel(obj)
15         }else{
16             Ext.Msg.alert('提示', '表格中无数据,请先执行查询操作!');
17         }
18         
19     },
20     
21     /**
22      *导出excel
23      *
24      */
25     exportExcel : function(obj) {
26         var httpParams = this.tools.objectToHttpOgnlParams(obj,null,3);
27         Ext.Ajax.request({
28             url : 'projectIncomeToExcel.action',
29             params : httpParams,
30             method : 'post',
31             waitMsg:'稍安勿躁...',
32             success : function(xmlHttpRequest) {
33                 var serverFilePathRelativeToWebappRoot = Ext.decode(xmlHttpRequest.responseText).fileServerPaths;
34                 window.open(serverFilePathRelativeToWebappRoot);
35             },
36             failure : function() {
37                 Ext.Msg.alert('悲剧', '数据导出失败,请重试');
38             } 
39         });
40     },
41     
42     privates : {
43         tools : Ext.create('MyApp.Tools')
44     }

tools工具

 1     /**
 2      * storeToArray
 3      */
 4     storeToArray:function(store){
 5         var arr = Ext.pluck(store.data.items, 'data');
 6         return arr;
 7     },
 8     
 9     /**
10      * 获取grid的所有列
11      * 返回对象columnName
12      * 属性为列dataIndex,值为列text
13      */
14     getColumnName:function(grid){
15         var columnName  = {};
16         for(var i = 0; i < grid.columns.length; i++){
17             columnName[grid.columns[i].dataIndex] = grid.columns[i].text;
18         };
19         return columnName;
20     },

后台ation文件

 1 public class ProjectIncomeToExcelAction extends AbstractAction{
 2 
 3     private static final long serialVersionUID = 1L;
 4 
 5     private List<ProjectIncomeStatistics> projectIncomes;
 6     
 7     private String fileServerPath;
 8 
 9     @Override
10     protected void doAction() {
11 //        生成excel表格
12         fileServerPath = ExportExcelUtils.<ProjectIncomeStatistics>getExcelFileServerPath(projectIncomes,"项目收入明细表");
13 //        清空返回值projectIncomes
14         projectIncomes.clear();
15     }
16 
17     public List<ProjectIncomeStatistics> getProjectIncomes() {
18         return projectIncomes;
19     }
20 
21     public void setProjectIncomes(List<ProjectIncomeStatistics> projectIncomes) {
22         this.projectIncomes = projectIncomes;
23     }
24     
25     public String getFileServerPaths() {
26         return fileServerPath;
27     }
28 
29     public void setFileServerPaths(String fileServerPath) {
30         this.fileServerPath = fileServerPath;
31     }
32 
33 }

导出excel工具类

  1 public class ExportExcelUtils {
  2     
  3     /**
  4      * webappRoot绝对路径
  5      */
  6     public static String ROOT = System.getProperty("td_oa.root")+File.separator ;
  7     
  8     
  9     /**
 10     * 生成并导出    
 11     * 
 12     * @param  List<O> objs 对象List,O 对象类型
 13     * @param  String name 文件名
 14     * @return String[] fileServerPath 文件相对路径
 15     */
 16 //    @SuppressWarnings("deprecation")
 17     public static <O> String getExcelFileServerPath(List<O> objs,String name){
 18         
 19         
 20         HSSFWorkbook wb = new HSSFWorkbook();
 21         HSSFSheet sheet = wb.createSheet(name);
 22         HSSFRow row = sheet.createRow((int) 0);
 23         HSSFCellStyle style = wb.createCellStyle();
 24 //        设置单元格居中
 25         style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
 26         
 27 //        获取对象属性名,返回值filedName第一个为自带属性,不是我们要的
 28         String[] filedName = getFiledName(objs.get(0));
 29 //        每一行
 30         for(int i=0;i<objs.size();i++){
 31             O obj = objs.get(i);
 32             row = sheet.createRow((int) i );
 33 //            该行的每一列,返回值filedName第一个为自带属性,不是我们要的,所以从j=1开始
 34             for(int j = 1 ; j < filedName.length ; j++){
 35                 HSSFCell cell = row.createCell((short) j - 1);
 36                 cell.setCellValue(getFieldValueByName(filedName[j], obj));
 37                 cell.setCellStyle(style);
 38             }
 39         }
 40 //        保存文件并返回相对路径
 41         String fileServerPath = getFileServerPath( wb, name);
 42 
 43         return fileServerPath;
 44     }
 45     
 46     /**
 47     * 获取对象属性,返回一个字符串数组    
 48     * 
 49     * @param  o 对象
 50     * @return String[] 字符串数组
 51     */
 52     private static String[] getFiledName(Object o){  
 53         try {
 54             Field[] fields = o.getClass().getDeclaredFields();
 55             String[] fieldNames = new String[fields.length];  
 56             for (int i=0; i < fields.length; i++){  
 57                 fieldNames[i] = fields[i].getName();  
 58             }  
 59             return fieldNames;
 60         } catch (SecurityException e){
 61             e.printStackTrace();
 62             System.out.println(e.toString());
 63         }
 64             return null;
 65     }  
 66 
 67     /**
 68     * 使用反射根据属性名称获取属性值 
 69     * 
 70     * @param  fieldName 属性名称
 71     * @param  o 操作对象
 72     * @return String 属性值
 73     */
 74 
 75     private static  String getFieldValueByName(String fieldName, Object o){    
 76        try {    
 77            String firstLetter = fieldName.substring(0, 1).toUpperCase();    
 78            String getter = "get" + firstLetter + fieldName.substring(1);    
 79            Method method = o.getClass().getMethod(getter, new Class[] {});    
 80            Object value = method.invoke(o, new Object[] {});    
 81            return (String) value;    
 82        } catch (Exception e) {    
 83            System.out.println("属性不存在");    
 84            return null;    
 85        }    
 86     }  
 87      
 88     
 89     /**
 90     * 保存excel文件,并返回相对路径    
 91     * 
 92     * @param  HSSFWorkbook wb 需保存的excel文件
 93     * @param  String name 文件名
 94     * @return String fileServerPath返回相对路径
 95     */
 96     private static String getFileServerPath(HSSFWorkbook wb,String name){
 97         String fileServerPath = "";
 98         try{
 99             fileServerPath = "files\\export\\";
100 //            绝对路径
101             fileServerPath = getAbsolutePath(fileServerPath);
102 //            校验路径是否存在,不存在则新建 
103             mkDirs(fileServerPath);
104 //            路径中添加文件名
105             fileServerPath = fileServerPath + name + ".xls" ;
106 //            保存文件
107             FileOutputStream fout = new FileOutputStream(fileServerPath);
108             wb.write(fout);
109             fout.close();
110 //            获取相对路径
111             fileServerPath = getPathRelativeToWebappRoot(fileServerPath);
112         }catch(Exception err){
113             err.printStackTrace();
114         }
115             return fileServerPath;
116     } 
117     
118     
119     /**
120      * 根据相对路径获取绝对路径
121      * @param serverFilePathRelativeToWebappRoot
122      */
123     private static String getAbsolutePath(String serverFilePathRelativeToWebappRoot){
124         return ROOT + serverFilePathRelativeToWebappRoot;
125     }
126     
127     /**
128      * 根据绝对路径获取相对于webapp的路径
129      */
130     private static String getPathRelativeToWebappRoot(String absolutePath){
131         return StringUtils.removeStart(absolutePath, ROOT);
132     }
133     
134     
135     /**
136     * 校验路径是否存在,不存在则新建   
137     * 
138     * @param  String path 绝对路径
139     */
140     private static void mkDirs(String path) {
141         File dir = new File(path);
142         if (!dir.exists()) {
143             dir.mkdirs();
144         }
145     }
146 
147 }

最终效果

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!