Mvc 导出 Excel(服务器不用安装呦!)

  新公司,新接触,老方法,更实用。

  之前接触过Webform,winfrom 的导出Excel方法 ,优点:省事。缺点:服务器必须安装Office

  这几天做项目 和 大牛学习了一下 新的方法,自己加以总结。希望更多的博友获益。不多说 。先上图,后上源码。

  很简单的MVC4 的页面 献丑了

  

效果图

  

  你猜了对了  我用的是 ClosedXml、NPOI  不是很新的东西!

  看看代码怎么实现吧 !

  1、工厂封装直接调用:

 1   public class ExportFactory
 2     {
 3         public static byte[] exportToExcel(string type)
 4         {
 5             byte[] bytes = null;
 6             switch (type.ToLower())
 7             {
 8                 case "npoi":
 9                     bytes = NpoiExcelHelp.GenerateXlsxBytes(GetHtml());
10                     break;
11                 case "closexml":
12                     bytes = ClosedXmlExcelHelp.GenerateXlsxBytes(GetHtml());
13                     break;
14                 default:
15                     break;
16             }
17             return bytes;
18         }
19
20         static string GetHtml()
21         {
22             StringBuilder strHtml = new StringBuilder();
23             strHtml.Append("<table>");
24             strHtml.Append("<tr>");
25             strHtml.Append("<td rowspan=‘2‘>First Row/First Colunm</td>");
26             strHtml.Append("<td>Second Row/First Colunm</td>");
27             strHtml.Append("</tr>");
28             strHtml.Append("<tr>");
29             strHtml.Append("<td>First Row/Second Colunm</td>");
30             strHtml.Append("</tr>");
31             strHtml.Append("<tr>");
32             strHtml.Append("<td>Second Row/Second Colunm</td>");
33             strHtml.Append("<td>Third Row/Second Colunm</td>");
34             strHtml.Append("</tr>");
35             strHtml.Append("</table>");
36             return strHtml.ToString();
37         }
38     }

  2、ClosedXmlExportHelp

  1   public class ClosedXmlExcelHelp
  2     {
  3         public static byte[] GenerateXlsxBytes(string tableHtml)
  4         {
  5             string xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + tableHtml;
  6
  7             XmlDocument doc = new XmlDocument();
  8             doc.LoadXml(xml);
  9
 10             XmlNode table = doc.SelectSingleNode("/table");
 11
 12             int colspan = 1;
 13             int rowspan = 1;
 14
 15             var workBook = new XLWorkbook();
 16             var ws = workBook.Worksheets.Add("Export");
 17
 18             int rowNum;
 19             int columnNum;
 20
 21             rowNum = 1;
 22             columnNum = 1;
 23
 24             string mapKey = string.Empty;
 25             string mergKey = string.Empty;
 26
 27             int rowCount = table.ChildNodes.Count;
 28             int colCount = 0;
 29
 30             foreach (XmlNode row in table.ChildNodes)
 31             {
 32                 if (colCount < row.ChildNodes.Count)
 33                 {
 34                     colCount = row.ChildNodes.Count;
 35                 }
 36             }
 37
 38             bool[,] map = new bool[rowCount + 1, colCount + 1];
 39
 40             foreach (XmlNode row in table.ChildNodes)
 41             {
 42                 columnNum = 1;
 43                 foreach (XmlNode column in row.ChildNodes)
 44                 {
 45                     if (column.Attributes["rowspan"] != null)
 46                     {
 47                         rowspan = Convert.ToInt32(column.Attributes["rowspan"].Value);
 48                     }
 49                     else
 50                     {
 51                         rowspan = 1;
 52                     }
 53
 54                     if (column.Attributes["colspan"] != null)
 55                     {
 56                         colspan = Convert.ToInt32(column.Attributes["colspan"].Value);
 57                     }
 58                     else
 59                     {
 60                         colspan = 1;
 61                     }
 62
 63                     while (map[rowNum, columnNum])
 64                     {
 65                         columnNum++;
 66                     }
 67
 68                     if (rowspan == 1 && colspan == 1)
 69                     {
 70                         ws.Cell(string.Format("{0}{1}", Char.Chr(columnNum), rowNum)).Value = column.InnerText;
 71                         map[rowNum, columnNum] = true;
 72                     }
 73                     else
 74                     {
 75                         ws.Cell(string.Format("{0}{1}", Char.Chr(columnNum), rowNum)).Value = column.InnerText;
 76                         mergKey =
 77                             string.Format("{0}{1}:{2}{3}",
 78                                 Char.Chr(columnNum), rowNum, Char.Chr(columnNum + colspan - 1), rowNum + rowspan - 1);
 79                         ws.Range(mergKey).Merge();
 80
 81                         for (int m = 0; m < rowspan; m++)
 82                         {
 83                             for (int n = 0; n < colspan; n++)
 84                             {
 85                                 map[rowNum + m, columnNum + n] = true;
 86                             }
 87                         }
 88                     }
 89                     columnNum++;
 90                 }
 91                 rowNum++;
 92             }
 93
 94             MemoryStream stream = new MemoryStream();
 95             workBook.SaveAs(stream);
 96
 97             return stream.ToArray();
 98
 99         }
100     }

  3、NPOIExportHelp

  1   public class NpoiExcelHelp
  2     {
  3         public static byte[] GenerateXlsxBytes(string tableHtml)
  4         {
  5             string xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + tableHtml;
  6
  7             XmlDocument doc = new XmlDocument();
  8             doc.LoadXml(xml);
  9
 10             XmlNode table = doc.SelectSingleNode("/table");
 11
 12             int colspan = 1;
 13             int rowspan = 1;
 14
 15             int rowNum;
 16             int columnNum;
 17             rowNum = 1;
 18             columnNum = 1;
 19
 20             var workBook = new HSSFWorkbook();
 21             var ws = workBook.CreateSheet("Export");
 22
 23             string mapKey = string.Empty;
 24             string mergKey = string.Empty;
 25
 26             int rowCount = table.ChildNodes.Count;
 27             int colCount = FetchColCount(table.ChildNodes);
 28
 29             InitSheet(ws, rowCount, colCount);
 30
 31             bool[,] map = new bool[rowCount + 1, colCount + 1];
 32
 33             foreach (XmlNode row in table.ChildNodes)
 34             {
 35                 columnNum = 1;
 36                 foreach (XmlNode column in row.ChildNodes)
 37                 {
 38                     if (column.Attributes["rowspan"] != null)
 39                     {
 40                         rowspan = Convert.ToInt32(column.Attributes["rowspan"].Value);
 41                     }
 42                     else
 43                     {
 44                         rowspan = 1;
 45                     }
 46
 47                     if (column.Attributes["colspan"] != null)
 48                     {
 49                         colspan = Convert.ToInt32(column.Attributes["colspan"].Value);
 50                     }
 51                     else
 52                     {
 53                         colspan = 1;
 54                     }
 55
 56                     while (map[rowNum, columnNum])
 57                     {
 58                         columnNum++;
 59                     }
 60
 61                     if (rowspan == 1 && colspan == 1)
 62                     {
 63                         SetCellValue(ws, string.Format("{0}{1}", Char.Chr(columnNum), rowNum), column.InnerText);
 64                         map[rowNum, columnNum] = true;
 65                     }
 66                     else
 67                     {
 68                         SetCellValue(ws, string.Format("{0}{1}", Char.Chr(columnNum), rowNum), column.InnerText);
 69                         mergKey =
 70                             string.Format("{0}{1}:{2}{3}",
 71                                 Char.Chr(columnNum), rowNum, Char.Chr(columnNum + colspan - 1), rowNum + rowspan - 1);
 72                         MergCells(ws, mergKey);
 73
 74                         for (int m = 0; m < rowspan; m++)
 75                         {
 76                             for (int n = 0; n < colspan; n++)
 77                             {
 78                                 map[rowNum + m, columnNum + n] = true;
 79                             }
 80                         }
 81                     }
 82                     columnNum++;
 83                 }
 84                 rowNum++;
 85             }
 86
 87             MemoryStream stream = new MemoryStream();
 88             workBook.Write(stream);
 89
 90             return stream.ToArray();
 91
 92         }
 93
 94         static int FetchColCount(XmlNodeList nodes)
 95         {
 96             int colCount = 0;
 97
 98             foreach (XmlNode row in nodes)
 99             {
100                 if (colCount < row.ChildNodes.Count)
101                 {
102                     colCount = row.ChildNodes.Count;
103                 }
104             }
105
106             return colCount;
107         }
108
109         static void InitSheet(ISheet sheet, int rowCount, int colCount)
110         {
111             for (int i = 0; i < rowCount; i++)
112             {
113                 IRow row = sheet.CreateRow(i);
114                 for (int j = 0; j < colCount; j++)
115                 {
116                     row.CreateCell(j);
117                 }
118             }
119         }
120
121         static void SetCellValue(ISheet sheet, string cellReferenceText, string value)
122         {
123             CellReference cr = new CellReference(cellReferenceText);
124             IRow row = sheet.GetRow(cr.Row);
125             ICell cell = row.GetCell(cr.Col);
126             cell.SetCellValue(value);
127         }
128
129         static void MergCells(ISheet sheet, string mergeKey)
130         {
131             string[] cellReferences = mergeKey.Split(‘:‘);
132
133             CellReference first = new CellReference(cellReferences[0]);
134             CellReference last = new CellReference(cellReferences[1]);
135
136             CellRangeAddress region = new CellRangeAddress(first.Row, last.Row, first.Col, last.Col);
137             sheet.AddMergedRegion(region);
138         }
139     }

  4、Ascii 转化

