导出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 ...
随机推荐
- 基于Jquery的Ajax分页,只有上一页和下一页
最近项目中用到ajax分页 在网上找到一个非常好用的分页插件jquery-pagination-ajax,以下是链接 http://www.zhangxinxu.com/wordpress/2010/ ...
- 查询离指定日期最近的一条数据(oracle)
select * from ( Select * from t_currency_rate where f_orig_curr='USD' and f_dest_curr='RMB ...
- 解决.Net MVC EntityFramework Json 序列化循环引用问题.
以前都是到处看博客,今天小菜也做点贡献,希望能帮到大家. 废话不多说,直接进入正题. 用过.net MVC的同学应该都被json序列化报循环引用错误这个问题骚扰过.网上有一些解决办法,但是都治标不治本 ...
- BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )
状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...
- hdu 4735Little Wish~ lyrical step~ 重复覆盖
题目链接 给出一棵树, 树上点的值为0或1, 可以交换树上两个点的权值, 给出一个距离m, 所有的0距离最近的1的距离不能超过m, 求最少的交换次数. 首先对于每一个点u,所有离u的距离不超过m的点v ...
- RHEL6.4 NFS文件共享服务搭建
NFS文件共享服务 1 实验方案 使用2台RHEL6.4虚拟机,其中一台作为NFS共享服务器(192.168.100.1).另外一台作为测试用的NFS客户机(192.168.100.2) 2.实现 2 ...
- WM_SYSCOMMAND包括很多功能,比如:拖动左边框、拖动标题栏、滚动条滚动、点击最小化、双击标题栏——Delphi 通过事件代替了大部分常用的消息,所以Delphi 简单、易用、高效
procedure TForm1.WMSysCommand(var Message: TWMSysCommand); var str: string; begin case Message.CmdTy ...
- dp-史上最戳最长最臭代码-hdu-4733-G(x)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4733 题目大意: 定义G(x)=x⊕(x>>1).给两个由0.1.?组成的长度相同的字符 ...
- jquery $.ajax $.get $.post的区别
$.ajax 是 jQuery 底层 AJAX 实现,$.ajax是一种通用的底层封装,$.ajax()请求数据之后,则需要使用回调函数,有beforeSend.error.dataFilter.su ...
- 模式匹配-KMP算法
/***字符串匹配算法***/ #include<cstring> #include<iostream> using namespace std; #define OK 1 # ...