我准备在项目中实现该功能之前,google发现大部分代码都是利用一般处理程序HttpHandler实现的服务器端数据的Excel导出,但是这样存在的问题是ashx读取的数据一般都是数据库中视图的数据,难免会含有方便操作的主键ID这列的记录。现在项目需要在easyUI的DataGrid中显示的数据能全部导出Excel,包括DataGrid中的中文标题,其他的统统不要。

完成该功能所需的工具和环境:Newtonsoft.Json序列化和反序列化类库、easyUI前端UI框架、HttpHandler一般处理程序、Aspose.Cells电子表格生成组件;.Net Framework4.0。

前端完成DataGrid中的题头和数据行信息遍历访问,并以JS中二维数组的形式返回后台供ashx程序处理.

function ExportExcel() {
// 返回grid的所有可见行给后端供导出Excel用
var rows = $('#userlist').datagrid("getRows");
if (rows.length == 0) {
msgShow("没有数据可供导出");
return;
}
//返回grid的所有列的选项title、列宽等
// var columns = $('#userlist').datagrid("options").columns; //定制DataGrid的columns信息,只返回{field:,title:}
var columns = new Array();
var fields = $('#userlist').datagrid('getColumnFields');
for (var i = 0; i < fields.length; i++) {
var opts = $('#userlist').datagrid('getColumnOption', fields[i]);
var column = new Object();
column.field = opts.field;
column.title = opts.title;
columns.push(column);
}
var excelWorkSheet = new Object();
excelWorkSheet.rows = rows;
excelWorkSheet.columns = columns;
excelWorkSheet.sheetName = "设置导出的Excel工作表名"; var filename = "/HttpHandlers/FileHandler.ashx?action=exportexcel&excelWorkSheet=" + JSON.stringify(excelWorkSheet); location.href = filename;
}

  其中FileHandler.ashx是公共的文件处理程序,根据action=Exportexcel来实现Excel导出功能.

 public void ProcessRequest(HttpContext context)
{
var action = context.Request["action"];
switch (action.ToLower())
{
case "exportexcel":
EasyUIGrid2Excel(context);
break;
} }

  EasyUIGrid2Excel完成前台传递的关于Excel报表导出的参数,比如工作表名sheetName,题头标题和行记录。同时它完美解决了在各浏览器下文件名中文乱码问题,最后以弹窗的形式让用户选择直接打开还是下载。

 private void EasyUIGrid2Excel(HttpContext context)
{ var jsonString = context.Request["excelWorkSheet"];
//使用Newtonsoft.Json.Linq.JObject将json字符串转化成结构不固定的Class类
dynamic jsonObject = JObject.Parse(jsonString); string fileName = String.Concat(jsonObject.sheetName, DateTime.Now.ToString("yyyyMMdd-HHmmss"), ".xls") ; //解决中文文件名乱码只在IE中有效
// filename = HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8);
if (context.Request.UserAgent.ToLower().IndexOf("msie") > -1)
{
//当客户端使用IE时,对其进行编码;
//使用 ToHexString 代替传统的 UrlEncode();
fileName = CommonHelper.ToHexString(fileName);
}
if (context.Request.UserAgent.ToLower().IndexOf("firefox") > -1)
{
//为了向客户端输出空格,需要在当客户端使用 Firefox 时特殊处理 context.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
}
else
context.Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName); string extension = Path.GetExtension(fileName);
context.Response.ContentType = CommonHelper.GetMimeType(extension);
context.Response.ContentEncoding = Encoding.UTF8;
Workbook workbook = Object2Workbook(jsonObject, context);
context.Response.Clear();
context.Response.Buffer = true; context.Response.BinaryWrite(workbook.SaveToStream().ToArray()); context.Response.End();
}

  上面代码中的红色标注部分详见下载中的公共类库,其中Object2Workbook主要实现Aspose.cells中的Excel格式化输出定制,没有太多技巧,Aspose.cells还带有授权文件的哦,你懂的!

 private Workbook Object2Workbook(dynamic jsonObject, HttpContext context)
{
#region Aspose.Cell引用
Aspose.Cells.License licExcel = new License(); //Aspose.Cells申明
if (File.Exists(context.Server.MapPath("~/Bin/cellLic.lic")))
licExcel.SetLicense(context.Server.MapPath("~/Bin/cellLic.lic"));
#endregion Workbook workbook = new Workbook(); Worksheet sheet = workbook.Worksheets[0]; Styles styles = workbook.Styles;
int styleIndex = styles.Add();
Aspose.Cells.Style borderStyle = styles[styleIndex]; borderStyle.Borders.DiagonalStyle = CellBorderType.None;
borderStyle.HorizontalAlignment = TextAlignmentType.Center;//文字居中
Cells cells = sheet.Cells;
sheet.FreezePanes(1, 1, 1, 0);//冻结第一行
sheet.Name = jsonObject.sheetName;//接受前台的Excel工作表名 //为标题设置样式
Style styleTitle = workbook.Styles[workbook.Styles.Add()];//新增样式
styleTitle.HorizontalAlignment = TextAlignmentType.Center;//文字居中
styleTitle.Font.Name = "宋体";//文字字体
styleTitle.Font.Size = 18;//文字大小
styleTitle.Font.IsBold = true;//粗体 //题头样式
Style styleHeader = workbook.Styles[workbook.Styles.Add()];//新增样式
styleHeader.HorizontalAlignment = TextAlignmentType.Center;//文字居中
styleHeader.Font.Name = "宋体";//文字字体
styleHeader.Font.Size = 14;//文字大小
styleHeader.Font.IsBold = true;//粗体
styleHeader.IsTextWrapped = true;//单元格内容自动换行
styleHeader.Borders[BorderType.LeftBorder].LineStyle = CellBorderType.Thin;
styleHeader.Borders[BorderType.RightBorder].LineStyle = CellBorderType.Thin;
styleHeader.Borders[BorderType.TopBorder].LineStyle = CellBorderType.Thin;
styleHeader.Borders[BorderType.BottomBorder].LineStyle = CellBorderType.Thin; //内容样式
Style styleContent = workbook.Styles[workbook.Styles.Add()];//新增样式
styleContent.HorizontalAlignment = TextAlignmentType.Center;//文字居中
styleContent.Font.Name = "宋体";//文字字体
styleContent.Font.Size = 12;//文字大小
styleContent.Borders[BorderType.LeftBorder].LineStyle = CellBorderType.Thin;
styleContent.Borders[BorderType.RightBorder].LineStyle = CellBorderType.Thin;
styleContent.Borders[BorderType.TopBorder].LineStyle = CellBorderType.Thin;
styleContent.Borders[BorderType.BottomBorder].LineStyle = CellBorderType.Thin; var rowCount = jsonObject.rows.Count;//表格行数
var columnCount = jsonObject.columns.Count;//表格列数 //生成行1 标题行
cells.Merge(0, 0, 1, columnCount);//合并单元格
cells[0, 0].PutValue(jsonObject.sheetName);//填写内容
cells[0, 0].Style = styleTitle;
cells.SetRowHeight(0, 25); //生成题头列行
for (int i = 0; i < columnCount; i++)
{
cells[1, i].PutValue(jsonObject.columns[i]["title"]);
cells[1, i].Style = styleHeader;
cells.SetRowHeight(1, 23);
}
//生成内容行,第三行起始
//生成数据行
for (int i = 0; i < rowCount; i++)
{
for (int k = 0; k < columnCount; k++)
{
var currentColumnName = jsonObject.columns[k]["field"];
cells[2 + i, k].PutValue(jsonObject.rows[i][currentColumnName.Value]);
cells[2 + i, k].Style = styleContent;
}
cells.SetRowHeight(2 + i, 22);
} //添加制表日期
cells[2 + rowCount, columnCount-1].PutValue("制表日期:" + DateTime.Now.ToShortDateString());
sheet.AutoFitColumns();//让各列自适应宽度
sheet.AutoFitRows();//让各行自适应宽度
return workbook;
}

  

