1. /*
  2. grid 导出excel扩展(纯客户端,提交到后台再导的可以自己改改代码也在)
  3. 参考自 https://blog.csdn.net/tianxiaode/article/details/45969761
  4. coolzdp
    2018-10-30
  5. */
  6. Ext.define('MyApp.ux.widget.dataShowGrid.GridExportExcelMixin', {
  7. extend : 'Ext.Mixin',
  8. //requires: 'Ext.form.action.StandardSubmit',
  9.  
  10. /*
  11. Kick off process
  12. */
  13.  
  14. downloadExcelXml: function(includeHidden, title) {
  15.  
  16. if (!title)
  17. title = this.title;
  18. if (!title)
  19. title = '导出excel';
  20.  
  21. var vExportContent = this.getExcelXml(includeHidden, title);
  22.  
  23. /*
  24. dynamically create and anchor tag to force download with suggested filename
  25. note: download attribute is Google Chrome specific
  26. */
  27.  
  28. if (true) { // Ext.isChrome
  29. var gridEl = this.getEl();
  30. var location = 'data:application/vnd.ms-excel;base64,' + this.base64().encode(vExportContent);
  31.  
  32. var el = Ext.DomHelper.append(gridEl, {
  33. tag: "a",
  34. download: title + "-" + Ext.Date.format(new Date(), 'Y-m-d Hi') + '.xls',
  35. href: location
  36. });
  37.  
  38. el.click();
  39.  
  40. Ext.fly(el).destroy();
  41.  
  42. } else {
  43. var form = this.down('form#uploadForm');
  44. if (form) {
  45. form.destroy();
  46. }
  47. form = this.add({
  48. xtype: 'form',
  49. itemId: 'uploadForm',
  50. hidden: true,
  51. standardSubmit: true,
  52. url: 'http://webapps.figleaf.com/dataservices/Excel.cfc?method=echo&mimetype=application/vnd.ms-excel&filename=' + escape(title + ".xls"),
  53. items: [{
  54. xtype: 'hiddenfield',
  55. name: 'data',
  56. value: vExportContent
  57. }]
  58. });
  59.  
  60. form.getForm().submit();
  61.  
  62. }
  63. },
  64.  
  65. /*
  66.  
  67. Welcome to XML Hell
  68. See: http://msdn.microsoft.com/en-us/library/office/aa140066(v=office.10).aspx
  69. for more details
  70.  
  71. */
  72. getExcelXml: function(includeHidden, title) {
  73.  
  74. var theTitle = title || this.title;
  75.  
  76. var worksheet = this.createWorksheet(includeHidden, theTitle);
  77. if (this.columnManager.columns) {
  78. var totalWidth = this.columnManager.columns.length;
  79. } else {
  80. var totalWidth = this.columns.length;
  81. }
  82.  
  83. return ''.concat(
  84. '<?xml version="1.0"?>',
  85. '<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">',
  86. '<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"><Title>' + theTitle + '</Title></DocumentProperties>',
  87. '<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"><AllowPNG/></OfficeDocumentSettings>',
  88. '<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">',
  89. '<WindowHeight>' + worksheet.height + '</WindowHeight>',
  90. '<WindowWidth>' + worksheet.width + '</WindowWidth>',
  91. '<ProtectStructure>False</ProtectStructure>',
  92. '<ProtectWindows>False</ProtectWindows>',
  93. '</ExcelWorkbook>',
  94.  
  95. '<Styles>',
  96.  
  97. '<Style ss:ID="Default" ss:Name="Normal">',
  98. '<Alignment ss:Vertical="Bottom"/>',
  99. '<Borders/>',
  100. '<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="12" ss:Color="#000000"/>',
  101. '<Interior/>',
  102. '<NumberFormat/>',
  103. '<Protection/>',
  104. '</Style>',
  105.  
  106. '<Style ss:ID="title">',
  107. '<Borders />',
  108. '<Font ss:Bold="1" ss:Size="18" />',
  109. '<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1" />',
  110. '<NumberFormat ss:Format="@" />',
  111. '</Style>',
  112.  
  113. '<Style ss:ID="headercell">',
  114. '<Font ss:Bold="1" ss:Size="10" />',
  115. '<Alignment ss:Horizontal="Center" ss:WrapText="1" />',
  116. '<Interior ss:Color="#A3C9F1" ss:Pattern="Solid" />',
  117. '</Style>',
  118.  
  119. '<Style ss:ID="even">',
  120. '<Interior ss:Color="#CCFFFF" ss:Pattern="Solid" />',
  121. '</Style>',
  122.  
  123. '<Style ss:ID="evendate" ss:Parent="even">',
  124. '<NumberFormat ss:Format="yyyy-mm-dd" />',
  125. '</Style>',
  126.  
  127. '<Style ss:ID="evenint" ss:Parent="even">',
  128. '<Numberformat ss:Format="0" />',
  129. '</Style>',
  130.  
  131. '<Style ss:ID="evenfloat" ss:Parent="even">',
  132. '<Numberformat ss:Format="0.00" />',
  133. '</Style>',
  134.  
  135. '<Style ss:ID="odd">',
  136. '<Interior ss:Color="#CCCCFF" ss:Pattern="Solid" />',
  137. '</Style>',
  138.  
  139. '<Style ss:ID="groupSeparator">',
  140. '<Interior ss:Color="#D3D3D3" ss:Pattern="Solid" />',
  141. '</Style>',
  142.  
  143. '<Style ss:ID="odddate" ss:Parent="odd">',
  144. '<NumberFormat ss:Format="yyyy-mm-dd" />',
  145. '</Style>',
  146.  
  147. '<Style ss:ID="oddint" ss:Parent="odd">',
  148. '<NumberFormat Format="0" />',
  149. '</Style>',
  150.  
  151. '<Style ss:ID="oddfloat" ss:Parent="odd">',
  152. '<NumberFormat Format="0.00" />',
  153. '</Style>',
  154.  
  155. '</Styles>',
  156. worksheet.xml,
  157. '</Workbook>'
  158. );
  159. },
  160.  
  161. /*
  162.  
  163. Support function to return field info from store based on fieldname
  164.  
  165. */
  166.  
  167. getModelField: function(fieldName) {
  168.  
  169. var fields = this.store.model.getFields();
  170. for (var i = 0; i < fields.length; i++) {
  171. if (fields[i].name === fieldName) {
  172. return fields[i];
  173. }
  174. }
  175. },
  176.  
  177. /*
  178.  
  179. Convert store into Excel Worksheet
  180.  
  181. */
  182. generateEmptyGroupRow: function(dataIndex, value, cellTypes, includeHidden) {
  183.  
  184. var cm = this.columnManager.columns;
  185. var colCount = cm.length;
  186. var rowTpl = '<Row ss:AutoFitHeight="0"><Cell ss:StyleID="groupSeparator" ss:MergeAcross="{0}"><Data ss:Type="String"><html:b>{1}</html:b></Data></Cell></Row>';
  187. var visibleCols = 0;
  188.  
  189. // rowXml += '<Cell ss:StyleID="groupSeparator">'
  190.  
  191. for (var j = 0; j < colCount; j++) {
  192. if (cm[j].xtype != 'actioncolumn' && (cm[j].dataIndex != '') && (includeHidden || !cm[j].hidden)) {
  193. // rowXml += '<Cell ss:StyleID="groupSeparator"/>';
  194. visibleCols++;
  195. }
  196. }
  197.  
  198. // rowXml += "</Row>";
  199.  
  200. return Ext.String.format(rowTpl, visibleCols - 1, Ext.String.htmlEncode(value));
  201. },
  202.  
  203. createWorksheet: function(includeHidden, theTitle) {
  204. // Calculate cell data types and extra class names which affect formatting
  205. var cellType = [];
  206. var cellTypeClass = [];
  207. console.log(this);
  208. if (this.columnManager.columns) {
  209. var cm = this.columnManager.columns;
  210. } else {
  211. var cm = this.columns;
  212. }
  213. console.log(cm);
  214. var colCount = cm.length;
  215. var totalWidthInPixels = 0;
  216. var colXml = '';
  217. var headerXml = '';
  218. var visibleColumnCountReduction = 0;
  219.  
  220. for (var i = 0; i < cm.length; i++) {
  221. if (cm[i].xtype != 'actioncolumn' && (cm[i].dataIndex != '') && (includeHidden || !cm[i].hidden)) {
  222. var w = cm[i].getEl().getWidth();
  223. totalWidthInPixels += w;
  224.  
  225. if (cm[i].text === "") {
  226. cellType.push("None");
  227. cellTypeClass.push("");
  228. ++visibleColumnCountReduction;
  229. } else {
  230. colXml += '<Column ss:AutoFitWidth="1" ss:Width="' + w + '" />';
  231. headerXml += '<Cell ss:StyleID="headercell">' +
  232. '<Data ss:Type="String">' + cm[i].text.replace("<br>"," ") + '</Data>' +
  233. '<NamedCell ss:Name="Print_Titles"></NamedCell></Cell>';
  234.  
  235. //var fld = this.getModelField(cm[i].dataIndex);
  236. var fld = cm[i];
  237.  
  238. switch (fld.$className) {
  239. case "Ext.data.field.Integer":
  240. cellType.push("Number");
  241. cellTypeClass.push("int");
  242. break;
  243. case "Ext.data.field.Number":
  244. cellType.push("Number");
  245. cellTypeClass.push("float");
  246. break;
  247. case "Ext.data.field.Boolean":
  248. cellType.push("String");
  249. cellTypeClass.push("");
  250. break;
  251. case "Ext.data.field.Date":
  252. cellType.push("DateTime");
  253. cellTypeClass.push("date");
  254. break;
  255. default:
  256. cellType.push("String");
  257. cellTypeClass.push("");
  258. break;
  259. }
  260. }
  261. }
  262. }
  263. var visibleColumnCount = cellType.length - visibleColumnCountReduction;
  264.  
  265. var result = {
  266. height: 9000,
  267. width: Math.floor(totalWidthInPixels * 30) + 50
  268. };
  269.  
  270. // Generate worksheet header details.
  271.  
  272. // determine number of rows
  273. var numGridRows = this.store.getCount() + 2;
  274. if ((this.store.groupField &&!Ext.isEmpty(this.store.groupField)) || (this.store.groupers && this.store.groupers.items.length > 0)) {
  275. numGridRows = numGridRows + this.store.getGroups().length;
  276. }
  277.  
  278. // create header for worksheet
  279. var t = ''.concat(
  280. '<Worksheet ss:Name="' + theTitle + '">',
  281.  
  282. '<Names>',
  283. '<NamedRange ss:Name="Print_Titles" ss:RefersTo="=\'' + theTitle + '\'!R1:R2">',
  284. '</NamedRange></Names>',
  285.  
  286. '<Table ss:ExpandedColumnCount="' + (visibleColumnCount + 2),
  287. '" ss:ExpandedRowCount="' + numGridRows + '" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="65" ss:DefaultRowHeight="15">',
  288. colXml,
  289. '<Row ss:Height="38">',
  290. '<Cell ss:MergeAcross="' + (visibleColumnCount - 1) + '" ss:StyleID="title">',
  291. '<Data ss:Type="String" xmlns:html="http://www.w3.org/TR/REC-html40">',
  292. '<html:b>' + theTitle + '</html:b></Data><NamedCell ss:Name="Print_Titles">',
  293. '</NamedCell></Cell>',
  294. '</Row>',
  295. '<Row ss:AutoFitHeight="1">',
  296. headerXml +
  297. '</Row>'
  298. );
  299.  
  300. // Generate the data rows from the data in the Store
  301. var groupVal = "";
  302. var groupField = "";
  303. if (this.store.groupers && this.store.groupers.keys.length > 0) {
  304. groupField = this.store.groupers.keys[0];
  305. } else if (this.store.groupField != '') {
  306. groupField = this.store.groupField;
  307. }
  308.  
  309. for (var i = 0, it = this.store.data.items, l = it.length; i < l; i++) {
  310.  
  311. if (!Ext.isEmpty(groupField)) {
  312. if (groupVal != this.store.getAt(i).get(groupField)) {
  313. groupVal = this.store.getAt(i).get(groupField);
  314. t += this.generateEmptyGroupRow(groupField, groupVal, cellType, includeHidden);
  315. }
  316. }
  317. t += '<Row>';
  318. var cellClass = (i & 1) ? 'odd' : 'even';
  319. r = it[i].data;
  320. var k = 0;
  321. for (var j = 0; j < colCount; j++) {
  322. if (cm[j].xtype != 'actioncolumn' && (cm[j].dataIndex != '') && (includeHidden || !cm[j].hidden)) {
  323. var v = r[cm[j].dataIndex];
  324. if (cellType[k] !== "None") {
  325. t += '<Cell ss:StyleID="' + cellClass + cellTypeClass[k] + '"><Data ss:Type="' + cellType[k] + '">';
  326. if (cellType[k] == 'DateTime') {
  327. t += Ext.Date.format(v, 'Y-m-d');
  328. } else {
  329. var rendererFn = cm[j].renderer;
  330.  
  331. if (!Ext.isFunction(rendererFn))
  332. t += Ext.String.htmlEncode(v);
  333. else{ // 调用该列自己的renderer函数获取渲染结果
  334. var text = rendererFn(v); //
  335. text = text.replace(/<\/?.+?>/g, ""); // 去掉外键字段渲染时加入的html标签
  336. t += Ext.String.htmlEncode(text);
  337. }
  338. }
  339. t += '</Data></Cell>';
  340. }
  341. k++;
  342. }
  343. }
  344. t += '</Row>';
  345. }
  346.  
  347. result.xml = t.concat(
  348. '</Table>',
  349. '<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">',
  350. '<PageLayoutZoom>0</PageLayoutZoom>',
  351. '<Selected/>',
  352. '<Panes>',
  353. '<Pane>',
  354. '<Number>3</Number>',
  355. '<ActiveRow>2</ActiveRow>',
  356. '</Pane>',
  357. '</Panes>',
  358. '<ProtectObjects>False</ProtectObjects>',
  359. '<ProtectScenarios>False</ProtectScenarios>',
  360. '</WorksheetOptions>',
  361. '</Worksheet>'
  362. );
  363. return result;
  364. },
  365.  
  366. base64: function() {
  367. // Private property
  368. var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  369.  
  370. // Private method for UTF-8 encoding
  371.  
  372. function utf8Encode(string) {
  373. string = string.replace(/\r\n/g, "\n");
  374. var utftext = "";
  375. for (var n = 0; n < string.length; n++) {
  376. var c = string.charCodeAt(n);
  377. if (c < 128) {
  378. utftext += String.fromCharCode(c);
  379. } else if ((c > 127) && (c < 2048)) {
  380. utftext += String.fromCharCode((c >> 6) | 192);
  381. utftext += String.fromCharCode((c & 63) | 128);
  382. } else {
  383. utftext += String.fromCharCode((c >> 12) | 224);
  384. utftext += String.fromCharCode(((c >> 6) & 63) | 128);
  385. utftext += String.fromCharCode((c & 63) | 128);
  386. }
  387. }
  388. return utftext;
  389. }
  390.  
  391. // Public method for encoding
  392. return {
  393. encode: (typeof btoa == 'function') ? function(input) {
  394. return btoa(utf8Encode(input));
  395. } : function(input) {
  396. var output = "";
  397. var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
  398. var i = 0;
  399. input = utf8Encode(input);
  400. while (i < input.length) {
  401. chr1 = input.charCodeAt(i++);
  402. chr2 = input.charCodeAt(i++);
  403. chr3 = input.charCodeAt(i++);
  404. enc1 = chr1 >> 2;
  405. enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
  406. enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
  407. enc4 = chr3 & 63;
  408. if (isNaN(chr2)) {
  409. enc3 = enc4 = 64;
  410. } else if (isNaN(chr3)) {
  411. enc4 = 64;
  412. }
  413. output = output +
  414. keyStr.charAt(enc1) + keyStr.charAt(enc2) +
  415. keyStr.charAt(enc3) + keyStr.charAt(enc4);
  416. }
  417. return output;
  418. }
  419. };
  420. }
  421.  
  422. });

