• 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 
  • 相关阅读:
    How to join (ap invoice distributions all) AP table info with PO Table
    Order Management APIs Oe_Order_Pub
    R12 Oe_Order_Pub API
    物料搬运单
    Process Order API In Order Management(详细)
    ap_invoice_distributions_all与PO表关联问题
    分配用人单位
    oe_order_pub 更改订单行数量,提示此更改的原因未提供或无效
    Order Management APIs
    提前期
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4160664.html
Copyright © 2020-2023  润新知