代码准备:

     一:实体准备

代码如下:

    /// <summary>
/// 一个能添加到将要导出到指定行的实体类型规范
/// data:{int StartColIndex ? 0, int ColSpan, object Value, bool Center}
/// </summary>
public interface IExcelModel
{
/// <summary>
/// 开始列的索引(即使是有合并单元格的情况,也得按未合并单元格时算)
/// </summary>
int StartColIndex { get; set; }
/// <summary>
/// 这个值一共占多少个单元格
/// </summary>
int ColSpan { get; set; }
/// <summary>
/// 值
/// </summary>
object Value { get; set; }
/// <summary>
/// 是否居中
/// </summary>
bool Center { get; set; }
}

上面的接口代码,是对要生成的Excel的单元格的规范,Center:表示是否居中,Value:表示显示的值,ColSpan:表示单元格(列)的合并数,

StartColIndex:表示是第几个单元格,而且跟单元格的合并没有关系。

 二:帮助方法类(Helper)准备

 /// <summary>
/// 使用NPOI由IList&lt;List&lt;IExcelModel&gt;&gt; datas导出Excel
/// </summary>
public static void ExportDataSetToExcel(string fileName, HSSFWorkbook book, ISheet sheet, IList<List<IExcelModel>> datas)
{
MemoryStream ms = ExportDataSetToExcel(book,sheet,datas) as MemoryStream;
System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName, Encoding.UTF8));
HttpContext.Current.Response.BinaryWrite(ms.ToArray());
HttpContext.Current.Response.End();
ms.Close();
ms = null;
}

上面方法中,IList<List<IExcelModel>>表示的是一个List<IExcelModel>的集合,而每一个List<IExcelModel>就是一些个单元格的集合,也就是一行。IList<List<IExcelModel>>就是表示要生成的Excel表是由多行的数据组成的。
fileName表示最后要保存的文件名,要带后缀名。
上面方法需要引用的方法代码如下:

private static Stream ExportDataSetToExcel(HSSFWorkbook book, ISheet sheet, IList<List<IExcelModel>> datas)
{
// create memory stream
MemoryStream ms = new MemoryStream(); // process excel file
AddDatasToExcelSheet(book, sheet, datas); book.Write(ms);
ms.Flush();
ms.Position = ;
book = null;
return ms;
}

上面方法需要引用的方法代码如下:

        /// <summary>
/// 将指定数据构造到 Excel 中
/// </summary>
/// <param name="book"></param>
/// <param name="sheet"></param>
/// <param name="datas"></param>
public static void AddDatasToExcelSheet(HSSFWorkbook book, ISheet sheet, IList<List<IExcelModel>> datas)
{
for (int i = ; i < datas.Count(); i++)
{
AddDatasToExcelRow(book, sheet, i, datas[i]);
}
} /// <summary>
/// 添加一个数据集合到将要导出的 Excel 的指定行。
/// </summary>
public static void AddDatasToExcelRow(HSSFWorkbook book, ISheet sheet, int rowIndex, List<IExcelModel> datas)
{
IRow row = sheet.CreateRow(rowIndex);
ICellStyle cs = book.CreateCellStyle();
foreach (dynamic data in datas)
{
ICell cell = row.CreateCell(data.StartColIndex);
cell.SetCellValue(data.Value);
if (data.ColSpan > )
{
CellRangeAddress cra = new CellRangeAddress(rowIndex, rowIndex, data.StartColIndex, data.StartColIndex + data.ColSpan - );
sheet.AddMergedRegion(cra);
}
if (data.Center)
{
//ICellStyle cs = book.CreateCellStyle();//放在这里会报错:The maximum number of cell styles was exceeded. You can define up to 4000 styles cs.VerticalAlignment = VerticalAlignment.Center;
cs.Alignment = HorizontalAlignment.Center;
cell.CellStyle = cs;
}
}
}

代码实战:

     

            IList<List<IExcelModel>> excelList = new List<List<IExcelModel>>();
//第一行
List<IExcelModel> firstRow = new List<IExcelModel>();
//第一个单元格
IExcelModel tempFRCell = new ExcelModel() { StartColIndex = , ColSpan = , Center = true, Value = "" };
//把第一个单元格添加到第一行中
firstRow.Add(tempFRCell);
//把第一个行添加到excelList
excelList.Add(firstRow); //最后的
HSSFWorkbook book = new HSSFWorkbook();
ISheet sheet = book.CreateSheet();
//book.Add(sheet);
ExcelConstructHelper.ExportDataSetToExcel("示例.xls", book, sheet, excelList);

这样就可以实现网页上直接下载一个Excel文件了。

未解决的问题:

       1:单元格的纵向合并
       2:单元格及行的样式
       如何将这两个都融合到上面提到的规范中去???
 ----------------------------------------------欢迎批评与交流!!!--------------------------

