利用ExtJS导出Excel

  1 Ext.ns("Msp.Component");
  2 
  3 //config = {
  4 //    fileName : "净值及头寸核对",
  5 //    exportDate : "2014-01-20",
  6 //    dataSource : [
  7 //        {grid : grid1, param : param1, showType : true},
  8 //        {grid : grid2, param : param2, showType : false}
  9 //    ],
 10 //    hiddenColumnArr : ["assetName"],
 11 //    isMail : true,
 12 //    filePath : "C:\\mspMail\\"
 13 //}
 14 
 15 Msp.Component.PageToExcel = function(config){
 16     this.initialConfig = config;
 17     this.excel = null;
 18     this.workBook = null;
 19     this.sheet = null;
 20     
 21     //是否发送邮件
 22     this.isMail = false;
 23     //如果是发送邮件,生成excel附件的存放目录
 24     this.filePath = "C:\\mspMail\\";
 25     //导出日期,默认为当天
 26     this.exportDate = getCurDate();
 27     //定时执行垃圾回收的标识
 28     this.idTmr = "";
 29     this.dataSource = [];
 30     
 31     //过滤自定义不显示的列
 32     this.hiddenColumnArr = ['checked','checkerId','checkTime'];
 33     Ext.apply(this,config);
 34 };
 35 
 36 Msp.Component.PageToExcel.prototype = {
 37     
 38     /**
 39      * 创建excel对象
 40      */
 41     createExcel : function(){
 42         try{
 43             this.excel = new ActiveXObject("Excel.Application");
 44             //控制execl是否打开  true 打开  ,false  不打开
 45             this.excel.Visible = false;
 46             this.workBook = this.excel.Workbooks.Add();
 47             this.sheet = null;
 48         }catch(e){
 49             sofa.alert("请确认安装了非绿色版本的excel!"+e.description);
 50         }
 51     },
 52     
 53     /**
 54      * 关闭excle对象
 55      */
 56     closeExcel : function(){
 57         if(this.workBook != null){
 58             this.workBook.Close(SaveChanges=false);
 59         }
 60         if(this.excel != null){
 61             this.excel.Quit();
 62         }
 63         this.workBook = null;   
 64         this.sheet = null;
 65         //EXCEL.EXE进程清理
 66         this.idTmr = window.setInterval(this.cleanup,1);
 67     },
 68     
 69     /**
 70      * EXCEL.EXE进程清理
 71      */
 72     cleanup : function(){
 73         window.clearInterval(this.idTmr);
 74           window.CollectGarbage();
 75     },
 76     
 77     /**
 78      * 默认的sheet不够用时,添加额外的sheet
 79      */
 80     addSheetsExt : function(){
 81         //默认的sheet数量,经测试win7默认3个sheet,xp默认1个sheet
 82         var    defaultSheetNum = this.workBook.Sheets.count,
 83             count = 0;//需要sheet的个数
 84         for(var i = 0; i < this.dataSource.length; i++){
 85             //判断是否需要生成新的sheet,如果默认的sheet不够用则生成新的sheet
 86             if(this.dataSource[i].showType){
 87                 count++;
 88                 if(count > defaultSheetNum){
 89                     this.workBook.Sheets.add;
 90                 }
 91             }
 92         }    
 93     },
 94     
 95     /**
 96      * 生成一个excel文件
 97      */
 98     handleExcel : function(){
 99         
100         if(this.dataSource && this.dataSource.length > 0){
101             var layerNum = 0,//sheet的层数
102                 rowIndex = 0;//行索引
103             
104             this.addSheetsExt();
105             
106             for(var i = 0; i < this.dataSource.length; i++){
107                 if(this.dataSource[i].showType){
108                     layerNum ++;
109                     this.sheet = this.workBook.Worksheets(layerNum);
110                     this.sheet.name = "第【"+layerNum+"】层";
111                     
112                     //行索引归零
113                     rowIndex = 0;
114                 }
115                 //生成数据到sheet,并返回当前grid的总记录数
116                 var totalRecords = this.changeGridToExcel(this.dataSource[i].grid,this.dataSource[i].param,this.sheet,rowIndex);
117                 //保存grid查询出来的总记录数,方便以后统计异常记录数
118                 this.dataSource[i].total = totalRecords;
119                 if(totalRecords > 0){
120                     rowIndex = rowIndex + totalRecords + 3;
121                 }
122             }
123         }
124             
125     },
126     
127     /**
128      * 构建工作表的标题
129      * @param {} sheet 工作表
130      * @param {} rowIndex 行索引
131      * @param {} colNum 总列数
132      * @param {} titleName 标题名称
133      */
134     buildTitle : function(sheet, rowIndex, colNum, titleName){
135         /***************************************标题开始***********************************************/
136         //合并标题单元格
137         sheet.Range("A"+(rowIndex+1),sheet.Cells(rowIndex+1,colNum)).MergeCells=true;
138         //居中显示
139         sheet.Cells(rowIndex+1,1).HorizontalAlignment=3;
140         //设置粗体
141         sheet.Cells(rowIndex+1,1).Font.Bold=true;
142         //字体大小
143         sheet.Cells(rowIndex+1,1).Font.Size=15;
144         //字体颜色
145         sheet.Cells(rowIndex+1,1).Font.ColorIndex=10;
146         //模块名称
147         sheet.Cells(rowIndex+1,1).value = titleName;
148         /***************************************标题结束***********************************************/
149         
150         /***************************************导出日期开始*******************************************/
151         //合并时间单元格
152         sheet.Range("A"+(rowIndex+2),sheet.Cells(rowIndex+2,colNum)).MergeCells=true;
153         //居左显示
154         sheet.Cells(rowIndex+2,1).HorizontalAlignment=2;
155         //导出日期
156         sheet.Cells(rowIndex+2,1).value = this.exportDate;
157         /***************************************导出日期结束*******************************************/
158     },
159     
160     /**
161      * 构建工作表的内容
162      * @param {} sheet 工作表
163      * @param {} rowArr 行数组
164      * @param {} columnArr 列数组
165      * @param {} rowIndex 行索引
166      * @return {} 工作表的列数
167      */
168     buildContent : function(sheet, rowArr, columnArr, rowIndex){
169         //标题行、日期行、表头行占三行
170         var startIndex = rowIndex + 3;
171         /***************************************内容设置开始***********************************************/
172         for (var i = 0;i< rowArr.length; i++){ 
173             var count = 1;
174             for(var j = 0;j< columnArr.length;j++){
175                 //列出不隐藏的列
176                 if(columnArr[j].hidden == undefined && !Ext.isEmpty(columnArr[j].dataIndex) ){
177                     //过滤自定义不显示的列
178                     if(this.hiddenColumnArr && this.hiddenColumnArr.indexOf(columnArr[j].dataIndex) > -1){
179                         continue;
180                     }    
181                     //居中显示
182                     sheet.Cells(startIndex+1+i,count).HorizontalAlignment=3;
183                     //边框样式
184                     sheet.Cells(startIndex+1+i,count).Borders.LineStyle=1;
185                     //单元格边框颜色
186                     sheet.Cells(startIndex+1+i,count).Borders.ColorIndex=10;
187                     //将单元置为文本,避免非数字列被自动变成科学计数法和丢失前缀的0
188                     sheet.Cells(startIndex+1+i,count).NumberFormat = "@";
189                     
190                     var viewValue = rowArr[i][columnArr[j].dataIndex];
191                     if(columnArr[j].renderer != undefined && !Ext.isEmpty(viewValue)){
192                         //页面渲染时需要使用当前行的数据作为判断条件
193                         var rdata = {};
194                         rdata.data = rowArr[i];
195                         viewValue = columnArr[j].renderer(viewValue,null,rdata);
196                     }
197                     if(viewValue == undefined){
198                         viewValue = '';
199                     }
200                     if(viewValue != null){
201                         viewValue = Ext.util.Format.trim(viewValue.toString());//去空格
202                     }
203                     //viewValue 前面加空格是为了处理 2/2的数据格式,cells默认会理解为日期
204                     sheet.Cells(startIndex+1+i,count).value = " "+viewValue;
205                     count++;
206                 }
207             } 
208         }
209         /***************************************内容设置结束***********************************************/
210         return count - 1;
211     },
212     
213     /**
214      * 构建工作表的列头
215      * @param {} sheet 工作表
216      * @param {} columnArr 列头数组
217      * @param {} rowIndex 行索引
218      */
219     buildHeader : function(sheet, columnArr, rowIndex){
220         /***************************************列头设置开始***********************************************/
221         //标题行、日期行、表头行占三行
222         var startIndex = rowIndex + 3;
223         var count = 1;
224         for (var i = 0 ;i < columnArr.length; i++){
225             //列出不隐藏的列头项并排除序号列和复选框列
226             if(!columnArr[i].hidden && 
227                (columnArr[i].header && columnArr[i].header.length>0 && columnArr[i].header != '序号') &&
228                 columnArr[i].id != 'checker'){
229                 //过滤自定义不显示的列
230                 if(this.hiddenColumnArr && this.hiddenColumnArr.indexOf(columnArr[i].dataIndex) > -1){
231                     continue;
232                 }    
233                 //居中显示
234                 sheet.Cells(startIndex,count).HorizontalAlignment=3;
235                 //设置粗体
236                 sheet.Cells(startIndex,count).Font.Bold=true;
237                 //列头名称
238                 sheet.Cells(startIndex,count).value = columnArr[i].header;
239                 //边框样式
240                 sheet.Cells(startIndex,count).Borders.LineStyle=1;
241                 //单元格边框颜色
242                 sheet.Cells(startIndex,count).Borders.ColorIndex=10;
243                 //单元格底色
244                 sheet.Cells(startIndex,count).Interior.ColorIndex=2;
245                 count++;
246             }
247         }
248         /***************************************列头设置结束***********************************************/
249     },
250     
251     /**
252      * 将grid的数据写入到sheet中
253      * @param {} grid 表格
254      * @param {} param 查询参数
255      * @param {} sheet 当前工作表
256      * @param {} rowIndex 行索引,记录写入行的起始位置
257      * @return {} 总记录数
258      */
259     changeGridToExcel : function(grid, param, sheet,rowIndex){
260         var totalRecords = 0;
261         sofa.api.request({
262               url:grid.url,
263               params : param,
264               method:'post',
265               async:false,
266               success: function(response){
267                   var rowArr = null;//行数组
268                   if(typeof response.responseText == 'string'){
269                       rowArr = Ext.decode(response.responseText);
270                   }
271                   if(rowArr == null || rowArr.length == 0){
272                       return 0;
273                   }
274                   var columnArr = grid.getColumnModel().config;//列数组
275                 try{
276                     //生成内容
277                     var colNum = this.buildContent(sheet, rowArr, columnArr, rowIndex);
278                     //生成列头
279                     this.buildHeader(sheet, columnArr, rowIndex);
280                     //标题
281                     var titleName = (sheet.name == '第【1】层' ? this.fileName : rowArr[0]['bizName']);
282                     //生成标题
283                     this.buildTitle(sheet, rowIndex, colNum,titleName);
284                     //列自增长
285                     sheet.Columns.AutoFit();
286                     totalRecords = rowArr.length;
287                 }catch(e){
288                 }
289             },
290             scope:this
291         });
292         return totalRecords;
293     },
294     
295     /**
296      * 保存
297      */
298     saveExcel :function(){
299         var savePath = null;
300         //导出发送邮件用的excel文件
301         if(this.isMail){
302             //无异常记录不保存
303             if(this.dataSource[0].total != 0){
304                 savePath = this.filePath+this.fileName+".xls";
305                 if(!Ext.isEmpty(savePath)){
306                     this.sheet.SaveAs(savePath);
307                 }
308             }
309         //默认的excel导出
310         }else{
311             savePath = this.excel.Application.GetSaveAsFilename(this.fileName+".xls","Excel Spreadshsheets (*.xls),*.xls,(*.xlsx),*.xlsx");
312             if(!Ext.isEmpty(savePath)){
313                 this.sheet.SaveAs(savePath);
314             }
315         }    
316     },
317     
318     /**
319      * excel导出
320      */
321     exportExcel : function(){
322         try{
323             this.createExcel();
324             this.handleExcel();
325             this.saveExcel();
326         }catch(e){
327         }finally{
328             this.closeExcel();
329         }
330     }
331 };

 

你可能感兴趣的:(利用ExtJS导出Excel)