1  public class Char
2     {
3         public static string Chr(int i)
4         {
5             char c = (char)(64 + i);
6             return c.ToString();
7         }
8     }

  以上代码就是实现Export Excel的全部代码

   思路:拼接字符串构造一个纯Html的结构。用rowspan colspan来跨行跨列,把Html当做参数直接传过去调用写好的导出方法

   返回数组。保存 完成!很简单!

   希望能帮助大家!我的可能不是最好的方法!但是我在尽力去想!希望广大的博友一起想!想出更好的方法解决中国的所有技术人员的困惑!如有想法请留下您的宝贵评论!

Check Me Give You Source!

时间: 2024-08-29 23:54:46

Mvc 导出 Excel(服务器不用安装呦!)的相关文章

ASP.NET MVC导出excel(数据量大,非常耗时的,异步导出)

要在ASP.NET MVC站点上做excel导出功能,但是要导出的excel文件比较大,有几十M,所以导出比较费时,为了不影响对界面的其它操作,我就采用异步的方式,后台开辟一个线程将excel导出到指定目录,然后提供下载. 效果如下: 选中了多行,会导出多个工作簿sheet,一个汇总的,其他的就是明细数据. 这里我使用了NPOI组件来进行excel导出,下面是要几个封装好的类,从网上找的,然后修改了一下. GenerateSheet.cs using NPOI.SS.UserModel; usi

