1.客户端定义,基本的想法是form提交表格头定义,数据,以json方式传输
Ext.grid.Panel.addMembers({
exportExcel:function(options){
if(!Ext.isDefined(options)){options={}};
options.name = options.name || '未命名';
//这儿有一个约定,以time或date结尾的属性是时间类型
var cms=Ext.Array.map(this.columns,function(item){
if(Ext.String.endsWith(item.dataIndex,'time',true) || Ext.String.endsWith(item.dataIndex,'date',true)){
return {dataIndex:item.dataIndex,text:item.text,datatype:'DateTime',format:'yyyy-MM-dd HH:mm:ss'}
}
else{
return {dataIndex:item.dataIndex,text:item.text}
}
});
var data=Ext.Array.map(this.store.getRange(),function(item){
var d={};
for(var index=0;index<cms.length;index++){
var attName=cms[index].dataIndex
d[attName]=item.data[attName]
}
return d;
});
var form = Ext.create('Ext.form.Panel', {url:'/system/export/excel'
,standardSubmit: true
,frame:true
,items:[{xtype:'hiddenfield',name:'cms',value:Ext.JSON.encodeValue(cms)}
,{xtype:'hiddenfield',name:'data',value:Ext.JSON.encodeValue(data)}
,{xtype:'hiddenfield',name:'fileName',value:options.name+ '.xls'}
]
});
form.getForm().submit();
}
});
2.调用实例
this.gridPn.exportExcel({name:this.title});
3.现在的工作转到了服务端.操作excel的方法比较多,我个人喜欢myxls,因为数据是json传过来的,建议使用json.net,有了这两样好工具.只需要简单的包装一下就可以完成一般性的任务了.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.IO;
using System.Text;
using Newtonsoft.Json.Linq;
using org.in2bits.MyXls;
namespace CJRApp2.Web.Controllers
{
public class ExportController : Controller
{
// private DateTime baseDT = new DateTime(1970, 1, 1, 8, 0, 0);
private void addCell(XlsDocument doc, JToken r, JToken c, Cells cells, int rowIndex, int cellIndex)
{
string cName = c["dataIndex"].ToString();
if (c["datatype"] == null)
{
JValue jv = r[cName] as JValue;
if (jv != null && jv.Value != null)
{
switch (jv.Type)
{
case JTokenType.Float:
cells.Add(rowIndex, cellIndex, jv.ToObject<decimal>());
break;
case JTokenType.Integer:
cells.Add(rowIndex, cellIndex, jv.ToObject<int>());
break;
default:
cells.Add(rowIndex, cellIndex, jv.ToString());
break;
}
}
}
else if (c["datatype"].ToString() == "DateTime")
{
DateTime dt;
if (r[cName] != null && DateTime.TryParse(r[cName].ToString(),out dt))
{
string format = "yyyy-MM-dd HH:mm:ss";
if (c["format"] != null)
{
format = c["format"].ToString();
}
XF xf = doc.NewXF();
xf.Format = format;
Cell cell = cells.Add(rowIndex, cellIndex, dt, xf);
}
}
}
[HttpPost]
[ValidateInput(false)]
public ActionResult excel(string cms, string data, string title = "标题", string fileName = "export.xls")
{
string json = "{\"data\":" + data + ",\"cms\":" + cms + "}";
JObject jsonObj = JObject.Parse(json);
JToken cmsObj = jsonObj["cms"];
JToken dataObj = jsonObj["data"];
List<JToken> cmss = cmsObj.ToList();
List<JToken> datas = dataObj.ToList();
if (HttpContext.Request.UserAgent.IndexOf("MSIE") != -1)
{
fileName = HttpContext.Server.UrlEncode(fileName);
}
XlsDocument doc = new XlsDocument();
Worksheet sheet = doc.Workbook.Worksheets.Add(title);
Cells cells = sheet.Cells;
int rowIndex = 1;
int cellIndex = 0;
bool addrow = false;
foreach (JToken t in cmss)
{
cellIndex++;
Cell cell = cells.Add(rowIndex, cellIndex, t["text"].ToString());
if (t["columns"] != null)
{
addrow = true;
int c2Index = 0;
foreach (JToken c2 in t["columns"])
{
cells.Add(rowIndex + 1, cellIndex + c2Index, c2["text"].ToString());
c2Index++;
}
cellIndex += t["columns"].Count() - 1;
//sheet.AddMergeArea
}
}
if (addrow) { rowIndex++; }
foreach (JToken r in datas)
{
rowIndex++;
cellIndex = 0;
foreach (JToken c in cmss)
{
cellIndex++;
if (c["columns"] != null)
{
foreach (JToken cc in c["columns"])
{
addCell(doc, r, cc, cells, rowIndex, cellIndex++);
}
cellIndex--;
}
else
{
addCell(doc, r, c, cells, rowIndex, cellIndex);
}
}
}
return this.File(doc.Bytes.ByteArray, "application/vnd.ms-excel", fileName);
}
}
}