导出Ext.grid.Panel到excel
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); }
}
}
导出Ext.grid.Panel到excel的更多相关文章
- ExtJs 学习之开篇(三)Ext.grid.Panel表格中的处理
Ext.grid.Panel Ext.create('Ext.grid.Panel',{ title:'测试表格', width:400, height:20 ...
- 完善ext.grid.panel中的查询功能(紧接上一篇)
今天的代码主要是实现,Ext.grid.panel中的查询,其实我也是一名extjs新手,开始想的实现方式是另外再创建一个新的grid类来存放查询出的数据(就是有几个分类查询就创建几个grid类),这 ...
- Ext.grid.Panel表格分页存储过程
/*首先需要引入两个Extjs插件类 Ext.ux.data.PagingMemoryProxy和Ext.ux.ProgressBarPager这两个类*/ /*下面是控制弹出窗体放大缩小时窗体居中的 ...
- 【extjs】 extjs5 Ext.grid.Panel 搜索示例
先看效果图: 页面js: <script type="text/javascript"> /** * 日志类型 store * */ var logTypeStore ...
- 【extjs】 ext5 Ext.grid.Panel 分页,搜索
带有分页,搜索的grid. <%@page language="java" contentType="text/html; charset=UTF-8" ...
- Ext.grid.Panel 数据动态改变后刷新grid
gridPanel中加载的数据分为两种:一种是本地数据加载,那另一种就是后台数据加载. 在表格中增.删.改.查 是必不可少的. 那么数据动态改变后怎样刷新表格中的数据呢. 一.后台取数据 var gr ...
- Ext.grid.Panel表格分页
转载:http://www.cnblogs.com/libingql/archive/2012/04/22/2464994.html cshtml @{ Layout = null; } <!D ...
- [Extjs] Ext4 Ext.grid.Panel 分页实现(mybatis 分页插件-PageHelper 使用)
先看图: 页面js代码: var userStore=Ext.create('Ext.data.Store', { storeId:'userStore', fields:['uname', 'ema ...
- ExtJS4.2 Ext.grid.panel Store更改后刷新表格
//////////////////////// // Prepare store //////////////////////// // prepare fields and columns var ...
随机推荐
- DataTable转换实体类
using System;using System.Collections.Generic;using System.Text;using System.Data;using System.Data. ...
- HTTP错误500.22 检测到在集成的托管管道模式下不适用的ASP.NET设置
这里主要把集成模式改成经典模式 解决方案一: 解决方案二: 修改配置文件web.config 将 <configuration> <system.web> <compil ...
- Facebook、新浪微博、Twitter、腾讯微博分享代码
最近总结一下用到的分享代码 FaceBook分享 <a href="https://www.facebook.com/sharer/sharer.php?u=你的链接" ta ...
- java中log4j的使用体验
log4j相信大部分java开发者都已经很熟悉了,在此记录下自己的使用过程. 一.文件准备: 1.log4j.jar(我这里使用的版本是log4j-1.2.17.jar,在附件中提供下载) 2.log ...
- js简单实现链式调用
链式调用实现原理:对象中的方法执行后返回对象自身即可以实现链式操作.说白了就是每一次调用方法返回的是同一个对象才可以链式调用. js简单实现链式调用demo Object.prototype.show ...
- 关于Connection must be valid and open.
这个Bug真心很操蛋! 我的网站在公司做的运行一切都没问题,回家后咋自己的电脑上出现了Connection must be valid and open.这个问题. 我最后还是在英文网站的一个不起眼的 ...
- Node.js 启动小结
配置环境变量: cmd-------> 启动dyson服务 在项目的路径下 如open cmd进入open目录执行npm start命令 在浏览器下输入访问地址:http://localhost ...
- jquery实现锚点动画效果
锚点相信大家都使用过吧!点击后僵硬的切换是不是很不爽呢? 下面分享一个小技巧,根据锚点offset值来实现动画切换 <!DOCTYPE html PUBLIC "-//W3C//DTD ...
- vs2008 edit spin 十六进制实现
由于做的东西中涉及到一个控件,查了一下叫spin box,但是,spin box控件只在对话框里面才能使用,而且比较麻烦,更何况还要用十六进制,查到就有可多edit+spin来做,后来找到一个样例着手 ...
- Debian下自动备份文件并上传到远程FTP服务器且删除指定日期前的备份Shell脚本
说明: 1.备份目录/home/osyunwei下面所有的文件到/home/osyunweibak里面,并且保存为osyunwei20120701.tar.gz的压缩文件格式(2012_07_01是 ...