spring mvc 导出 excel

1 // js 触发导出 excel 方法 导出当前页的数据 含有条件查询的结果 2 // js 框架使用的 是 easyui 3 function doExport(){ 4 5 6 var optins = $("#grid").datagrid("getPager").data("pagination").options; 7 var page = optins.pageNumber; 8 var rows = optins.pageSiz

MVC导出Excel到客户端

MVC导出数据到Excel详解 今天为大家分享一个利用NPIO导出数据到Excel 客户端的例子!(刚毕业的小白,第一次写博,如有错误 还望各位大咖指正) 1.NPOI官方网站:(http://npoi.codeplex.com/) 需要引用的dll文件如下: 2.用到的ExcelHelper类: 1 using Common.Logging; 2 using NPOI.HPSF; 3 using NPOI.HSSF.UserModel; 4 using NPOI.HSSF.Util; 5 us

MVC导出Excel,提供下载Excel

类1: using System.Collections.Generic;using System.Data;using System.Web.Mvc;using System.IO;using System.Web.UI.WebControls;using System.Web;using System.Web.UI;using System.Drawing; namespace Base.ActionResult{    public class ExcelResult : System.W

菜鸟关于mvc导出Excel的想法

本人菜鸟一个,关于MVC生成Excel的一点想法.有错误请指教. 在视图上最终生成的table.添加下载excel按钮,用js或jq写当点击这个按钮执行查找页面上的<table>标签,并提交table的值.在控制器里写一个action用于接收返回的<table>的内容,进行处理生成excel文件,返回excel文件下载.

ASP.NET MVC导出excel

前端代码: 1 @Html.ActionLink("导出Excel", "ExportWarehouseInOutDetailTable", new {warehouseInOutId = Model.Id},new {@class = "btn btn-primary pull-right"}) 后端代码 1 public void ExportWarehouseInOutDetailTable(long warehouseInOutId) 2

mvc导出EXCEL

/// <summary> /// 导出EXCEL /// </summary> /// <returns></returns> public ActionResult ExportExcel(FormCollection form) { //var sbHtml = new StringBuilder(); //sbHtml.Append("<table border='1' cellspacing='0' cellpadding='0'&

asp.net webform/mvc导出Excel通用代码

最近将自己在项目中经常用到的excel导出方法分析如下,如有不妥之处望他人指出,如果有更好的方法希望展示出来互相学习. //导出事件 protected void btnexcel_Click(object sender, EventArgs e) { //定义导出Excel的标题 List<string> tabletitle = new List<string>(); tabletitle.Add("企业注册号"); tabletitle.Add("

mvc导出excel记录

前言: 记录这篇使用记录,是为了方便以后学习查阅和让没有使用过的人了解一下,其中不足还请见谅.不是很全的文章,大神请绕行.在项目中我们或多或少的会遇到数据导出到excel表格以便线下查看或者记录一些需要的数据信息.我所知道的有两个EPPlus和NPIO这两个插件.NPIO这个恕在下才疏学浅还没有使用不好多说,今天我就来说一下EPPlus.EPPlus准备:EPPlus官网地址:https://github.com/JanKallman/EPPlus下载之后,我们在程序添加程序集之后在需要使用的地