ASP.NET中的Excel操作(NPOI方式)的更多相关文章

  1. ASP.NET中的Excel操作(OLEDB方式)

    一:OLEDB方式操作Excel的个人理解 就是把要操作的Excel当作一个数据库,所有对Excel的操作,就变成了对“数据库”的操作.那么这时就需要有一个数据库的连接字符串. 代码如下: connS ...

  2. ASP.net中导出Excel的简单方法介绍

    下面介绍一种ASP.net中导出Excel的简单方法 先上代码:前台代码如下(这是自己项目里面写的一点代码先贴出来吧) <div id="export" runat=&quo ...

  3. ASP.net 中手工调用WS(POST方式)

    ASP.net 中手工调用WS(POST方式)核心代码:string strUrl="http://localhost:21695/service1.asmx/getmythmod" ...

  4. asp.net中导出Excel的方法

    一.asp.net中导出Excel的方法: 本文转载 在asp.net中导出Excel有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上:一种是将文件直接将文件输出 ...

  5. Asp.Net中的三种分页方式

    Asp.Net中的三种分页方式 通常分页有3种方法,分别是asp.net自带的数据显示空间如GridView等自带的分页,第三方分页控件如aspnetpager,存储过程分页等. 第一种:使用Grid ...

  6. 报表中的Excel操作之Aspose.Cells(Excel模板)

    原文:报表中的Excel操作之Aspose.Cells(Excel模板) 本篇中将简单记录下Aspose.Cells这个强大的Excel操作组件.这个组件的强大之处,就不多说,对于我们的报表总是会有导 ...

  7. C# asp.net中导出Excel表时总出现"只能在执行 Render() 的过程中调用 RegisterForEventValidation

    C# asp.net中导出Excel表时总出现"只能在执行 Render() 的过程中调用 RegisterForEventValidation 后台添加以下方法:/// <summa ...

  8. Asp.Net中使用OpenRowSet操作Excel表,导入Sql Server(实例)

    有两种接口可供选择:Microsoft.Jet.OLEDB.4.0(以下简称 Jet 引擎)和Microsoft.ACE.OLEDB.12.0(以下简称 ACE 引擎). Jet 引擎大家都很熟悉,可 ...

  9. winform excel导入--NPOI方式

    项目中要用到excel导入数据,用NPOI方式做了一个demo,记录如下: Form1代码: public Form1() { InitializeComponent(); } private voi ...

随机推荐

  1. 网络爬虫-获取infoq里的测试新闻保存至html

    用java+webdriver+testng实现获取infoq里的测试新闻,获取文章标题和内容,保存至html文件 前提条件: 已安装好java环境,工程导入了webdriver的jar包和testn ...

  2. GOPS2017全球运维大会 • 深圳站 历届金牌讲师精选亮相

    GOPS2017全球运维大会 • 深圳站将于2017年4月21日-22日在深圳举行,GOPS2017报名平台:活动家! 快捷报名通道:http://www.huodongjia.com/event-2 ...

  3. 一个简单sql注入的poc

    最近在提高自己编程能力,拿一些实用的小工具练下.该脚本为python语言,主要涉及模块urllib,re. 功能:验证CmsEasy5.5爆账号密码 实验用源码:http://pan.baidu.co ...

  4. 如何在无法直接用VS启动代码时如何调试代码

    1. 普通情况下对进程Attach就可以调试. 2. 但是在一些情况下直接attach并无法调试,例如安装程序installer, 这样使用如下的调试方法即可调试安装程序. System.Diagno ...

  5. tableView区头不显示

    不知道什么原因 如果设置tableView的样式为Group 则必须写代理 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; co ...

  6. dao代码模板

    提供数据源以及回收资源的工具类DbUtils: public class DbUtils { private static ComboPooledDataSource dataSource = new ...

  7. 用VB把xls转换为xlsx

    Sub xls批量转换成xlsx()Application.ScreenUpdating = FalseMsgBox "现在开始转换,请稍候!"mypath = ThisWorkb ...

  8. srping标签和hibernate查询

    Spring的注解形式:@Repository.@Service.@Controller,它们分别对应存储层Bean,业务层Bean,和展示层Bean. view层:    结合control层,显示 ...

  9. tablespace

    CREATE [UNDO] TABLESPACE tablespace_name [DATAFILE datefile_spec1 [,datefile_spec2] ...... [{MININUM ...

  10. Spring-MVC填坑之旅-返回json数据

    本文是自己开发中所遇到的问题,对一些及百度到的解决方案做一个记录. DispatcherServlet配置文件 <!-- 定义跳转的文件的前后缀 ,视图模式配置--> <bean i ...