Mvc 拼接Html 导出 Excel(服务器不用安装呦!支持2007以上版本)
新公司,新接触,老方法,更实用。
之前接触过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();
}
}
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 = ;
int rowspan = ; var workBook = new XLWorkbook();
var ws = workBook.Worksheets.Add("Export"); int rowNum;
int columnNum; rowNum = ;
columnNum = ; string mapKey = string.Empty;
string mergKey = string.Empty; int rowCount = table.ChildNodes.Count;
int colCount = ; foreach (XmlNode row in table.ChildNodes)
{
if (colCount < row.ChildNodes.Count)
{
colCount = row.ChildNodes.Count;
}
} bool[,] map = new bool[rowCount + , colCount + ]; foreach (XmlNode row in table.ChildNodes)
{
columnNum = ;
foreach (XmlNode column in row.ChildNodes)
{
if (column.Attributes["rowspan"] != null)
{
rowspan = Convert.ToInt32(column.Attributes["rowspan"].Value);
}
else
{
rowspan = ;
} if (column.Attributes["colspan"] != null)
{
colspan = Convert.ToInt32(column.Attributes["colspan"].Value);
}
else
{
colspan = ;
} while (map[rowNum, columnNum])
{
columnNum++;
} if (rowspan == && colspan == )
{
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 - ), rowNum + rowspan - );
ws.Range(mergKey).Merge(); for (int m = ; m < rowspan; m++)
{
for (int n = ; n < colspan; n++)
{
map[rowNum + m, columnNum + n] = true;
}
}
}
columnNum++;
}
rowNum++;
} MemoryStream stream = new MemoryStream();
workBook.SaveAs(stream); return stream.ToArray(); }
}
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 = ;
int rowspan = ; int rowNum;
int columnNum;
rowNum = ;
columnNum = ; 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 + , colCount + ]; foreach (XmlNode row in table.ChildNodes)
{
columnNum = ;
foreach (XmlNode column in row.ChildNodes)
{
if (column.Attributes["rowspan"] != null)
{
rowspan = Convert.ToInt32(column.Attributes["rowspan"].Value);
}
else
{
rowspan = ;
} if (column.Attributes["colspan"] != null)
{
colspan = Convert.ToInt32(column.Attributes["colspan"].Value);
}
else
{
colspan = ;
} while (map[rowNum, columnNum])
{
columnNum++;
} if (rowspan == && colspan == )
{
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 - ), rowNum + rowspan - );
MergCells(ws, mergKey); for (int m = ; m < rowspan; m++)
{
for (int n = ; 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 = ; 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 = ; i < rowCount; i++)
{
IRow row = sheet.CreateRow(i);
for (int j = ; 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[]);
CellReference last = new CellReference(cellReferences[]); CellRangeAddress region = new CellRangeAddress(first.Row, last.Row, first.Col, last.Col);
sheet.AddMergedRegion(region);
}
}
4、Ascii 转化
public class Char
{
public static string Chr(int i)
{
char c = (char)( + i);
return c.ToString();
}
}
5、EpplusExportHelp (office 2007 以上版本)
public class EpplusExcelHelp
{ public static byte[] GenerateXlsxBytes2007(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 = ;
int rowspan = ; int rowNum;
int columnNum;
rowNum = ;
columnNum = ; ExcelPackage excel = new ExcelPackage();
ExcelWorksheet worksheet = excel.Workbook.Worksheets.Add("Export"); int rowCount = table.ChildNodes.Count;
int colCount = FetchColCount(table.ChildNodes); bool[,] map = new bool[rowCount + , colCount + ];
MemoryStream stream = new MemoryStream();
try
{
foreach (XmlNode row in table.ChildNodes)
{
columnNum = ;
foreach (XmlNode column in row.ChildNodes)
{
if (column.Attributes["rowspan"] != null)
{
rowspan = Convert.ToInt32(column.Attributes["rowspan"].Value);
}
else
{
rowspan = ;
} if (column.Attributes["colspan"] != null)
{
colspan = Convert.ToInt32(column.Attributes["colspan"].Value);
}
else
{
colspan = ;
} while (map[rowNum, columnNum])
{
columnNum++;
} if (rowspan == && colspan == )
{
worksheet.Cells[rowNum, columnNum].Value = column.InnerText;
}
else
{
worksheet.Cells[rowNum, columnNum, rowNum + rowspan - , columnNum + colspan - ].Merge = true;
worksheet.Cells[rowNum, columnNum].Value = column.InnerText;
for (int m = ; m < rowspan; m++)
{
for (int n = ; n < colspan; n++)
{
map[rowNum + m, columnNum + n] = true;
}
}
}
columnNum++;
}
rowNum++;
}
worksheet.Cells.Style.ShrinkToFit = true; excel.SaveAs(stream); return stream.ToArray();
}
catch (Exception ex)
{ throw ex;
}
finally
{
stream.Close();
}
} static int FetchColCount(XmlNodeList nodes)
{
int colCount = ; foreach (XmlNode row in nodes)
{
if (colCount < row.ChildNodes.Count)
{
colCount = row.ChildNodes.Count;
}
} return colCount;
}
}
以上代码就是实现Export Excel的全部代码
思路:拼接字符串构造一个纯Html的结构。用rowspan colspan来跨行跨列,把Html当做参数直接传过去调用写好的导出方法
返回数组。保存 完成!很简单!
希望能帮助大家!我的可能不是最好的方法!但是我在尽力去想!希望广大的博友一起想!想出更好的方法解决中国的所有技术人员的困惑!如有想法请留下您的宝贵评论!
Mvc 拼接Html 导出 Excel(服务器不用安装呦!支持2007以上版本)的更多相关文章
- C#中导出EXCEL服务器端不用安装OFFICE
在实际开发过程中,有时候服务器端没安装OFFICE,你和服务器管理员去商量安装个OFFICE的时候,管理员很倔犟的不给你安装的时候,这个时候就可以考虑我这个方法是实现导出EXCEL了.如果你导出的EX ...
- spring mvc项目中导出excel表格简单实现
查阅了一些资料,才整理出spring mvc 项目导出excel表格的实现,其实很是简单,小计一下,方便以后查阅,也希望帮助有需要的朋友. 1.导入所需要依赖(Jar包).我使用的是maven,所以坐 ...
- MVC中用NPOI导出Excel相关问题
情形1:可以直接带参数 前端页面: @.ActionLink("导出Excel", "DownLoadExcel", new { 参数名= '参数值' }, n ...
- MVC NPOI Linq导出Excel通用类
之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出 通用类: public enum DataTypeEnum { Int = , ...
- ASP.NET MVC 使用NPOI导出Excel 无法访问已关闭的流(转)
第一步重写MemoryStream , 让它不能自动关闭. //新建类 重写Npoi流方法 public class NpoiMemoryStream : MemoryStream { public ...
- Asp.Net MVC 使用FileResult导出Excel数据文件
MVC实现Excel导出功能,今天来记录一下. 采取了最简单的方法.(转载) 用的是Html拼接成Table表格的方式,返回 FileResult 输出一个二进制的文件. 第一种:使用FileCo ...
- asp.net Mvc 使用NPOI导出Excel文件
1.新建MVC项目,新建控制器.视图 添加控制器: 添加视图(将使用布局页前面的复选框里的勾勾去掉) 2.在Models里新建一个类 public class Shop { /// <summa ...
- mvc 根据模板导出excel,直接导出文件流
1.c# /// <summary> /// 导出员工 /// </summary> /// <returns></returns> [HttpGet] ...
- asp.net MVC 文件流导出Excel
<form id="FormEsExcel" action="/**/ExportEsExcelData" method="post" ...
随机推荐
- IIS7 配置
1.配置应用程序池->高级设置 (1) .net Framework版本 :V4.0 (2)启用32位应用程序 :True (3)特定时间: 上班之前,下班之后 2.网站配置->高级设置 ...
- [异常] Download interrupted: Connection to https://dl-ssl.google.com refused 安卓SDK下载被拒 3步解决
1.SDK Manager 的 Tools ->Options打开SDK Manager的Settings,选中“Force https://… sources to be fetched us ...
- Working With Taxonomy Field in CSOM
How to create taxonomy field with CSOM If you need to programmatic create a taxonomy field, you need ...
- Smarty3学习笔记
Smarty3 笔记 By 飞鸿影~ -- :: Smarty入门 1.什么是smarty? Smarty是采用php写的一个模版引擎,设计的目的是要将php代码与html代码分离, 使php程序员只 ...
- spider autohome (1)
Code: #!/usr/bin/python # -*- coding: UTF-8 -*- import re import urllib import time def getHtml(url) ...
- 注册表法修改IE8安全级别的方法
最近写客户端工具修复IE浏览器的一些功能,下面是网上找到的东东 1.将当前用户IE安全级别设置为“中”: Windows Registry Editor Version 5.00 [HKEY_CURR ...
- swap函数的四种写法
swap 函数的四种写法 (1)经典型 --- 嫁衣法 void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } ( ...
- SqlServer 查看事务锁及执行语句
一.查看当前锁定的事务 ,) ,用户机器名称,) ,是否被锁住),blocked) ,数据库名称,),cmd 命令,waittype as 等待类型 ,last_batch 最后批处理时间,open_ ...
- MFC可编辑ListBox控件CEditableListBox
左击选中单元格,右击进入编辑状态. MFC自定义控件的添加方法C#自定义控件编译后就自动出现在工具箱里.MFC的自定义控件需要先拖个基类到对话框上,然后添加一个控件变量.再修改源代码中的控件名为扩展控 ...
- windows xp/7命令提示符强制结束指定进程
开始----“运行 ”输入cmd ,然后在命令提示符下输入tasklist,出现如下列表: Image Name PID Session Name ...