zoukankan      html  css  js  c++  java
  • Mvc 导出 Excel

    Mvc 导出 Excel

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

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

      很简单的MVC4 的页面 献丑了

       

        效果图

      

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

      看看代码怎么实现吧 ! 

      1、工厂封装直接调用:

    public class ExportFactory
    {
    public static byte[] exportToExcel(string type)
    {
    byte[] bytes = null;
    switch (type.ToLower())
    {
    case "npoi":
    bytes = NpoiExcelHelp.GenerateXlsxBytes(GetHtml());
    break;
    case "closexml":
    bytes = ClosedXmlExcelHelp.GenerateXlsxBytes(GetHtml());
    break;
    default:
    break;
    }
    return bytes;
    }

    static string GetHtml()
    {
    StringBuilder strHtml = new StringBuilder();
    strHtml.Append("<table>");
    strHtml.Append("<tr>");
    strHtml.Append("<td rowspan='2'>First Row/First Colunm</td>");
    strHtml.Append("<td>Second Row/First Colunm</td>");
    strHtml.Append("</tr>");
    strHtml.Append("<tr>");
    strHtml.Append("<td>First Row/Second Colunm</td>");
    strHtml.Append("</tr>");
    strHtml.Append("<tr>");
    strHtml.Append("<td>Second Row/Second Colunm</td>");
    strHtml.Append("<td>Third Row/Second Colunm</td>");
    strHtml.Append("</tr>");
    strHtml.Append("</table>");
    return strHtml.ToString();
    }
    }

    复制代码
     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

    public class ClosedXmlExcelHelp
    {
    public static byte[] GenerateXlsxBytes(string tableHtml)
    {
    string xml = "<?xml version="1.0" encoding="utf-8"?>" + tableHtml;

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);

    XmlNode table = doc.SelectSingleNode("/table");

    int colspan = 1;
    int rowspan = 1;

    var workBook = new XLWorkbook();
    var ws = workBook.Worksheets.Add("Export");

    int rowNum;
    int columnNum;

    rowNum = 1;
    columnNum = 1;

    string mapKey = string.Empty;
    string mergKey = string.Empty;

    int rowCount = table.ChildNodes.Count;
    int colCount = 0;

    foreach (XmlNode row in table.ChildNodes)
    {
    if (colCount < row.ChildNodes.Count)
    {
    colCount = row.ChildNodes.Count;
    }
    }

    bool[,] map = new bool[rowCount + 1, colCount + 1];

    foreach (XmlNode row in table.ChildNodes)
    {
    columnNum = 1;
    foreach (XmlNode column in row.ChildNodes)
    {
    if (column.Attributes["rowspan"] != null)
    {
    rowspan = Convert.ToInt32(column.Attributes["rowspan"].Value);
    }
    else
    {
    rowspan = 1;
    }

    if (column.Attributes["colspan"] != null)
    {
    colspan = Convert.ToInt32(column.Attributes["colspan"].Value);
    }
    else
    {
    colspan = 1;
    }

    while (map[rowNum, columnNum])
    {
    columnNum++;
    }

    if (rowspan == 1 && colspan == 1)
    {
    ws.Cell(string.Format("{0}{1}", Char.Chr(columnNum), rowNum)).Value = column.InnerText;
    map[rowNum, columnNum] = true;
    }
    else
    {
    ws.Cell(string.Format("{0}{1}", Char.Chr(columnNum), rowNum)).Value = column.InnerText;
    mergKey =
    string.Format("{0}{1}:{2}{3}",
    Char.Chr(columnNum), rowNum, Char.Chr(columnNum + colspan - 1), rowNum + rowspan - 1);
    ws.Range(mergKey).Merge();

    for (int m = 0; m < rowspan; m++)
    {
    for (int n = 0; n < colspan; n++)
    {
    map[rowNum + m, columnNum + n] = true;
    }
    }
    }
    columnNum++;
    }
    rowNum++;
    }

    MemoryStream stream = new MemoryStream();
    workBook.SaveAs(stream);

    return stream.ToArray();

    }
    }

    复制代码
      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

    public class NpoiExcelHelp
    {
    public static byte[] GenerateXlsxBytes(string tableHtml)
    {
    string xml = "<?xml version="1.0" encoding="utf-8"?>" + tableHtml;

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);

    XmlNode table = doc.SelectSingleNode("/table");

    int colspan = 1;
    int rowspan = 1;

    int rowNum;
    int columnNum;
    rowNum = 1;
    columnNum = 1;

    var workBook = new HSSFWorkbook();
    var ws = workBook.CreateSheet("Export");

    string mapKey = string.Empty;
    string mergKey = string.Empty;

    int rowCount = table.ChildNodes.Count;
    int colCount = FetchColCount(table.ChildNodes);

    InitSheet(ws, rowCount, colCount);

    bool[,] map = new bool[rowCount + 1, colCount + 1];

    foreach (XmlNode row in table.ChildNodes)
    {
    columnNum = 1;
    foreach (XmlNode column in row.ChildNodes)
    {
    if (column.Attributes["rowspan"] != null)
    {
    rowspan = Convert.ToInt32(column.Attributes["rowspan"].Value);
    }
    else
    {
    rowspan = 1;
    }

    if (column.Attributes["colspan"] != null)
    {
    colspan = Convert.ToInt32(column.Attributes["colspan"].Value);
    }
    else
    {
    colspan = 1;
    }

    while (map[rowNum, columnNum])
    {
    columnNum++;
    }

    if (rowspan == 1 && colspan == 1)
    {
    SetCellValue(ws, string.Format("{0}{1}", Char.Chr(columnNum), rowNum), column.InnerText);
    map[rowNum, columnNum] = true;
    }
    else
    {
    SetCellValue(ws, string.Format("{0}{1}", Char.Chr(columnNum), rowNum), column.InnerText);
    mergKey =
    string.Format("{0}{1}:{2}{3}",
    Char.Chr(columnNum), rowNum, Char.Chr(columnNum + colspan - 1), rowNum + rowspan - 1);
    MergCells(ws, mergKey);

    for (int m = 0; m < rowspan; m++)
    {
    for (int n = 0; n < colspan; n++)
    {
    map[rowNum + m, columnNum + n] = true;
    }
    }
    }
    columnNum++;
    }
    rowNum++;
    }

    MemoryStream stream = new MemoryStream();
    workBook.Write(stream);

    return stream.ToArray();

    }

    static int FetchColCount(XmlNodeList nodes)
    {
    int colCount = 0;

    foreach (XmlNode row in nodes)
    {
    if (colCount < row.ChildNodes.Count)
    {
    colCount = row.ChildNodes.Count;
    }
    }

    return colCount;
    }

    static void InitSheet(ISheet sheet, int rowCount, int colCount)
    {
    for (int i = 0; i < rowCount; i++)
    {
    IRow row = sheet.CreateRow(i);
    for (int j = 0; j < colCount; j++)
    {
    row.CreateCell(j);
    }
    }
    }

    static void SetCellValue(ISheet sheet, string cellReferenceText, string value)
    {
    CellReference cr = new CellReference(cellReferenceText);
    IRow row = sheet.GetRow(cr.Row);
    ICell cell = row.GetCell(cr.Col);
    cell.SetCellValue(value);
    }

    static void MergCells(ISheet sheet, string mergeKey)
    {
    string[] cellReferences = mergeKey.Split(':');

    CellReference first = new CellReference(cellReferences[0]);
    CellReference last = new CellReference(cellReferences[1]);

    CellRangeAddress region = new CellRangeAddress(first.Row, last.Row, first.Col, last.Col);
    sheet.AddMergedRegion(region);
    }
    }

    复制代码
      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 转化

    public class Char
    {
    public static string Chr(int i)
    {
    char c = (char)(64 + i);
    return c.ToString();
    }
    }

    复制代码
    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!

    作者:Elite.net 
    出处:http://www.cnblogs.com/yhyjy/ 
    新浪微博:http://weibo.com/u/2709913775 
  • 相关阅读:
    spring cloud 和 阿里微服务spring cloud Alibaba
    为WPF中的ContentControl设置背景色
    java RSA 解密
    java OA系统 自定义表单 流程审批 电子印章 手写文字识别 电子签名 即时通讯
    Hystrix 配置参数全解析
    spring cloud 2020 gateway 报错503
    Spring Boot 配置 Quartz 定时任务
    Mybatis 整合 ehcache缓存
    Springboot 整合阿里数据库连接池 druid
    java OA系统 自定义表单 流程审批 电子印章 手写文字识别 电子签名 即时通讯
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4160664.html
Copyright © 2011-2022 走看看