Extjs6 grid 导出excel功能类,支持renderer
- /*
- grid 导出excel扩展(纯客户端,提交到后台再导的可以自己改改代码也在)
- 参考自 https://blog.csdn.net/tianxiaode/article/details/45969761
- coolzdp
2018-10-30- */
- Ext.define('MyApp.ux.widget.dataShowGrid.GridExportExcelMixin', {
- extend : 'Ext.Mixin',
- //requires: 'Ext.form.action.StandardSubmit',
- /*
- Kick off process
- */
- downloadExcelXml: function(includeHidden, title) {
- if (!title)
- title = this.title;
- if (!title)
- title = '导出excel';
- var vExportContent = this.getExcelXml(includeHidden, title);
- /*
- dynamically create and anchor tag to force download with suggested filename
- note: download attribute is Google Chrome specific
- */
- if (true) { // Ext.isChrome
- var gridEl = this.getEl();
- var location = 'data:application/vnd.ms-excel;base64,' + this.base64().encode(vExportContent);
- var el = Ext.DomHelper.append(gridEl, {
- tag: "a",
- download: title + "-" + Ext.Date.format(new Date(), 'Y-m-d Hi') + '.xls',
- href: location
- });
- el.click();
- Ext.fly(el).destroy();
- } else {
- var form = this.down('form#uploadForm');
- if (form) {
- form.destroy();
- }
- form = this.add({
- xtype: 'form',
- itemId: 'uploadForm',
- hidden: true,
- standardSubmit: true,
- url: 'http://webapps.figleaf.com/dataservices/Excel.cfc?method=echo&mimetype=application/vnd.ms-excel&filename=' + escape(title + ".xls"),
- items: [{
- xtype: 'hiddenfield',
- name: 'data',
- value: vExportContent
- }]
- });
- form.getForm().submit();
- }
- },
- /*
- Welcome to XML Hell
- See: http://msdn.microsoft.com/en-us/library/office/aa140066(v=office.10).aspx
- for more details
- */
- getExcelXml: function(includeHidden, title) {
- var theTitle = title || this.title;
- var worksheet = this.createWorksheet(includeHidden, theTitle);
- if (this.columnManager.columns) {
- var totalWidth = this.columnManager.columns.length;
- } else {
- var totalWidth = this.columns.length;
- }
- return ''.concat(
- '<?xml version="1.0"?>',
- '<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">',
- '<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"><Title>' + theTitle + '</Title></DocumentProperties>',
- '<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"><AllowPNG/></OfficeDocumentSettings>',
- '<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">',
- '<WindowHeight>' + worksheet.height + '</WindowHeight>',
- '<WindowWidth>' + worksheet.width + '</WindowWidth>',
- '<ProtectStructure>False</ProtectStructure>',
- '<ProtectWindows>False</ProtectWindows>',
- '</ExcelWorkbook>',
- '<Styles>',
- '<Style ss:ID="Default" ss:Name="Normal">',
- '<Alignment ss:Vertical="Bottom"/>',
- '<Borders/>',
- '<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="12" ss:Color="#000000"/>',
- '<Interior/>',
- '<NumberFormat/>',
- '<Protection/>',
- '</Style>',
- '<Style ss:ID="title">',
- '<Borders />',
- '<Font ss:Bold="1" ss:Size="18" />',
- '<Alignment ss:Horizontal="Center" ss:Vertical="Center" ss:WrapText="1" />',
- '<NumberFormat ss:Format="@" />',
- '</Style>',
- '<Style ss:ID="headercell">',
- '<Font ss:Bold="1" ss:Size="10" />',
- '<Alignment ss:Horizontal="Center" ss:WrapText="1" />',
- '<Interior ss:Color="#A3C9F1" ss:Pattern="Solid" />',
- '</Style>',
- '<Style ss:ID="even">',
- '<Interior ss:Color="#CCFFFF" ss:Pattern="Solid" />',
- '</Style>',
- '<Style ss:ID="evendate" ss:Parent="even">',
- '<NumberFormat ss:Format="yyyy-mm-dd" />',
- '</Style>',
- '<Style ss:ID="evenint" ss:Parent="even">',
- '<Numberformat ss:Format="0" />',
- '</Style>',
- '<Style ss:ID="evenfloat" ss:Parent="even">',
- '<Numberformat ss:Format="0.00" />',
- '</Style>',
- '<Style ss:ID="odd">',
- '<Interior ss:Color="#CCCCFF" ss:Pattern="Solid" />',
- '</Style>',
- '<Style ss:ID="groupSeparator">',
- '<Interior ss:Color="#D3D3D3" ss:Pattern="Solid" />',
- '</Style>',
- '<Style ss:ID="odddate" ss:Parent="odd">',
- '<NumberFormat ss:Format="yyyy-mm-dd" />',
- '</Style>',
- '<Style ss:ID="oddint" ss:Parent="odd">',
- '<NumberFormat Format="0" />',
- '</Style>',
- '<Style ss:ID="oddfloat" ss:Parent="odd">',
- '<NumberFormat Format="0.00" />',
- '</Style>',
- '</Styles>',
- worksheet.xml,
- '</Workbook>'
- );
- },
- /*
- Support function to return field info from store based on fieldname
- */
- getModelField: function(fieldName) {
- var fields = this.store.model.getFields();
- for (var i = 0; i < fields.length; i++) {
- if (fields[i].name === fieldName) {
- return fields[i];
- }
- }
- },
- /*
- Convert store into Excel Worksheet
- */
- generateEmptyGroupRow: function(dataIndex, value, cellTypes, includeHidden) {
- var cm = this.columnManager.columns;
- var colCount = cm.length;
- 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>';
- var visibleCols = 0;
- // rowXml += '<Cell ss:StyleID="groupSeparator">'
- for (var j = 0; j < colCount; j++) {
- if (cm[j].xtype != 'actioncolumn' && (cm[j].dataIndex != '') && (includeHidden || !cm[j].hidden)) {
- // rowXml += '<Cell ss:StyleID="groupSeparator"/>';
- visibleCols++;
- }
- }
- // rowXml += "</Row>";
- return Ext.String.format(rowTpl, visibleCols - 1, Ext.String.htmlEncode(value));
- },
- createWorksheet: function(includeHidden, theTitle) {
- // Calculate cell data types and extra class names which affect formatting
- var cellType = [];
- var cellTypeClass = [];
- console.log(this);
- if (this.columnManager.columns) {
- var cm = this.columnManager.columns;
- } else {
- var cm = this.columns;
- }
- console.log(cm);
- var colCount = cm.length;
- var totalWidthInPixels = 0;
- var colXml = '';
- var headerXml = '';
- var visibleColumnCountReduction = 0;
- for (var i = 0; i < cm.length; i++) {
- if (cm[i].xtype != 'actioncolumn' && (cm[i].dataIndex != '') && (includeHidden || !cm[i].hidden)) {
- var w = cm[i].getEl().getWidth();
- totalWidthInPixels += w;
- if (cm[i].text === "") {
- cellType.push("None");
- cellTypeClass.push("");
- ++visibleColumnCountReduction;
- } else {
- colXml += '<Column ss:AutoFitWidth="1" ss:Width="' + w + '" />';
- headerXml += '<Cell ss:StyleID="headercell">' +
- '<Data ss:Type="String">' + cm[i].text.replace("<br>"," ") + '</Data>' +
- '<NamedCell ss:Name="Print_Titles"></NamedCell></Cell>';
- //var fld = this.getModelField(cm[i].dataIndex);
- var fld = cm[i];
- switch (fld.$className) {
- case "Ext.data.field.Integer":
- cellType.push("Number");
- cellTypeClass.push("int");
- break;
- case "Ext.data.field.Number":
- cellType.push("Number");
- cellTypeClass.push("float");
- break;
- case "Ext.data.field.Boolean":
- cellType.push("String");
- cellTypeClass.push("");
- break;
- case "Ext.data.field.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.
- // determine number of rows
- var numGridRows = this.store.getCount() + 2;
- if ((this.store.groupField &&!Ext.isEmpty(this.store.groupField)) || (this.store.groupers && this.store.groupers.items.length > 0)) {
- numGridRows = numGridRows + this.store.getGroups().length;
- }
- // create header for worksheet
- var t = ''.concat(
- '<Worksheet ss:Name="' + theTitle + '">',
- '<Names>',
- '<NamedRange ss:Name="Print_Titles" ss:RefersTo="=\'' + theTitle + '\'!R1:R2">',
- '</NamedRange></Names>',
- '<Table ss:ExpandedColumnCount="' + (visibleColumnCount + 2),
- '" ss:ExpandedRowCount="' + numGridRows + '" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="65" ss:DefaultRowHeight="15">',
- colXml,
- '<Row ss:Height="38">',
- '<Cell ss:MergeAcross="' + (visibleColumnCount - 1) + '" ss:StyleID="title">',
- '<Data ss:Type="String" xmlns:html="http://www.w3.org/TR/REC-html40">',
- '<html:b>' + theTitle + '</html:b></Data><NamedCell ss:Name="Print_Titles">',
- '</NamedCell></Cell>',
- '</Row>',
- '<Row ss:AutoFitHeight="1">',
- headerXml +
- '</Row>'
- );
- // Generate the data rows from the data in the Store
- var groupVal = "";
- var groupField = "";
- if (this.store.groupers && this.store.groupers.keys.length > 0) {
- groupField = this.store.groupers.keys[0];
- } else if (this.store.groupField != '') {
- groupField = this.store.groupField;
- }
- for (var i = 0, it = this.store.data.items, l = it.length; i < l; i++) {
- if (!Ext.isEmpty(groupField)) {
- if (groupVal != this.store.getAt(i).get(groupField)) {
- groupVal = this.store.getAt(i).get(groupField);
- t += this.generateEmptyGroupRow(groupField, groupVal, cellType, includeHidden);
- }
- }
- t += '<Row>';
- var cellClass = (i & 1) ? 'odd' : 'even';
- r = it[i].data;
- var k = 0;
- for (var j = 0; j < colCount; j++) {
- if (cm[j].xtype != 'actioncolumn' && (cm[j].dataIndex != '') && (includeHidden || !cm[j].hidden)) {
- var v = r[cm[j].dataIndex];
- if (cellType[k] !== "None") {
- t += '<Cell ss:StyleID="' + cellClass + cellTypeClass[k] + '"><Data ss:Type="' + cellType[k] + '">';
- if (cellType[k] == 'DateTime') {
- t += Ext.Date.format(v, 'Y-m-d');
- } else {
- var rendererFn = cm[j].renderer;
- if (!Ext.isFunction(rendererFn))
- t += Ext.String.htmlEncode(v);
- else{ // 调用该列自己的renderer函数获取渲染结果
- var text = rendererFn(v); //
- text = text.replace(/<\/?.+?>/g, ""); // 去掉外键字段渲染时加入的html标签
- t += Ext.String.htmlEncode(text);
- }
- }
- t += '</Data></Cell>';
- }
- k++;
- }
- }
- t += '</Row>';
- }
- result.xml = t.concat(
- '</Table>',
- '<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">',
- '<PageLayoutZoom>0</PageLayoutZoom>',
- '<Selected/>',
- '<Panes>',
- '<Pane>',
- '<Number>3</Number>',
- '<ActiveRow>2</ActiveRow>',
- '</Pane>',
- '</Panes>',
- '<ProtectObjects>False</ProtectObjects>',
- '<ProtectScenarios>False</ProtectScenarios>',
- '</WorksheetOptions>',
- '</Worksheet>'
- );
- return result;
- },
- 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.define('MyApp.ux.widget.dataGrid.dataShowGrid.DataShowGrid', {
- extend : 'Ext.grid.Panel',
- mixins: [
- 'MyApp.ux.widget.dataShowGrid.GridExportExcelMixin'
- ],
- xtype: 'ux-dataShowGrid'
- };
Extjs6 grid 导出excel功能类,支持renderer的更多相关文章
- JAVA实现导出excel功能,封装通用导出工具类
引入maven <!--excel导出--> <dependency> <groupId>net.sourceforge.jexcelapi</groupId ...
- 导入导出Excel工具类ExcelUtil
前言 前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hibe ...
- NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中
以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...
- ExtJS Grid导出excel文件
ExtJS Grid导出excel文件, 需下载POI:链接:http://pan.baidu.com/s/1i3lkPhF 密码:rqbg 1.将Grid表格数据连同表格列名传到后台 2.后台导出e ...
- Atitit.导出excel功能的设计 与解决方案
Atitit.导出excel功能的设计 与解决方案 1.1. 项目起源于背景1 1.2. Js jquery方案(推荐)jquery.table2excel1 1.3. 服务器方案2 1.4. 详细 ...
- vue项目导出EXCEL功能
因为一些原因导出EXCEL功能必须前端来做,所以就研究了一下,在网上也找了一些文章来看,有一些不完整,我做完了就记录下来,供大家参考: 1.首先先安装依赖: npm install file-save ...
- Vue通过Blob对象实现导出Excel功能
不同的项目有不同的导出需求,有些只导出当前所显示结果页面的表格进入excel,这个时候就有很多插件,比如vue-json-excel或者是Blob.js+Export2Excel.js来实现导出Exc ...
- MVC NPOI Linq导出Excel通用类
之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出 通用类: public enum DataTypeEnum { Int = , ...
- 导出Excel帮助类
using System; using System.Collections.Generic; using System.Text; using System.Data; using System.D ...
随机推荐
- php隐藏手机号指定位数
function mobileReplace($mobile,$start,$end,$str="*"){ $countStr = abs($end-$start); $repla ...
- drop、truncate和delete的区别
TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源 ...
- Linux中常用操作命令(转)
1.cd命令 这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径.如: cd /root/Docements # 切 ...
- beta冲刺1/7
目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(1/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 团队完成测试答辩 整理博客 复习接口 接下来的 ...
- js分析 猫_眼_电_影 字体文件 @font-face
0. 参考 https://developer.mozilla.org/zh-CN/docs/Web/CSS/@font-face 这是一个叫做@font-face 的CSS @规则 ,它允许网页开发 ...
- 联发科MT8377 MT8389 MT6589 MT6577等芯片详细解析
MT8389大家都比较陌生,但如果我说MT6589估计大家都懂了,实质上MT8389是MT6589的一个分支,一个克隆分支,说得再明了些,就是MT6589的高耗版.如果把它看成是同一个CPU也是可以的 ...
- C++运算符重载——类型转换
类型转换函数能够实现把一个类 类型 转换成 基本数据类型(int.float.double.char等) 或者 另一个类 类型. 其定义形式如下,注意不能有返回值,不能有参数,只能返回要转换的数据类型 ...
- python 将list的值赋值给变量
list中有n个值,赋值给k个变量:a1, a2, ……,ak n = k时:a1, a2, ……,ak = list n > k时:使用1式报错:ValueError: too many va ...
- Arrange the Bulls [POJ2441] [状压DP]
题意 n头牛,m个房间,每头牛有自己喜欢的房间,问每头牛都住进自己喜欢的房间有多少种分配方法? Input In the first line of input contains two intege ...
- flask之一些凌乱知识点
本篇导航: session组件 上下文与内置函数 pymysql问题 模版问题 一.session组件 1.session组件简介 flask-session是flask框架的session组件,由于 ...