开发过程中各类报表导入导出防不胜防,网上也是各种解决方法层出不穷,比如Excel,CSV,Word,PDF,HTML等等。。。

  

    网上各种导出插件也是层出不穷,NPOI,微软Microsoft.Office.Interop.Excel,EPPlus等等,其实说起来,微软自带的家伙还是不错的,但是必须要安装office组件,这个不能忍,服务器上安装一个office,呵呵哒!

    

    今天给大家介绍的Excel导入导出用的是NPOI,这个组件还是蛮好用的,而且不依赖office组件。可以根据Excel格式进行自定义。根据平常用到的一些用法进行了封装,旨在更方便的进行文档操作。

    

    我们在Ado.Net里面,DataTable用到的非常多;但是在EF里面,我们更多的是针对List进行操作,毕竟Linq的好处大家都是非常明白,下面通过几个示例分别介绍Excel的导出:

    DataTable导出Excel

 /// <summary>
/// DataTable导出到Excel
/// </summary>
/// <param name="dt"></param>
/// <param name="filename">文件名</param>
/// <param name="sheetname">表名</param>
/// <param name="maxrow">超过行数新建表</param>
/// <param name="isweb">是否web导出,默认是</param>
/// <returns></returns>
public static void DataTableToExcel(string filename, DataTable dt, string sheetname = "", int maxrow = , bool isweb = true)
{
if (dt == null || dt.Rows.Count < )
return;
if (filename.IndexOf(".xls", StringComparison.OrdinalIgnoreCase) < && filename.IndexOf(".xlsx", StringComparison.OrdinalIgnoreCase) < )
filename += ".xls";
IWorkbook workbook = new HSSFWorkbook();
if (sheetname.IsNullOrEmpty())
sheetname = filename;
if (dt.Rows.Count < maxrow)
WriteExcel(dt, , dt.Rows.Count - , workbook, sheetname);
else
{
int page = dt.Rows.Count / maxrow;
for (int i = ; i < page; i++)
{
int start = i * maxrow;
int end = (i * maxrow) + maxrow - ;
WriteExcel(dt, start, end, workbook, sheetname + i);
}
int lastPageItemCount = dt.Rows.Count % maxrow;
WriteExcel(dt, dt.Rows.Count - lastPageItemCount, lastPageItemCount, workbook, sheetname + page);
} using (MemoryStream ms = new MemoryStream())
{
workbook.Write(ms);
if (!isweb)
{
if (!filename.Contains("\\"))
filename = Config.Config.GenerateFilePath("Office") + filename; if (!File.Exists(filename))
{
using (FileStream fs = new FileStream(filename, FileMode.CreateNew))
{
fs.Write(ms.ToArray(), , ms.ToArray().Length);
fs.Close();
}
}
}
else
{
//Web导出
HttpContext curContext = HttpContext.Current;
curContext.Response.ContentType = "application/vnd.ms-excel";
curContext.Response.ContentEncoding = Encoding.UTF8;
curContext.Response.Charset = "";
curContext.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(filename, Encoding.UTF8));
curContext.Response.BinaryWrite(ms.GetBuffer());
curContext.Response.End();
}
}
}    private static void WriteExcel(DataTable dt, int start, int end, IWorkbook book, string sheetName)
{
ISheet sheet = book.CreateSheet(sheetName);
IRow header = sheet.CreateRow();
for (int i = ; i < dt.Columns.Count; i++)
{
ICell cell = header.CreateCell(i);
string val = dt.Columns[i].Caption ?? dt.Columns[i].ColumnName;
cell.SetCellValue(val);
}
int rowIndex = ;
for (int i = start; i <= end; i++)
{
DataRow dtRow = dt.Rows[i];
IRow excelRow = sheet.CreateRow(rowIndex++);
for (int j = ; j < dtRow.ItemArray.Length; j++)
excelRow.CreateCell(j).SetCellValue(dtRow[j].ToString().Trim());
}
}   调用方式:
public void Test()
{
  Excel.DataTableToExcel("dt7.xls",dt,"人员名录");
}


  List导出Excel:

/// <summary>
/// List导出Excel
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="filename">文件名称和路径</param>
/// <param name="sheetname">表名称</param>
/// <param name="data">数据</param>
/// <param name="title">表头</param>
/// <param name="isweb">是否web导出,默认是</param>
public static void ListToExcel<T>(string filename, string sheetname, List<T> data, List<string> title = null, bool isweb = true) where T : new()
{
if (data.Count < )
return;
if (filename.IndexOf(".xls", StringComparison.OrdinalIgnoreCase) < && filename.IndexOf(".xlsx", StringComparison.OrdinalIgnoreCase) < )
filename += ".xls";
var wookbook = new HSSFWorkbook();
var sheet = wookbook.CreateSheet(sheetname);
var entity = new T();
var propertys = entity.GetType().GetProperties(); if (title == null || title.Count < )
{
title = new List<string>();
foreach (PropertyInfo item in propertys)
{
if (!Ignore.IgnoreField(item.Name))
continue; title.Add(item.Name);
}
} var rowtitle = sheet.CreateRow(); for (var i = ; i < title.Count; i++)
rowtitle.CreateCell(i).SetCellValue(title[i]); for (var i = ; i < data.Count; i++)
{
var row = sheet.CreateRow(i + ); //因为表头名称占了一行,所以加1
for (var j = ; j < propertys.Length; j++)
{
if (!Ignore.IgnoreField(propertys[j].Name))
continue; var obj = propertys[j].GetValue(data[i], null);
row.CreateCell(j).SetCellValue(obj.ToString().Trim());
}
}
if (!isweb)
{
if (!filename.Contains("\\"))
filename = Config.Config.GenerateFilePath("Office") + filename; if (!File.Exists(filename))
{
using (var fs = new FileStream(filename, FileMode.CreateNew))
{
wookbook.Write(fs);
}
}
}
else
{
using (MemoryStream ms = new MemoryStream())
{
wookbook.Write(ms);
//Web导出
HttpContext curContext = HttpContext.Current;
curContext.Response.ContentType = "application/vnd.ms-excel";
curContext.Response.ContentEncoding = Encoding.UTF8;
curContext.Response.Charset = "";
curContext.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(filename, Encoding.UTF8));
curContext.Response.BinaryWrite(ms.GetBuffer());
curContext.Response.End();
}
}
}   
  调用方法:

  
  public void Test()
  {
    Excel.ListToExcel(path,"",list,newList<string>(){"编号","名字","时间"});
  }


