`
forlab
  • 浏览: 133567 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

excel之-extjs

 
阅读更多

这两天项目上要求做一个导出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);
}
elseif((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;
}
elseif (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测试通过
分享到:
评论

相关推荐

    基于EXTJS 的在线EXCEL编辑器

    基于EXTJS 的在线EXCEL编辑器,是利用EXTJS的强大功能来实现对Excel文件的在线创建、编辑和查看的功能。这种编辑器允许用户在浏览器中直接处理Excel数据,无需依赖本地安装的Microsoft Excel或其他第三方软件。 ...

    extjs模拟excel表格

    在本文中,我们将深入探讨如何使用ExtJS来模拟Excel表格,以及实现Excel的各种功能。 首先,ExtJS中的GridPanel组件是实现模拟Excel表格的核心。GridPanel允许我们展示大量数据,并提供了诸如排序、过滤、分页等...

    extjs grid数据导出excel文件

    本文将深入讲解EXTJS Grid如何实现数据导出到Excel文件的功能。 首先,我们要明白EXTJS Grid的数据导出到Excel的过程通常涉及到以下几个步骤: 1. **获取Grid数据**:在EXTJS中,Grid的数据存储在Store对象中。要...

    ExtJs6 导出excel(包含分组、分组合计行、二重表头)

    总之,ExtJS6的导出Excel功能结合了分组、分组合计行和二重表头,使得数据网格的数据导出更加灵活且信息丰富。通过自定义和扩展,开发者可以创建满足特定业务场景的导出解决方案。而这个过程往往需要对ExtJS的API有...

    ExtJS拖拽导入Excel数据

    用户可以从excel中选中要导入的数据,直接拖拽到grid中

    extjs实现excel导出

    在本文中,我们将深入探讨如何使用ExtJS框架结合Apache POI库来实现Excel导出功能。首先,让我们了解一些基本概念。 **ExtJS框架** ExtJS是一个强大的JavaScript库,专门用于构建富客户端应用程序。它提供了丰富的...

    ExtJS实现Excel导出

    ### ExtJS实现Excel导出:深入解析与实践 在当今高度数字化的工作环境中,数据的管理和呈现方式至关重要。其中,Excel作为数据处理和分析的重要工具,其导出功能在各种应用场景中显得尤为关键。ExtJS,作为一种强大...

    EXTJS grid导出EXCEL文件

    1. **EXTJS Grid组件**:EXTJS Grid是EXTJS的核心组件之一,它允许开发者创建可分页、可排序、可过滤的数据表格。Grid可以与各种数据源(如JSON、XML或内存中的数组)配合使用,并通过Store对象进行数据的加载和管理...

    EXTJS4导出excel示例

    在EXTJS4中,实现导出数据到Excel的功能是一项常见的需求,这可以帮助用户方便地处理和存储大量数据。本示例将详细介绍EXTJS4如何实现Excel导出,并提供相关的代码示例。 EXTJS4的核心是其组件模型,包括表格(Grid...

    extjs4导出excel

    "extjs4导出excel"的功能就是实现了这个需求,让用户能够在ExtJS 4应用中方便地导出表格数据到Excel文件。 在ExtJS 4中实现数据导出至Excel通常涉及以下几个关键步骤: 1. **数据收集**:首先,你需要收集要导出的...

    ExtJS实现Excel的导出功能(poi)

    在本文中,我们将探讨如何使用ExtJS框架配合Apache POI库来实现Excel的导出功能。ExtJS是一个强大的JavaScript库,专门用于构建富客户端应用程序,它提供了丰富的组件和功能,而无需关注后端技术。Apache POI是Java...

    ExtJS poi 导入excel

    标题 "ExtJS poi 导入excel" 涉及到两个主要技术:ExtJS 和 Apache POI,它们在Java环境中用于处理Excel数据。ExtJS 是一个JavaScript库,主要用于构建富客户端应用程序,而Apache POI是Java的一个开源项目,用于...

    extjs 数据导出到Excel,数据列自选

    标题中的“extjs 数据导出到Excel,数据列自选”指的是使用EXTJS框架实现一个功能,让用户能够从Web应用中选择需要的数据列,并将这些选定的数据导出为Excel文件。EXTJS是一个强大的JavaScript库,专门用于构建富...

    ExtJs grid导出Excel

    当需要将Grid中的数据导出到Excel时,可以采用两种方法,这些方法在ExtJs 4.2版本中已经得到很好的支持。 **方法一:使用XLSX.js库** XLSX.js是一个JavaScript库,能够方便地读取和写入Excel文件。在ExtJs中,你...

    extjs模仿excel效果

    在本项目中,我们将探讨如何使用ExtJS来模仿Excel的表格效果,这涉及到表格的动态渲染、数据编辑、排序、过滤以及公式计算等多个方面。 首先,实现Excel的表格效果,我们需要创建一个基于ExtJS的GridPanel。...

    extjs gridToExcel

    这是一个简单的在extjs下的grid转化到Excel,里面代码简单易懂,在包里面还集成了复杂的js转化函数,不过本人没有用它来进行转化! 注:在用EXTJS的导出Excel技术中,一定要注意分页的问题

    Extjs4前台前台grid导出excel

    首先,我们需要了解`Ext.grid.Panel`,这是ExtJS中的核心组件之一,用于创建数据网格。它能够动态加载数据,提供排序、过滤、分页等功能,并且可以自定义列样式和行为。在ExtJS4中,我们可能有以下场景:用户在Grid...

    extjs 导入导出 Exel

    在EXTJS 中,导入和导出Excel 文件是常见的需求,特别是在处理大量数据时,Excel 的格式化和编辑能力非常有用。 ### 导出到Excel EXTJS 提供了多种方式来实现数据到Excel 的导出。一种常见的方式是通过服务器端...

    extjs把数据导出至excel

    标题 "extjs把数据导出至excel" 涉及的是使用ExtJS 3这个JavaScript框架将数据导出到Excel文件的技术。ExtJS是一个用于构建Web应用的前端库,提供了丰富的组件和API,使得在浏览器端处理数据变得更加方便。在这个...

    ExtJs Filter 表格过滤

    ExtJs 是一个强大的JavaScript库,专门用于构建富客户端的Web应用程序。在ExtJs中,"Filter"功能是用来处理数据网格(Grid)中的数据过滤,它允许用户根据特定条件快速筛选和查找所需信息。表格过滤是提高用户体验和...

Global site tag (gtag.js) - Google Analytics