导出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 ...
随机推荐
- samba服务器的安装及配置
安装前首先查看服务器是否已经安装samba服务器 [root@bogon home]# rpm -qa|grep samba system-config-samba-docs-1.0.9-1.el6. ...
- android 监听 USB 拔插广播消息
USBBroadcastReceiver.java package com.example.communication; import android.content.BroadcastReceive ...
- JavaSE思维导图(三)
- BZOJ 3774: 最优选择( 最小割 )
最小割...二分染色然后把颜色不同的点的源汇反过来..然后就可以做了. 某个点(x,y): S->Id(x,y)(回报), Id(x,y)->T(代价), Id(i,j)&& ...
- Labview中引用,属性节点,局部变量之间的区别
Labview中引用,属性节点,局部变量之间的区别 在Labview中我们经常会碰到这样几个概念,那就是控件的引用,属性节点以及局部变量,他们之间到底有哪些区别呢? 首先谈 ...
- web编程速度大比拼(nodejs go python)(非专业对比)
C10K问题的解决,涌现出一大批新框架,或者新语言,那么问题来了:到底谁最快呢?非专业程序猿来个非专业对比. 比较程序:输出Hello World! 测试程序:siege –c 100 –r 100 ...
- Android网络框架技术
网络相关1. Asynchronous Http Client for Android Android异步Http请求项目地址:https://github.com/loopj/android-asy ...
- Michael Kors成了时尚行业的公敌-股票频道-和讯网
Michael Kors成了时尚行业的公敌-股票频道-和讯网 Michael Kors成了时尚行业的公敌 字号 评论 邮件 纠错 2014年03月03日17:32 来源:财经天下 全球消费不 ...
- AspectJ给类的属性打桩,进行替换。
这个东西必须写个博客记一下了,一方面是防止以后忘记,一方面也反思一下自己的固执. 在我们的代码中,通常会有一些配置文件的路径写死在代码里面.比如 public class ConfigPath { p ...
- 浅析Thinkphp框架中运用phprpc扩展模式
浅析Thinkphp框架中应用phprpc扩展模式 这次的项目舍弃了原来使用Axis2做web服务端的 方案,改用phprpc实现,其一是服务端的thinkphp已集成有该模式接口,其二是phprpc ...