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的更多相关文章

  1. ExtJs 学习之开篇(三)Ext.grid.Panel表格中的处理

    Ext.grid.Panel Ext.create('Ext.grid.Panel',{        title:'测试表格',        width:400,        height:20 ...

  2. 完善ext.grid.panel中的查询功能(紧接上一篇)

    今天的代码主要是实现,Ext.grid.panel中的查询,其实我也是一名extjs新手,开始想的实现方式是另外再创建一个新的grid类来存放查询出的数据(就是有几个分类查询就创建几个grid类),这 ...

  3. Ext.grid.Panel表格分页存储过程

    /*首先需要引入两个Extjs插件类 Ext.ux.data.PagingMemoryProxy和Ext.ux.ProgressBarPager这两个类*/ /*下面是控制弹出窗体放大缩小时窗体居中的 ...

  4. 【extjs】 extjs5 Ext.grid.Panel 搜索示例

    先看效果图: 页面js: <script type="text/javascript"> /** * 日志类型 store * */ var logTypeStore ...

  5. 【extjs】 ext5 Ext.grid.Panel 分页,搜索

    带有分页,搜索的grid. <%@page language="java" contentType="text/html; charset=UTF-8" ...

  6. Ext.grid.Panel 数据动态改变后刷新grid

    gridPanel中加载的数据分为两种:一种是本地数据加载,那另一种就是后台数据加载. 在表格中增.删.改.查 是必不可少的. 那么数据动态改变后怎样刷新表格中的数据呢. 一.后台取数据 var gr ...

  7. Ext.grid.Panel表格分页

    转载:http://www.cnblogs.com/libingql/archive/2012/04/22/2464994.html cshtml @{ Layout = null; } <!D ...

  8. [Extjs] Ext4 Ext.grid.Panel 分页实现(mybatis 分页插件-PageHelper 使用)

    先看图: 页面js代码: var userStore=Ext.create('Ext.data.Store', { storeId:'userStore', fields:['uname', 'ema ...

  9. ExtJS4.2 Ext.grid.panel Store更改后刷新表格

    //////////////////////// // Prepare store //////////////////////// // prepare fields and columns var ...

随机推荐

  1. 浅谈Mybatis(一)

    一.MyBatis引言 1.基本概念 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google co ...

  2. Redis中各种方法的使用

    ①set ; i< ; i++) { // 不可以重复添加数据 client.AddItemToSet(KKey, "dong升-" + i); } client.Remov ...

  3. jquery取对象数组元素的错误方式

    代码如下: <div id="div1"> <span>a</span> <span>b</span> <span ...

  4. No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=armv7 armv7s)

    In Build Settings are: Architectures: Starndard (armv7, armv7s) Base SDK: Latest iOS (iOS 6.0) Build ...

  5. 使用 PyQt 转换网页到 PDF(使用QtWebKit加载完毕后,打印整个窗口就行了,真简单!)

    import sys try: from PyQt4 import QtWebKit from PyQt4.QtCore import QUrl from PyQt4.QtGui import QAp ...

  6. android -上传文件到服务器

    android上传文件到服务器       重点:最好是设置好content-type这些参数的配置!     package com.spring.sky.image.upload.network; ...

  7. 将内部部署网络和 Windows Azure 集成的新选项: 使用AT&T

    关于云计算的主要对话围绕着向云迁移展开.今天,我们宣布与 AT&T 结为战略联盟,共同为客户提供云计算服务.这一合作伙伴关系将授权客户访问 Windows Azure,作为其现有数据中心的逻辑 ...

  8. delphi关于文件操作集锦

        关于文件操作集锦 取得该快捷方式的指向EXE关键词:快捷方式 LNK unit Unit1; interface usesWindows, Messages, SysUtils, Varian ...

  9. centos 修改shm

    Linux下,Oracle 11g的自动内存管理不能指定大于这个/dev/shm的总量内存.否则就会出现如下错误 ORA-00845: MEMORY_TARGET not supported on t ...

  10. iOS 首次启动画面,新装或更新用户可以通过它查看简介。

    // // GuideViewController.h // Guide // // Created by twb on 13-9-17. // Copyright (c) 2013年 twb. Al ...