OK,各位看官,这一期的文章Excel导出写到这里喏,感谢大家的支持,您的支持是我的动力!

下一期给大家带来的是常用的Excel导入,敬请期待!!!

 

Asp.Net 常用工具类之Office—Excel导出(4)的更多相关文章

  1. Asp.Net 常用工具类之Office—Excel导入(5)

    之前在做一个项目的时候,客户方面只提供了一份简单的Excel文件,且要跟现有数据进行对接. 当时想到的是如果数据量不大,可以Excel一条一条加进去,无奈数据有几十兆!!! 换了一种思维,进行了导入: ...

  2. Asp.Net 常用工具类---Config操作(7)

    近期工作比较忙,忙到忘记写博客(自己的借口,主要加班下班后不想动). 月初的时候,打算每两天写一篇博文,分享自己的一些心得和开发体验,无奈现在只写到第六篇,然而时间已经是20号,岁月不饶人! 总想写点 ...

  3. Asp.Net 常用工具类之Office-文档操作(6)

    文档一直是老大难问题,君不知,代码用时方恨少!有一套成熟的文件帮助类能很大程度上减少寻找各种资料的时间. 记得以前做一个业务,需要导出协议,一份可编辑,一份不可编辑.那么Word和PDF是最好的选择, ...

  4. Asp.Net 常用工具类之加密——非对称加密RSA算法

    踏入程序员这个行业也有几年了,几年中有收获(技术加强),有付出(时间和亚健康状态).当然喏,并不后悔,代码路还长!!! On The Way,永不止步!!! 开发过程中也积累了一些自己的经验.代码块和 ...

  5. Asp.Net 常用工具类之加密——对称加密DES算法(2)

    又到周末,下午博客园看了两篇文章,关于老跳和老赵的程序员生涯,不禁感叹漫漫程序路,何去何从兮! 转眼毕业的第三个年头,去过苏州,跑过上海,从一开始的凌云壮志,去年背起行囊默默回到了长沙准备买房,也想有 ...

  6. C#常用工具类——Excel操作类

    /// 常用工具类——Excel操作类 /// <para> ------------------------------------------------</para> / ...

  7. C#常用工具类——Excel操作类(ZT)

    本文转载于: http://www.cnblogs.com/zfanlong1314/p/3916047.html /// 常用工具类——Excel操作类 /// <para> ----- ...

  8. [C#] 常用工具类——文件操作类

    /// <para> FilesUpload:工具方法:ASP.NET上传文件的方法</para> /// <para> FileExists:返回文件是否存在&l ...

  9. PHP常用工具类

    <?php namespace isslib\Util; use think\Config; /** * 常用工具类 * User: xaxiong * Date: 2016/12/19 * T ...

随机推荐

  1. iOS 开发 旧版 framework

    0. 参考 http://www.cocoachina.com/ios/20150127/11022.html http://www.cnblogs.com/gcb999/p/3296414.html ...

  2. Delphi ShellExecute的用法

    请在interface处uses句中加入ShellAPI 有三个API函数可以运行可执行文件WinExec.ShellExecute和CreateProcess.1.CreateProcess因为使用 ...

  3. delphi edit编辑框使用

    Delphi编辑框Edit的用法 http://wenku.baidu.com/link?url=oKKm0VFBXexqiWt9ZNB8WxFGzwjJqRBM3ohrAy6GSMmOmwIzSWP ...

  4. java二维码生成-谷歌(Google.zxing)开源二维码生成学习及实例

    java二维码生成-谷歌(Google.zxing)开源二维码生成的实例及介绍   我们使用比特矩阵(位矩阵)的QR码编码在缓冲图片上画出二维码 实例有以下一个传入参数 OutputStream ou ...

  5. java操作redis redis连接池

    redis作为缓存型数据库,越来越受到大家的欢迎,这里简单介绍一下java如何操作redis. 1.java连接redis java通过需要jedis的jar包获取Jedis连接. jedis-2.8 ...

  6. iOS动画案例(1)

       受人所托,做一个类似于qq账号信息里的一个动画,感觉挺有意思,也没感觉有多难,就开始做了,结果才发现学的数学知识都还给体育老师了,研究了大半天才做出来.    先看一下动画效果:   用到的知识 ...

  7. iOS多线程的七大对象理解

    1用面向对象的观点去理解,进程和线程,同步和异步,并行和串行,还有主线程的主队列,的七者关系 进程:程序不运行时就是一堆代码,运行时就是一堆的进程的组合,进程是程序运行的基本单位. 线程:线程是进程的 ...

  8. 【js编程艺术】小制作五

    1.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...

  9. 微服务框架概览之 Netty

    Netty 是什么 Netty 提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序 Netty 架构图 为什么选择Netty 通过对Netty的分析,我 ...

  10. intelliJ IDEA创建web工程

    1.创建project,也就是eclipse里的workspace,eclipse里1个工作空间里可以创建多个工程,idea的一个工作空间里只创建1个工程. File -- New -- Projec ...