最近,我做的统计功能用到了导出Excel的功能。刚开始我觉着,导出Excel是一个比较简单的功能,分分钟都能解决的,应该和自己当初做机房收费系统的时候一样,引用一下微软的SDK,再做一下相应的适应性处理就差不多了。后来,当我做出来的时候,测试人员说,自己做的功能,有点奇葩,没见过是这样导出Excel 的——打开Excel表格文件,然后将数据存放进去……

之后自己反思一下,发现自己的实现方法确实有点跟平常用的不一样,或许当初自己做的导出Excel也只是仅仅限于没有用户的练习方法吧。

后来一个同事告诉我,用NPOI来实现导出Excel。后来自己在网上查了查相关的资料,发现NPOI确实是一个不错的工具包,相比微软的SDK它的优点大致如下:

1、您可以完全免费使用该框架
2、包含了大部分EXCEL的特性(单元格样式、数据格式、公式等等)
3、支持处理的文件格式包括xls, xlsx, docx.
4、采用面向接口的设计架构( 可以查看 NPOI.SS 的命名空间)
5、同时支持文件的导入和导出
6、基于.net 2.0 也支持xlsx 和 docx格式(当然也支持.net 4.0)
7、来自全世界大量成功且真实的测试Cases
8、大量的实例代码
9、你不需要在服务器上安装微软的Office,可以避免版权问题。
10、使用起来比Office PIA的API更加方便,更人性化。
11、导出速度也是不可同日而语的,之前用微软的SDK时,450条,10列左右的数据用时30多秒,而用NPOI时那速度就是一秒不到,用到项目中了根本不会出现系统卡顿的现象。这个优势也是让我特别惊奇的!
接下来我就把自己写的一个Demo贴出来,供大家参考:
首先是定义个接口类,其中存放了包括打开,保存,修改等功能的接口:
<span style="font-size:24px;"><span style="font-size:24px;"><span style="font-size:24px;">public class ExcelOperateInterface{//获取excel操作类对象public static ExcelOperateInterface CreateInterfaceInstance(){ExcelOperateInterface eoi = null;//switch (EnvirMemory.excelOperateTool)//{//    case ExcelOperateToolType.Excel_Office://        {//            eoi = new ExcelOffice();//        } break;//    case ExcelOperateToolType.Excel_NPOI://        {eoi = new ExcelNPOI();//    } break;//case ExcelOperateToolType.Excel_Defalut://    {//        eoi = new ExcelOffice();//    } break;//default://    {//        eoi = new ExcelOffice();//    } break;//}return eoi;}public virtual void OpenFile(string file,int iSheetIndex) { }public virtual void CreateFile(string file, int iSheetIndex) { }public virtual void CloseFile(bool bsave) { }public virtual string GetCellValue(int iRowIndex, int iColumnIndex) { return ""; }public virtual void SetCellValue(string sValue, int iRowIndex, int iColumnIndex) { }public virtual string GetDateCellValue(int iRowIndex, int iColumnIndex) { return ""; }}
</span></span></span>

接下来是具体的实现类:

<span style="font-size:24px;"><span style="font-size:24px;">public class ExcelNPOI : ExcelOperateInterface{private string filename;private IWorkbook m_iWorkbook;private ISheet m_iSheet;private void iInitEnvironment(){filename = "";m_iWorkbook = null;m_iSheet = null;}private void SaveFile(){try{//NPOI保存文件时,最好是先删除以前的 再新建一个文件//FilesManager.DeleteFile(filename);//新建文件流using (FileStream stream = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Write)){int i = m_iWorkbook.NumberOfSheets;for (int ii = 0; ii < i; ++ii){ISheet ish = m_iWorkbook.GetSheetAt(ii);ish.DisplayGridlines = true;ish.DisplayRowColHeadings = true;}m_iWorkbook.Write(stream);stream.Flush();}}catch (Exception ex){}}public override void CreateFile(string file,int iSheetIndex){try{IWorkbook workbook = new XSSFWorkbook();ISheet sheet = workbook.CreateSheet("sheet0");for (int i = 0; i < 450; i++){IRow row = sheet.CreateRow(i);for (int j = 0; j < 50; j++){ICell cell = row.CreateCell(j);cell.SetCellValue("lcy");}}using (FileStream fs = File.OpenWrite(file)){workbook.Write(fs);}}catch (Exception ex){throw;}}public override void OpenFile(string file, int iSheetIndex){try{iInitEnvironment();filename = file;using (FileStream sfile = new FileStream(file, FileMode.Open, FileAccess.Read)){m_iWorkbook = WorkbookFactory.Create(sfile);if (m_iWorkbook != null){m_iSheet = m_iWorkbook.GetSheetAt(iSheetIndex - 1);}}}catch (Exception ex){}}public override void CloseFile(bool bsave){try{if (bsave){SaveFile();}iInitEnvironment();}catch{}}public override string GetCellValue(int iRowIndex, int iColumnIndex){string sResult = "";try{IRow irow = m_iSheet.GetRow(iRowIndex - 1);if (irow != null){ICell icell = irow.GetCell(iColumnIndex - 1);if (icell != null){sResult = icell.ToString();}}}catch{}return sResult;}public override string GetDateCellValue(int iRowIndex, int iColumnIndex){string sResult = "";try{IRow irow = m_iSheet.GetRow(iRowIndex - 1);if (irow != null){ICell icell = irow.GetCell(iColumnIndex - 1);if (icell != null){DateTime dt;if (DateTime.TryParse(icell.ToString(), out dt)){if (icell.CellType == CellType.Numeric){sResult = icell.DateCellValue.ToString();}else{sResult = icell.ToString();}}}}}catch{}return sResult;}public override void SetCellValue(string sValue, int iRowIndex, int iColumnIndex){try{//CreateFile("D:\\excel333.xls", 1);IRow irow = m_iSheet.GetRow(iRowIndex - 1);if (irow == null){irow = m_iSheet.CreateRow(iRowIndex - 1);}ICell icell = irow.GetCell(iColumnIndex - 1);if (icell == null){icell = irow.CreateCell(iColumnIndex - 1);}icell.SetCellType(CellType.String);if (sValue == ""){sValue = "/";}icell.SetCellValue(sValue);CloseFile(true);}catch{}}}</span></span>

最后就是调用了:方法很简单,我现在只用到了导出的功能,所以只用一个Create方法就可以实现了,打开、保存之类的方法是不需要的:

<span style="font-size:24px;"><span style="font-size:24px;"> string file = @"D:\\excel550.xls";ExcelOperate.ExcelOperateInterface.CreateInterfaceInstance().CreateFile(file, 1);</span></span>

另外,在项目中需要引用一下NPOI的dll文件,在网上比较好找,而且版本更新挺快的,所以在此就不再提供了。

WPF之NPOIE导出xcel相关推荐

  1. WPF datagrid数据导出到Excel表格

    封装成类,供以后使用(将datagrid导出) using System; using System.Collections.Generic; using System.Linq; using Sys ...

  2. WPF将DataGrid导出到Excel表格

    将DataGrid转换成DataTabel,我这里因为项目的特殊性,这样转换,也有其他方法直接转换. public void Export(DataGrid dgData, DataTable dat ...

  3. WPF 数据库数据导出为Datatable,Datatable导出为Excel

    安装Excel包 2.将数据库内容导为DataTable类型 System.Data.DataTable data_table = new System.Data.DataTable("My ...

  4. 分享Silverlight/WPF/Windows Phone一周学习导读(07月18日-07月24日)

    上周,微软推出Silverlight新版官方网站,新网站综合旧版网站内容,并增加更多Silverlight学习资源以及案例展示,Silverlight官网是学习Silverlight开发技术的主要资源 ...

  5. OxyPlot 导出图片及 WPF 元素导出为图片的方法

    OxyPlot 导出图片及 WPF 元素导出为图片的方法 目录 OxyPlot 导出图片及 WPF 元素导出为图片的方法 一.OxyPlot 自带导出方法 二.导出 WPF 界面元素的方法 三.通过附 ...

  6. WPF 使用 Expression Design 画图导出及使用 Path 画图

    WPF 使用 Expression Design 画图导出及使用 Path 画图 目录 WPF 使用 Expression Design 画图导出及使用 Path 画图 一.软件介绍 二.Micros ...

  7. WPF中使用PS导出的SVG矢量图

    1.PS导出的SVG格式内容如下图,是Image的Base64,不是我们想要的  2.通过阿里巴巴矢量图库转成我们想要的svg代码 将PS导出的SVG上传阿里巴巴矢量库,然后再把上传的SVG下载下来 ...

  8. AutoCAD导出wmf文件,并转成wpf xaml

    我们知道WPF的xaml有无损图形的能力,平时可以用AI画无损导出svg来转成xaml,或者从iconfont找资源,但是对于工业或者工程界,找用AutoCAD的人一抓一大把,怎么好好利用起来呢?我们 ...

  9. WPF及Silverlight中将DataGrid数据导出

    这段源码是我在项目中实际应用的源码,没有经过删减及处理. 如果你认为有用可以摘去作为自己的导出类中的一个小工具使用. /// <summary>     /// 数据源导出辅助类      ...

  10. WPF导出发布安装包,无法验证发行者解决办法

    右击工程项目点发布->完成 此时在工程目录下生成了安装文件setup.exe 同时又在工程下生成了临时证书WpfApp1_TemporaryKey.pfx 如果此时强行安装会弹出如下警告 接下来 ...

最新文章

  1. 放弃51单片机,直接学STM32开发会有什么严重的问题?
  2. 域控服务器发生w32time错误
  3. 基于词典的正向最大匹配中文分词算法,能实现中英文数字混合分词
  4. RecyclerView缓存机制(回收些啥?)
  5. 移动手机平台的HTML5前端优化指南
  6. C++list常用接口总结
  7. flask带有传入参数既有URL还有其他参数类型:建议使用方式二(flask 使用查询字符串的方式)
  8. 如何把域名解析到网站空间IP上?
  9. python threading.local
  10. 程序局部性(时间局部性与空间局部性)与循环展开原理详解
  11. Linq 学习笔记(一)
  12. charts引入icon图片_如何在React中优雅的使用icon
  13. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_18-页面查询接口定义-定义接口...
  14. MySQL面试题中:主从同步部署介绍
  15. 找回Windows 10安全通知图标
  16. python字典存储省份与城市_python实现城市和省份字典(根据城市判断属于哪个省份)...
  17. 20210130上午新初一(GW+JZ)比赛总结
  18. Python语言基础学习
  19. oracle10g安装未知错误
  20. 开源OA:手把手教你搭建OA办公系统(13)将O2OA集成到钉钉

热门文章

  1. 5千字长文:KeePass完全入门指南(附已经配置好的版本)
  2. Riverbed将SD-WAN融入WAN优化
  3. java eml_java读取eml文件 | 学步园
  4. 趋势科技预测 2017物联网装置将担任重要攻击角色
  5. Android市场变化令微软很受伤 专利授权收入锐减26%
  6. 拒做背锅侠!如何利用网站性能优化驱动产品体验提升
  7. 宇宙中最恐怖的行星之索伦之眼—北落师门b
  8. 公司发展事件时间轴jsjs特效
  9. Chrome浏览器断网时的小恐龙dino怎么一直玩?
  10. astropy.io.fits 教程