碼農往事
          我的代碼為什么這么丑?一定是因為我長的不好看
          posts - 29,comments - 86,trackbacks - 0
          這兩天項目上要求做一個導出Excel的功能,項目前臺用的ExtJS,后臺用的JAVA,網上查了查,大概有3種做法。
          1.apache公司提供的POI
          2.韓國公司的JXL
          3.據說是官方提供的JS調用方法
          前兩種都要引入外包,懶得找包了,采用了第三種,所需引入JS代碼如下:
          /Files/rockblue1988/export.txt 
          /**
           * allows for downloading of grid data (store) directly into excel
           * Method: extracts data of gridPanel store, uses columnModel to construct XML excel document,
           * converts to Base64, then loads everything into a data URL link.
           *
           * 
          @author        Animal        <extjs support team>
           *
           
          */

          /**
           * base64 encode / decode
           *
           * @location     
          http://www.webtoolkit.info/
           *
           
          */

          var Base64 
          = (function() {
              
          // Private property
              var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

              
          // Private method for UTF-8 encoding
              function utf8Encode(string) {
                  string 
          = string.replace(/\r\n/g,"\n");
                  var utftext 
          = "";
                  
          for (var n = 0; n < string.length; n++) {
                      var c 
          = string.charCodeAt(n);
                      
          if (c < 128) {
                          utftext 
          += String.fromCharCode(c);
                      }
                      
          else if((c > 127&& (c < 2048)) {
                          utftext 
          += String.fromCharCode((c >> 6| 192);
                          utftext 
          += String.fromCharCode((c & 63| 128);
                      }
                      
          else {
                          utftext 
          += String.fromCharCode((c >> 12| 224);
                          utftext 
          += String.fromCharCode(((c >> 6& 63| 128);
                          utftext 
          += String.fromCharCode((c & 63| 128);
                      }
                  }
                  
          return utftext;
              }

              
          // Public method for encoding
              return {
                  encode : (typeof btoa 
          == 'function'? function(input) {
                      
          return btoa(utf8Encode(input));
                  } : function (input) {
                      var output 
          = "";
                      var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
                      var i 
          = 0;
                      input 
          = utf8Encode(input);
                      
          while (i < input.length) {
                          chr1 
          = input.charCodeAt(i++);
                          chr2 
          = input.charCodeAt(i++);
                          chr3 
          = input.charCodeAt(i++);
                          enc1 
          = chr1 >> 2;
                          enc2 
          = ((chr1 & 3<< 4| (chr2 >> 4);
                          enc3 
          = ((chr2 & 15<< 2| (chr3 >> 6);
                          enc4 
          = chr3 & 63;
                          
          if (isNaN(chr2)) {
                              enc3 
          = enc4 = 64;
                          } 
          else if (isNaN(chr3)) {
                              enc4 
          = 64;
                          }
                          output 
          = output +
                          keyStr.charAt(enc1) 
          + keyStr.charAt(enc2) +
                          keyStr.charAt(enc3) 
          + keyStr.charAt(enc4);
                      }
                      
          return output;
                  }
              };
          })();

          Ext.override(Ext.grid.GridPanel, {
              getExcelXml: function(includeHidden) {
                  var worksheet 
          = this.createWorksheet(includeHidden);
                  var totalWidth 
          = this.getColumnModel().getTotalWidth(includeHidden);
                  
          return '<xml version="1.0" encoding="utf-8">' +
                      
          '<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:o="urn:schemas-microsoft-com:office:office">' +
                      
          '<o:DocumentProperties><o:Title>' + this.title + '</o:Title></o:DocumentProperties>' +
                      
          '<ss:ExcelWorkbook>' +
                      
          '<ss:WindowHeight>' + worksheet.height + '</ss:WindowHeight>' +
                      
          '<ss:WindowWidth>' + worksheet.width + '</ss:WindowWidth>' +
                      
          '<ss:ProtectStructure>False</ss:ProtectStructure>' +
                      
          '<ss:ProtectWindows>False</ss:ProtectWindows>' +
                      
          '</ss:ExcelWorkbook>' +
                      
          '<ss:Styles>' +
                      
          '<ss:Style ss:ID="Default">' +
                      
          '<ss:Alignment ss:Vertical="Top" ss:WrapText="1" />' +
                      
          '<ss:Font ss:FontName="arial" ss:Size="10" />' +
                      
          '<ss:Borders>' +
                      
          '<ss:Border ss:Color="#e4e4e4" ss:Weight="1" ss:LineStyle="Continuous" ss:Position="Top" />' +
                      
          '<ss:Border ss:Color="#e4e4e4" ss:Weight="1" ss:LineStyle="Continuous" ss:Position="Bottom" />' +
                      
          '<ss:Border ss:Color="#e4e4e4" ss:Weight="1" ss:LineStyle="Continuous" ss:Position="Left" />' +
                      
          '<ss:Border ss:Color="#e4e4e4" ss:Weight="1" ss:LineStyle="Continuous" ss:Position="Right" />' +
                      
          '</ss:Borders>' +
                      
          '<ss:Interior />' +
                      
          '<ss:NumberFormat />' +
                      
          '<ss:Protection />' +
                      
          '</ss:Style>' +
                      
          '<ss:Style ss:ID="title">' +
                      
          '<ss:Borders />' +
                      
          '<ss:Font />' +
                      
          '<ss:Alignment ss:WrapText="1" ss:Vertical="Center" ss:Horizontal="Center" />' +
                      
          '<ss:NumberFormat ss:Format="@" />' +
                      
          '</ss:Style>' +
                      
          '<ss:Style ss:ID="headercell">' +
                      
          '<ss:Font ss:Bold="1" ss:Size="10" />' +
                      
          '<ss:Alignment ss:WrapText="1" ss:Horizontal="Center" />' +
                      
          '<ss:Interior ss:Pattern="Solid" ss:Color="#A3C9F1" />' +
                      
          '</ss:Style>' +
                      
          '<ss:Style ss:ID="even">' +
                      
          '<ss:Interior ss:Pattern="Solid" ss:Color="#CCFFFF" />' +
                      
          '</ss:Style>' +
                      
          '<ss:Style ss:Parent="even" ss:ID="evendate">' +
                      
          '<ss:NumberFormat ss:Format="yyyy-mm-dd" />' +
                      
          '</ss:Style>' +
                      
          '<ss:Style ss:Parent="even" ss:ID="evenint">' +
                      
          '<ss:NumberFormat ss:Format="0" />' +
                      
          '</ss:Style>' +
                      
          '<ss:Style ss:Parent="even" ss:ID="evenfloat">' +
                      
          '<ss:NumberFormat ss:Format="0.00" />' +
                      
          '</ss:Style>' +
                      
          '<ss:Style ss:ID="odd">' +
                      
          '<ss:Interior ss:Pattern="Solid" ss:Color="#CCCCFF" />' +
                      
          '</ss:Style>' +
                      
          '<ss:Style ss:Parent="odd" ss:ID="odddate">' +
                      
          '<ss:NumberFormat ss:Format="yyyy-mm-dd" />' +
                      
          '</ss:Style>' +
                      
          '<ss:Style ss:Parent="odd" ss:ID="oddint">' +
                      
          '<ss:NumberFormat ss:Format="0" />' +
                      
          '</ss:Style>' +
                      
          '<ss:Style ss:Parent="odd" ss:ID="oddfloat">' +
                      
          '<ss:NumberFormat ss:Format="0.00" />' +
                      
          '</ss:Style>' +
                      
          '</ss:Styles>' +
                      worksheet.xml 
          +
                      
          '</ss:Workbook>';
              },

              createWorksheet: function(includeHidden) {
                  
          // Calculate cell data types and extra class names which affect formatting
                  var cellType = [];
                  var cellTypeClass 
          = [];
                  var cm 
          = this.getColumnModel();
                  var totalWidthInPixels 
          = 0;
                  var colXml 
          = '';
                  var headerXml 
          = '';
                  var visibleColumnCountReduction 
          = 0;
                  var colCount 
          = cm.getColumnCount();
                  
          for (var i = 0; i < colCount; i++) {
                      
          if ((cm.getDataIndex(i) != '')
                          
          && (includeHidden || !cm.isHidden(i))) {
                          var w 
          = cm.getColumnWidth(i)
                          totalWidthInPixels 
          += w;
                          
          if (cm.getColumnHeader(i) === ""){
                              cellType.push(
          "None");
                              cellTypeClass.push(
          "");
                              
          ++visibleColumnCountReduction;
                          }
                          
          else
                          {
                              colXml 
          += '<ss:Column ss:AutoFitWidth="1" ss:Width="' + w + '" />';
                              headerXml 
          += '<ss:Cell ss:StyleID="headercell">' +
                                  
          '<ss:Data ss:Type="String">' + cm.getColumnHeader(i) + '</ss:Data>' +
                                  
          '<ss:NamedCell ss:Name="Print_Titles" /></ss:Cell>';
                              var fld 
          = this.store.recordType.prototype.fields.get(cm.getDataIndex(i));
                              
          switch(fld.type) {
                                  
          case "int":
                                      cellType.push(
          "Number");
                                      cellTypeClass.push(
          "int");
                                      
          break;
                                  
          case "float":
                                      cellType.push(
          "Number");
                                      cellTypeClass.push(
          "float");
                                      
          break;
                                  
          case "bool":
                                  
          case "boolean":
                                      cellType.push(
          "String");
                                      cellTypeClass.push(
          "");
                                      
          break;
                                  
          case "date":
                                      cellType.push(
          "DateTime");
                                      cellTypeClass.push(
          "date");
                                      
          break;
                                  
          default:
                                      cellType.push(
          "String");
                                      cellTypeClass.push(
          "");
                                      
          break;
                              }
                          }
                      }
                  }
                  var visibleColumnCount 
          = cellType.length - visibleColumnCountReduction;

                  var result 
          = {
                      height: 
          9000,
                      width: Math.floor(totalWidthInPixels 
          * 30+ 50
                  };

                  
          // Generate worksheet header details.
                  var t = '<ss:Worksheet ss:Name="' + this.title + '">' +
                      
          '<ss:Names>' +
                      
          '<ss:NamedRange ss:Name="Print_Titles" ss:RefersTo="=\'' + this.title + '\'!R1:R2" />' +
                      
          '</ss:Names>' +
                      
          '<ss:Table x:FullRows="1" x:FullColumns="1"' +
                      
          ' ss:ExpandedColumnCount="' + (visibleColumnCount + 2+
                      
          '" ss:ExpandedRowCount="' + (this.store.getCount() + 2+ '">' +
                      colXml 
          +
                      
          '<ss:Row ss:Height="38">' +
                      
          '<ss:Cell ss:StyleID="title" ss:MergeAcross="' + (visibleColumnCount - 1+ '">' +
                      
          '<ss:Data xmlns:html="http://www.w3.org/TR/REC-html40" ss:Type="String">' +
                      
          '<html:B></html:B></ss:Data><ss:NamedCell ss:Name="Print_Titles" />' +
                      
          '</ss:Cell>' +
                      
          '</ss:Row>' +
                      
          '<ss:Row ss:AutoFitHeight="1">' +
                      headerXml 
          +
                      
          '</ss:Row>';

                  
          // Generate the data rows from the data in the Store
                  for (var i = 0, it = this.store.data.items, l = it.length; i < l; i++) {
                      t 
          += '<ss:Row>';
                      var cellClass 
          = (i & 1? 'odd' : 'even';
                      r 
          = it[i].data;
                      var k 
          = 0;
                      
          for (var j = 0; j < colCount; j++) {
                          
          if ((cm.getDataIndex(j) != '')
                              
          && (includeHidden || !cm.isHidden(j))) {
                              var v 
          = r[cm.getDataIndex(j)];
                              
          if (cellType[k] !== "None") {
                                  t 
          += '<ss:Cell ss:StyleID="' + cellClass + cellTypeClass[k] + '"><ss:Data ss:Type="' + cellType[k] + '">';
                                  
          if (cellType[k] == 'DateTime') {
                                      t 
          += v.format('Y-m-d');
                                  } 
          else {
                                      t 
          += v;
                                  }
                                  t 
          +='</ss:Data></ss:Cell>';
                              }
                              k
          ++;
                          }
                      }
                      t 
          += '</ss:Row>';
                  }

                  result.xml 
          = t + '</ss:Table>' +
                      
          '<x:WorksheetOptions>' +
                      
          '<x:PageSetup>' +
                      
          '<x:Layout x:CenterHorizontal="1" x:Orientation="Landscape" />' +
                      
          '<x:Footer x:Data="Page &amp;P of &amp;N" x:Margin="0.5" />' +
                      
          '<x:PageMargins x:Top="0.5" x:Right="0.5" x:Left="0.5" x:Bottom="0.8" />' +
                      
          '</x:PageSetup>' +
                      
          '<x:FitToPage />' +
                      
          '<x:Print>' +
                      
          '<x:PrintErrors>Blank</x:PrintErrors>' +
                      
          '<x:FitWidth>1</x:FitWidth>' +
                      
          '<x:FitHeight>32767</x:FitHeight>' +
                      
          '<x:ValidPrinterInfo />' +
                      
          '<x:VerticalResolution>600</x:VerticalResolution>' +
                      
          '</x:Print>' +
                      
          '<x:Selected />' +
                      
          '<x:DoNotDisplayGridlines />' +
                      
          '<x:ProtectObjects>False</x:ProtectObjects>' +
                      
          '<x:ProtectScenarios>False</x:ProtectScenarios>' +
                      
          '</x:WorksheetOptions>' +
                      
          '</ss:Worksheet>';
                  
          return result;
              }
          });
          ExtJS中的導出按鈕代碼如下:
          {
                                      text : 
          "導出到excel",
                                      style : {
                                          marginRight : 
          '20px'
                                      },
                                      handler : function() {
                                          var vExportContent 
          = gridpanel.getExcelXml(); //獲取數據
                                      if (Ext.isIE8||Ext.isIE6 || Ext.isIE7 || Ext.isSafari
                                              
          || Ext.isSafari2 || Ext.isSafari3) { //判斷瀏覽器

                                          var fd 
          = Ext.get('frmDummy');
                                          
          if (!fd) {
                                              fd 
          = Ext.DomHelper.append(
                                                      Ext.getBody(), {
                                                          tag : 
          'form',
                                                          method : 
          'post',
                                                          id : 
          'frmDummy',
                                                          action : 
          'exportUrl.jsp',
                                                          target : 
          '_blank',
                                                          name : 
          'frmDummy',
                                                          cls : 
          'x-hidden',
                                                          cn : [ {
                                                              tag : 
          'input',
                                                              name : 
          'exportContent',
                                                              id : 
          'exportContent',
                                                              type : 
          'hidden'
                                                          } ]
                                                      }, 
          true);
                                              
                                          }
                                          fd.child(
          '#exportContent').set( {
                                              value : vExportContent
                                          });
                                          fd.dom.submit();
                                      } 
          else {
                                          document.location 
          = 'data:application/vnd.ms-excel;base64,' + Base64
                                                  .encode(vExportContent);
                                      }
                                  }}
          exportUrl.jsp頁面的代碼如下:
          <%
          response.setHeader(
          "Content-Type","application/force-download");
          response.setHeader(
          "Content-Type","application/vnd.ms-excel");
          response.setHeader(
          "Content-Disposition","attachment;filename=export.xls");
          out.print(request.getParameter(
          "exportContent"));
          %>
          注意事項:
          1.exportUrl.jsp的頁面只需要以上的代碼,多余的都不要了,否則生成的excel文件內容為Null
          2.生成的xls文件在Excel打開過程中可能會出現如下錯誤:
          ---
          加載期間在下述區域中出現了問題(P):
          表格
          由于錯誤,此文件無法打開。錯誤列于:C:\Documents and Settings\..\Local Settings\Temporary Internet
          ---

          這是由于輸入的數據中存在空格或者與設置中的類型不符,我遇到的問題就是由于Columns中的header中有類似于“日噸水<br>綜合費”這樣的屬性而產生的,修改即可
          3.在Google、FireFox、IE8/IE9測試通過
          posted on 2012-02-29 11:21 Jimi 閱讀(19214) 評論(28)  編輯  收藏 所屬分類: ExtJS

          FeedBack:
          # re: ExtJS 導出 Excel
          2012-06-14 08:58 | 馬祥建
          你好,請教一個問題 ...
          我的qq:381662973
          extjs導出excel有點問題  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2012-06-14 08:59 | 馬祥建
          在ie9下不行,FF下可以,谷歌也不行
          非常感謝  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2012-06-14 11:35 | 馬祥建
          解決了  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2012-06-21 00:12 | Jimi Hendrix
          @馬祥建
          解決了就好。呵呵,上個禮拜太忙了沒注意。
          代碼是網上分享的,兼容性我是修改下面的地方就好了,
          if (Ext.isIE8||Ext.isIE6 || Ext.isIE7 || Ext.isSafari|| Ext.isSafari2 || Ext.isSafari3)
            回復  更多評論
            
          # re: ExtJS 導出 Excel
          2012-09-12 15:20 | fanf
          @馬祥建
          怎么解決的呢??  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2012-09-12 17:29 | Jimi Hendrix
          @fanf
          if (Ext.isIE8||Ext.isIE6 || Ext.isIE7 || Ext.isSafari|| Ext.isSafari2 || Ext.isSafari3)
          添加IE9
          if (Ext.isIE9||Ext.isIE8||Ext.isIE6 || Ext.isIE7 || Ext.isSafari|| Ext.isSafari2 || Ext.isSafari3)
          這個方式導出的Excel只能對應exce版本,WPS不識別,不是很好用。
          可以的話試試別的方式  回復  更多評論
            
          # re: ExtJS 導出 Excel[未登錄]
          2012-10-19 09:06 | 卡卡
          引入那個js文件時,報錯:
          TypeError: Ext.grid is undefined
          Ext.override(Ext.grid.Panel, {  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2012-10-22 17:34 | Jimi Hendrix
          @卡卡
          這個代碼是在ExtJS的框架里實現的  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2012-11-02 13:55 | jiadebin
          你好,我也想使用這種方法導出,但是我想保存在服務端,而不是下載到客戶端,請問如何實現??  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2012-12-31 10:40 | 10耗子
          感謝,受教  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2013-03-06 11:36 | zhengc
          加載期間在下述區域中出現了問題(P):
          表格
          由于錯誤,此文件無法打開。錯誤列于:C:\Documents and Settings\..\Local Settings\Temporary Internet
          ---
          這是由于輸入的數據中存在空格或者與設置中的類型不符,我遇到的問題就是由于Columns中的header中有類似于“日噸水<br>綜合費”這樣的屬性而產生的,修改即可
          我的列沒有特殊屬性,怎么也報錯呢?  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2013-05-30 09:50 | five
          @Jimi Hendrix
          wps怎么導出呢  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2013-06-01 23:17 | Jimi Hendrix
          @five
          WPS兼容Excel  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2013-07-12 15:38 | baron
          @five
          請教一下,用這個方法
          導出的Excel 用wps 打不開。。怎么解決啊。  回復  更多評論
            
          # re: ExtJS 導出 Excel[未登錄]
          2013-09-17 10:37 | yang
          導出excel只顯示第一頁的內容  回復  更多評論
            
          # re: ExtJS 導出 Excel[未登錄]
          2013-09-17 10:38 | yang
          我的Q871266506  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2013-10-16 15:49 | 校風
          那個export.txt怎么引用到Ext里面去  回復  更多評論
            
          # re: ExtJS 導出 Excel[未登錄]
          2014-01-25 18:06 | hi
          frmDummy這是什么  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2014-02-25 11:08 | 愛愛愛
          Ext4.1上不兼容,一些方法4.1上沒用!!!  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2014-03-13 10:56 | 雨落
          @卡卡
          @愛愛愛
          我也是使用4.1的,也沒解決,請問你解決了么,可以加下我扣扣么:1491666096  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2014-08-28 09:00 | 編碼小王
          不知道作者你現在是否還關注這個,我昨天使用你的代碼,excle是能導出來,但是中文是亂碼的,一直不知道怎么解決,如果你能看到這個,請加我qq好嗎 萬分感謝  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2014-08-28 09:01 | 編碼小王
          我扣扣 303073768
            回復  更多評論
            
          # re: ExtJS 導出 Excel
          2014-09-03 14:02 | Java小白
          gridpanel沒有getExcelXml方法  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2014-09-03 14:04 | Java小白
          我qq-》1154489127
            回復  更多評論
            
          # re: ExtJS 導出 Excel
          2014-10-24 17:12 | 陌路
          導出Excel表,當數據量較大時報空指針異常錯誤,數據量少時可以正常導出,什么原因?加我Q:1208436356  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2014-12-08 08:55 | rayne
          @陌路
          我也碰到類似問題,請問你解決了沒有?  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2015-01-04 15:37 | 陌路
          @rayne
          還沒有,查了好多資料,不知道怎么解決。。。。  回復  更多評論
            
          # re: ExtJS 導出 Excel
          2016-07-28 23:01 | fancel
          導出來的數字是文本內容,無法計算,有解決的方式么?  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 防城港市| 星子县| 长丰县| 奉化市| 阳原县| 独山县| 雷波县| 扎囊县| 衡山县| 蓝山县| 白山市| 张掖市| 资溪县| 鸡西市| 买车| 安西县| 汝州市| 西盟| 师宗县| 三河市| 双流县| 巍山| 屏南县| 阿拉尔市| 仲巴县| 饶河县| 乐昌市| 贡觉县| 伊通| 丰宁| 广宗县| 新密市| 榆社县| 宝坻区| 淳化县| 郁南县| 丰顺县| 营口市| 高雄市| 西安市| 兰考县|