该code snippet也能很好的移植,在需要实现Excel导出的js文件中调用ExportExcel函数,传递sheetName值即可

国际惯例,无图无真相

文件下载

btw:另外请教两个问题,知道的童鞋回答一下,谢谢

1,通过客户端导出Excel的方式,当打开文件的时候,提示:文件错误,数据可能丢失, 初步认为可能数字以文本形式存到Excel中出现了问题?如果直接服务器端导出却没有这个错误

2,一对多表中数据更新问题,比如三张表User,Role和对应的关联表UserRole,其中主键都是自动递增ID。如果我更改了用户角色,当前的做法是在UserRole中删掉该用户的所有旧角色,再新增。感觉这样麻烦也不合理,请教大家有好的做饭没?

利用Aspose.Cells完成easyUI中DataGrid数据的Excel导出功能的更多相关文章

  1. 在ASP.NET MVC中利用Aspose.cells 将查询出的数据导出为excel,并在浏览器中下载。

    正题前的唠叨 本人是才出来工作不久的小白菜一颗,技术很一般,总是会有遇到一些很简单的问题却不知道怎么做,这些问题可能是之前解决过的.发现这个问题,想着提升一下自己的技术水平,将一些学的新的'好'东西记 ...

  2. 利用Aspose.cells 将查询出的数据导出为excel,并在浏览器中下载。

    正题前的唠叨 本人是才出来工作不久的小白菜一颗,技术很一般,总是会有遇到一些很简单的问题却不知道怎么做,这些问题可能是之前解决过的.发现这个问题,想着提升一下自己的技术水平,将一些学的新的‘好’东西记 ...

  3. silverlight中datagrid数据到处excel

    首先新建一个DataGrdiExtensions类,代码为: public static class DataGridExtensions { /// <summary> /// 导出dg ...

  4. 第二百二十二节,jQuery EasyUI,DataGrid(数据表格)组件

    jQuery EasyUI,DataGrid(数据表格)组件 学习要点: 1.加载方式 2.分页功能 本节课重点了解 EasyUI 中 DataGrid(数据表格)组件的使用方法,这个组件依赖于 Pa ...

  5. 怎么利用Aspose.Cells 获取excel 数据表中sheet的名称

    说明:开发环境 vs2012 asp.net mvc4 c# 利用Aspose.Cells 获取Excel数据表的sheet的名称,并把获取的名称赋值给easyUI 的combobox 1.运行效果 ...

  6. EasyUI中datagrid的基本用法

    EasyUI中datagrid是最常用的一个控件了,现在整理一下datagrid的基本语法,先展示下页面效果吧,如下图

  7. EasyUI中datagrid双击事件

    EasyUI中datagrid双击事件 在jsp文件底部增加代码: <script type="text/javascript"> //数据表双击事件 $('#tabl ...

  8. EasyUI 中 DataGrid 控件 列 如何绑定对象中的属性

    EasyUI 中 DataGrid 控件 是我们经常用到的控件之一, 但是 DataGrid 控件 在绑定显示列时却不支持对象属性绑定. 模型如下: public class Manager impl ...

  9. EasyUI:datagrid数据汇总

    EasyUI:datagrid数据汇总 js代码: var total=0;//全局变量 $(function(){ $('#tablebudgetdata').datagrid({ title:' ...

随机推荐

  1. PhpMyAdmin管理,登录多台远程MySQL服务器

    法一: 可直接在config.inc.php里添加数据库连接信息即可 先$i++, 然后复制原来的配置信息后修改 不过这种方式需要将连接信息写在配置文件中,有点麻烦. 这种后面省事,不用填信息,选择一 ...

  2. shell-bash学习03 别名、日期、函数

    别名 使用alias 创建 alias new_command='command sequence' 保存 echo 'alias cmd="command seq"' >& ...

  3. 快销品 车销批发管理手持终端PDA系统 打印开单 入库 库存 盘点多功能一体

    手持POS终端PDA移动开单 PDA通过扫描商品条码移动开单,实现便携式办公,伴随式销售,浩瀚技术研发团队开发的一款最新产品,PDA能通过WIFI无线局域网.GPRS互联网直接与主机连接,让公司业务人 ...

  4. WPF中文字体问题

  5. 遍历table指定name的td

    $("td[name='rates']").each(function () { var temp = $(this).text().substr(0,$(this).text() ...

  6. NumPy 学习(1): ndarrays

    Numpy 是Numerical Python的简写,用来进行高性能的科学计算以及数据分析的基础包.它是一些高级工具(pandas)的基础.它主要提供以下几个功能: (1). ndarray:计算快, ...

  7. PHP Java 设置cookie方法

      Java Cookie cookie = new Cookie(COOKIE_NAME, encrypt_cookieV); cookie.setMaxAge(60 * 60); cookie.s ...

  8. Codeforces 552C Vanya and Scales(思路)

    题目大概说有101个质量w0.w1.w2.....w100的砝码,和一个质量m的物品,问能否在天平两边放物品和砝码使其平衡. 哎,怎么没想到..注意到w0.w1.w2.....w100—— 把m转化成 ...

  9. HDU 3069 (树形DP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3069 题目大意:用最少警力,监控一个树,逮住逃犯.即最大警力去一个子树捉人时,确保父点至少被一个警察 ...

  10. Oracle 中的游标(用Javase中Iterator 类比之)

    当使用 pl/sql 查询 Oracle 数据库时,有时我们想输出多条记录的数据.:select * from scott.emp; 这时,我们一定会想利用循环来输出.但是,在pl/sql 中是没有数 ...