easyui datagrid数据导出excel文件示例
2017-2-3更新:判断列隐藏(调用过hideColumn),将不会导出隐藏的的列内容。
2015-9-16更新:判断列是否配置过formmater函数,配置则调用formmater函数得到显示的数据。否则导出的数据是原始数据源中的数据,而非formmater后的数据。
2015-9-22更新:如果浏览器不支持“data:application/vnd.ms-excel;base64,”协议导出excel文件(如ie),改为直接表单提交生成的excel文件内容,而不是用ajax动态发送,这样服务器端不需要生成临时文件,造成服务器端磁盘空间浪费。如果要永久保留,自己可以选择使用ajax或普通表单提交。
easyui datagrid数据导出excel文件示例,首页由于安全问题,是否无法直接在客户端生成excel文件的,需要搭建服务器,将插件生成的excel文件需要的内容发送到动态页,动态页使用io对象将内容写入xls文件来导出。
首先要导入datagrid的扩展方法,用于将当前的数据生成excel需要的内容。
<script>
/**
Jquery easyui datagrid js导出excel
修改自extgrid导出excel
* 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>
*
*/
$.extend($.fn.datagrid.methods, {
getExcelXml: function (jq, param) {
var worksheet = this.createWorksheet(jq, param);
//alert($(jq).datagrid('getColumnFields'));
var totalWidth = 0;
var cfs = $(jq).datagrid('getColumnFields');
// for (var i = 1; i < cfs.length; i++) {
for (var i = 0; i < cfs.length; i++) {////////////////////更正这里,会导致第一列丢失,应该从0开始遍历
totalWidth += $(jq).datagrid('getColumnOption', cfs[i]).width;
}
//var totalWidth = this.getColumnModel().getTotalWidth(includeHidden);
return '<?xml version="1.0" encoding="utf-8"?>' +//xml申明有问题,以修正,注意是utf-8编码,如果是gb2312,需要修改动态页文件的写入编码
'<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>' + param.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:Font ss:FontName="arial" ss:Size="10" />' +
'<ss:Borders>' +
'<ss:Border ss:Weight="1" ss:LineStyle="Continuous" ss:Position="Top" />' +
'<ss:Border ss:Weight="1" ss:LineStyle="Continuous" ss:Position="Bottom" />' +
'<ss:Border ss:Weight="1" ss:LineStyle="Continuous" ss:Position="Left" />' +
'<ss:Border 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: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:Horizontal="Center" />' +
'<ss:Interior ss:Pattern="Solid" />' +
'</ss:Style>' +
'<ss:Style ss:ID="even">' +
'<ss:Interior ss:Pattern="Solid" />' +
'</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: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 (jq, param) {
// 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 cfs = $(jq).datagrid('getColumnFields');
var colCount = cfs.length;
var colFormatter = [];//用来记录列的自定义函数,以便用formmater得到显示的数据,而不是原始数据
//for (var i = 1; i < colCount; i++) {
for (var i = 0; i < colCount; i++) {////////////////////更正这里,会导致第一列丢失,应该从0开始遍历
if (cfs[i] != '') {
var cOpts = $(jq).datagrid('getColumnOption', cfs[i]);
colFormatter[i] = cOpts.formatter;
var w = cOpts.width;
totalWidthInPixels += w;
if (cfs[i] === "" || cOpts.hidden === true) {///////////////隐藏列不导出
cellType.push("None");
cellTypeClass.push("");
++visibleColumnCountReduction;
}
else {
colXml += '<ss:Column ss:AutoFitWidth="1" ss:Width="130" />';
headerXml += '<ss:Cell ss:StyleID="headercell">' +
'<ss:Data ss:Type="String">' + $(jq).datagrid('getColumnOption', cfs[i]).title + '</ss:Data>' +
'<ss:NamedCell ss:Name="Print_Titles" /></ss:Cell>';
cellType.push("String");
cellTypeClass.push("");
}
}
}
var visibleColumnCount = cellType.length - visibleColumnCountReduction;
var result = {
height: 9000,
width: Math.floor(totalWidthInPixels * 30) + 50
};
var rows = $(jq).datagrid('getRows');
// Generate worksheet header details.
var t = '<ss:Worksheet ss:Name="' + param.title + '">' +
'<ss:Names>' +
'<ss:NamedRange ss:Name="Print_Titles" ss:RefersTo="=\'' + param.title + '\'!R1:R2" />' +
'</ss:Names>' +
'<ss:Table x:FullRows="1" x:FullColumns="1"' +
' ss:ExpandedColumnCount="' + (visibleColumnCount + 2) +
'" ss:ExpandedRowCount="' + (rows.length + 2) + '">' +
colXml +
'<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++) {
for (var i = 0, it = rows, l = it.length; i < l; i++) {
t += '<ss:Row>';
var cellClass = (i & 1) ? 'odd' : 'even';
r = it[i];
var k = 0;
// for (var j = 1; j < colCount; j++) {
for (var j = 0; j < colCount; j++) {////////////////////更正这里,会导致第一列丢失,应该从0开始遍历
//if ((cm.getDataIndex(j) != '')
if (cfs[j] != '') {
//var v = r[cm.getDataIndex(j)];
var v = r[cfs[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 += colFormatter[j] ? colFormatter[j](v, r, i) : v;//判断列是否有formatter,有调用formatter得到原始数据
}
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 &P of &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;
}
});
</script>
导出easyui datagrid需要的测试代码,base64.js这文件去这里下载:javascript base64编码解码类库
<div style="margin-bottom:5px" id="tb">
<a href="#" class="easyui-linkbutton" onclick="return Save_Excel()" iconcls="icon-save" plain="true" title="导出excel文件"></a>
</div>
<table id="dg"></table>
<script src="base64.js"></script>
<script>
var supportBase64Import = true;
if (navigator.userAgent.indexOf('Safari') != -1||window.ActiveXObject || window.ActiveXObject || "ActiveXObject" in window) supportBase64Import = false; //safari,IE直接判断不支持,走ajax支线
//chrome,firefox支持客户端直接导出base64字符串数据
</script>
<script>
function Save_Excel() {//导出Excel文件
//getExcelXML有一个JSON对象的配置,配置项看了下只有title配置,为excel文档的标题
var data = $('#dg').datagrid('getExcelXml', { title: 'datagrid import to excel' }); //获取datagrid数据对应的excel需要的xml格式的内容
if (supportBase64Import) {//客户端支持base64内容导出文件,如chrome,firefox
window.location = 'data:application/vnd.ms-excel;base64,' + Base64.encode(data);
return false;
}
//不支持用表单提交,不需要生成excel临时文件
var url = 'datagrid-to-excel.ashx'; //如果为asp注意修改后缀
var f = $('#importForm');
if (f.length == 0) f = $('<form id="importForm" method="post" target="_blank" action="' + url + '"><input type="hidden" name="data"/></form>');
f.find('input').val(data);
f.submit();//提交表单
/*
//用ajax发动到动态页动态写入xls文件中
$.ajax({
url: url, data: { data: data }, type: 'POST', dataType: 'text',
success: function (fn) {
alert('导出excel成功!');
window.location = fn; //执行下载操作
},
error: function (xhr) {
alert('动态页有问题\nstatus:' + xhr.status + '\nresponseText:' + xhr.responseText)
}
});*/
return false;
}
$(function () {
$('#dg').datagrid({
singleSelect: true,
toolbar: '#tb',
url: 'product.json',
fitColumns: true, pagination: true, pageSize: 3,
title: 'easyui datagrid数据导出excel文件示例',
width: 400,
height: 300,
columns: [[{ field: 'itemid', width: 80, title: 'Item ID' },
{ field: 'productname', width: 100, editor: 'text', title: 'Product Name' },
{ field: 'listprice', width: 80, align: 'right', title: 'List Pirce' },
{ field: 'unitcost', width: 80, align: 'right', title: 'Unit Cost' }]]
});
});
</script>

导出的excel文件效果

datagrid-to-excel.ashx
<%@ WebHandler Language="C#" Class="datagrid_to_excel" %>
using System;
using System.Web;
using System.IO;
using System.Text;
public class datagrid_to_excel : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
string fn = DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".xls";
string data = context.Request.Form["data"];
//直接输出内容,设置好响应头,客户端即可保存为excel文件
context.Response.ContentType = "application/excel";
context.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + fn + "\"");
context.Response.Write(data);
/*
File.WriteAllText(context.Server.MapPath(fn), data, Encoding.UTF8);//如果是gb2312的xml申明,第三个编码参数修改为Encoding.GetEncoding(936)
context.Response.Write(fn);//返回文件名提供下载*/
}
public bool IsReusable {
get {
return false;
}
}
}
datagrid-to-excel.asp
<%
data=request.Form("data")
fn=year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&".xls"'文件名
Response.ContentType = "application/excel"
Response.AddHeader "Content-Disposition", "attachment;filename=""xxxx.xls"""
Response.Write(data)
''''''''生成临时文件代码
'set fso=server.CreateObject("scripting.filesystemobject")
'set ts=fso.CreateTextFile(server.MapPath(fn),true,true)'如果xml申明为gb2312,第三个参数改为false
'ts.Write(data)
'ts.close
'set ts=nothing
'set fso=nothing
'Response.Write(fn)'多谢网友daoyuanjiao的提示,缺少这句
%>
加支付宝好友偷能量挖...

原创文章,转载请注明出处:easyui datagrid数据导出excel文件示例
