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" ...
随机推荐
- PHP爬虫技术(一)
摘要:本篇文章介绍PHP抓取网页内容技术,利用PHP cURL扩展获取网页内容,还可以抓取网页头部,设置cookie,处理302跳转. 一.cURL安装 采用源码安装PHP时,需要在configure ...
- jQuery/javascript实现网页注册的表单验证
<html> <head> <meta charset="utf-8"> <title>注册表单验证</title> & ...
- Activiti 查询流程定义
package com.mycom.processDefinition; import java.io.InputStream; import java.util.List; import java. ...
- 架设证书服务器 及 让IIS启用HTTPS服务(转)
无废话图文教程,教你一步一步搭建CA服务器,以及让IIS启用HTTPS服务. 一.架设证书服务器(CA服务) 1.在系统控制面板中,找到“添加/删除程序”,点击左侧的“添加/删除windows组件”, ...
- Swift - 计算文本高度
Swift - 计算文本高度 效果 源码 // // String+StringHeight.swift // StringHeight // // Created by YouXianMing on ...
- 防止ViewPager中的Fragment被销毁的方法,更加流畅
在使用ViewPager与Fragment的时候,ViewPager会自动缓存1页内的数据,如下图: 当我们当前处在页面2的时候,页面1和页面3的View实际上已经创建好了,所以在我们拖动的时候是可以 ...
- 安装redis监控
在修改登录中心的时候,数据存储在redis里面,需要对redis进行监控,使用的是Redis-Live 参考文章: http://www.nkrode.com/article/real-time-da ...
- 第六章 - 图像变换 - 图像拉伸、收缩、扭曲、旋转[1] - 仿射变换(cvWarpAffine)
拉伸.收缩.扭曲.旋转是图像的几何变换,在三维视觉技术中大量应用到这些变换,又分为仿射变换和透视变换.仿射变换通常用单应性建模,利用cvWarpAffine解决密集映射,用cvTransform解决稀 ...
- Dell U2913WM使用感受
21:9比例,本来想代替双屏的,一周用下来还是不适应,如何能弯成曲面就爽了.感觉最舒服的还是以前19寸5:4双屏,点距大. 还尝试在旁边立个23寸,看了15分钟就受不了,头晕. 漏光,还行. 加了个A ...
- C# 匿名委托、匿名方法、匿名对象、Lambda表达式
一.匿名类型可通过使用 new 运算符和对象初始值创建匿名类型.示例:var v = new { Name = "Micro", Message = "Hello&quo ...