使用时混入即可

  1. Ext.define('MyApp.ux.widget.dataGrid.dataShowGrid.DataShowGrid', {
  2. extend : 'Ext.grid.Panel',
  3. mixins: [
  4. 'MyApp.ux.widget.dataShowGrid.GridExportExcelMixin'
  5. ],
  6. xtype: 'ux-dataShowGrid'
  7. };
grid.downloadExcelXml();

Extjs6 grid 导出excel功能类,支持renderer的更多相关文章

  1. JAVA实现导出excel功能,封装通用导出工具类

    引入maven <!--excel导出--> <dependency> <groupId>net.sourceforge.jexcelapi</groupId ...

  2. 导入导出Excel工具类ExcelUtil

    前言 前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hibe ...

  3. NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中

    以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...

  4. ExtJS Grid导出excel文件

    ExtJS Grid导出excel文件, 需下载POI:链接:http://pan.baidu.com/s/1i3lkPhF 密码:rqbg 1.将Grid表格数据连同表格列名传到后台 2.后台导出e ...

  5. Atitit.导出excel功能的设计 与解决方案

    Atitit.导出excel功能的设计 与解决方案 1.1. 项目起源于背景1 1.2. Js  jquery方案(推荐)jquery.table2excel1 1.3. 服务器方案2 1.4. 详细 ...

  6. vue项目导出EXCEL功能

    因为一些原因导出EXCEL功能必须前端来做,所以就研究了一下,在网上也找了一些文章来看,有一些不完整,我做完了就记录下来,供大家参考: 1.首先先安装依赖: npm install file-save ...

  7. Vue通过Blob对象实现导出Excel功能

    不同的项目有不同的导出需求,有些只导出当前所显示结果页面的表格进入excel,这个时候就有很多插件,比如vue-json-excel或者是Blob.js+Export2Excel.js来实现导出Exc ...

  8. MVC NPOI Linq导出Excel通用类

    之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出 通用类: public enum DataTypeEnum { Int = , ...

  9. 导出Excel帮助类

    using System; using System.Collections.Generic; using System.Text; using System.Data; using System.D ...

随机推荐

  1. php隐藏手机号指定位数

    function mobileReplace($mobile,$start,$end,$str="*"){ $countStr = abs($end-$start); $repla ...

  2. drop、truncate和delete的区别

    TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源 ...

  3. Linux中常用操作命令(转)

    1.cd命令 这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径.如:   cd /root/Docements # 切 ...

  4. beta冲刺1/7

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(1/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 团队完成测试答辩 整理博客 复习接口 接下来的 ...

  5. js分析 猫_眼_电_影 字体文件 @font-face

    0. 参考 https://developer.mozilla.org/zh-CN/docs/Web/CSS/@font-face 这是一个叫做@font-face 的CSS @规则 ,它允许网页开发 ...

  6. 联发科MT8377 MT8389 MT6589 MT6577等芯片详细解析

    MT8389大家都比较陌生,但如果我说MT6589估计大家都懂了,实质上MT8389是MT6589的一个分支,一个克隆分支,说得再明了些,就是MT6589的高耗版.如果把它看成是同一个CPU也是可以的 ...

  7. C++运算符重载——类型转换

    类型转换函数能够实现把一个类 类型 转换成 基本数据类型(int.float.double.char等) 或者 另一个类 类型. 其定义形式如下,注意不能有返回值,不能有参数,只能返回要转换的数据类型 ...

  8. python 将list的值赋值给变量

    list中有n个值,赋值给k个变量:a1, a2, ……,ak n = k时:a1, a2, ……,ak = list n > k时:使用1式报错:ValueError: too many va ...

  9. Arrange the Bulls [POJ2441] [状压DP]

    题意 n头牛,m个房间,每头牛有自己喜欢的房间,问每头牛都住进自己喜欢的房间有多少种分配方法? Input In the first line of input contains two intege ...

  10. flask之一些凌乱知识点

    本篇导航: session组件 上下文与内置函数 pymysql问题 模版问题 一.session组件 1.session组件简介 flask-session是flask框架的session组件,由于 ...