最近项目需要导出Excel,找来找去,微软有自己的Excel组件 using Microsoft.Office.Core;using Microsoft.Office.Interop.Excel;,但是有一个毛病,就是程序所在电脑安装Office,这个问题简直是致命的,因为导出服务我们要做在服务端,程序直接生成Excel,然后客户端路径去下载,所以我们不可能在部署服务的时候还要在服务器上安装office.最后终于发现有个NOPI库,可以很好的解决这个问题,现在就将项目的Excel 片段记录一下

  NPOI,顾名思义,就是POI的.NET版本。那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,支持的文件格式包括xls, doc, ppt等。在本文发布时,POI的最新版本是3.5 beta 6。NPOI 1.x是基于POI 3.x版本开发的,与poi 3.2对应的版本是NPOI 1.2,

  现在我们要做这样一个表格,设计到字体样式,合并单元格。

  创建表头样式,列样式还有正文样式

  1. public static ICellStyle CreateHeaderStyle(IWorkbook book)
  2. {
  3. ICellStyle style = book.CreateCellStyle();
  4. //设置单元格的样式:水平对齐居中
  5. style.Alignment = HorizontalAlignment.Center;
  6. style.VerticalAlignment = VerticalAlignment.Center;
  7. //新建一个字体样式对象
  8. IFont font = book.CreateFont();
  9. //设置字体加粗样式
  10. font.Boldweight = short.MaxValue;
  11. font.FontHeightInPoints = ;
  12. font.Boldweight = (short)FontBoldWeight.Bold;
  13. font.FontName = "微软雅黑";
  14. //使用SetFont方法将字体样式添加到单元格样式中
  15. style.SetFont(font);
  16. return style;
  17. }
  18. public static ICellStyle CreateTitleStyle(IWorkbook book)
  19. {
  20. ICellStyle cellStyle = book.CreateCellStyle();
  21. cellStyle.Alignment = HorizontalAlignment.Center;
  22. cellStyle.VerticalAlignment = VerticalAlignment.Center;
  23. IFont fontLeft = book.CreateFont();
  24. fontLeft.FontHeightInPoints = ;
  25. fontLeft.Boldweight = (short)FontBoldWeight.Bold;
  26. fontLeft.FontName = "宋体";
  27. cellStyle.ShrinkToFit = true;
  28. cellStyle.SetFont(fontLeft);
  29. return cellStyle;
  30. }
  31. public static ICellStyle CreateContentStyle(IWorkbook book)
  32. {
  33. ICellStyle cellStyle = book.CreateCellStyle();
  34. IFont fontLeft = book.CreateFont();
  35. fontLeft.FontHeightInPoints = ;
  36. fontLeft.FontName = "宋体";
  37. cellStyle.ShrinkToFit = true;
  38. cellStyle.SetFont(fontLeft);
  39. return cellStyle;
  40. }

  一个Excel文件就是IWorkbook一个页就是 一个Isheet,行是IRow,一个单元格是ICell,知道这些就好办了。上面的就是创建各种样式,

  创建表格,比较注意的一点就是xlsx 格式的文件需要new  XSSFWorkbook(),创建xls格式的文件需要new HSSFWorkbook();

  合并单元格   sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 10))

  创建行    IRow rowHeader = sheet.CreateRow(0);

  创建页      ISheet sheet = book.CreateSheet(dt.TableName);

  创建单元格   cell = rowTitle.CreateCell(i);

  1. #region 写Excel 文件
  2. //HSSFWorkbook book = new HSSFWorkbook();
  3. IWorkbook book = null;
  4. if (filepath.IndexOf(".xlsx") > ) // 2007版本
  5. book = new XSSFWorkbook();
  6. else if (filepath.IndexOf(".xls") > ) // 2003版本
  7. book = new HSSFWorkbook();
  8. ISheet sheet = book.CreateSheet(dt.TableName);
  9. //创建Excel 头,合并单元格10列
  10. sheet.AddMergedRegion(new CellRangeAddress(, , , ));
  11. IRow rowHeader = sheet.CreateRow();
  12. //在行中:建立单元格,参数为列号,从0计
  13. ICell cellHeader = rowHeader.CreateCell();
  14. //设置单元格内容
  15. cellHeader.SetCellValue("健康一体机检测报告");
  16. cellHeader.CellStyle = CreateHeaderStyle(book);
  17. rowHeader.Height = ;
  18. rowHeader.RowStyle = CreateHeaderStyle(book);
  19.  
  20. //创建Excel 列
  21. IRow rowTitle = sheet.CreateRow();
  22. rowTitle.Height = ;
  23. ICell cell = null;
  24. for (int i = ; i < ; i++)
  25. {
  26. cell = rowTitle.CreateCell(i);
  27. cell.SetCellValue(dt.Columns[i].ColumnName);
  28. cell.CellStyle = CreateTitleStyle(book);
  29. }
  30. cell = rowTitle.CreateCell();
  31. cell.SetCellValue("心电");
  32. sheet.AddMergedRegion(new CellRangeAddress(, , , ));
  33. cell.CellStyle = CreateTitleStyle(book);
  34. cell = rowTitle.CreateCell();
  35. cell.SetCellValue("血压");
  36. sheet.AddMergedRegion(new CellRangeAddress(, , , ));
  37. cell.CellStyle = CreateTitleStyle(book);
  38. cell = rowTitle.CreateCell();
  39. cell.SetCellValue("血氧");
  40. sheet.AddMergedRegion(new CellRangeAddress(, , , ));
  41. cell.CellStyle = CreateTitleStyle(book);
  42. cell = rowTitle.CreateCell();
  43. cell.SetCellValue("体温");
  44. sheet.AddMergedRegion(new CellRangeAddress(, , , ));
  45. cell.CellStyle = CreateTitleStyle(book);
  46. cell = rowTitle.CreateCell();
  47. cell.SetCellValue("血糖");
  48. sheet.AddMergedRegion(new CellRangeAddress(, , , ));
  49. cell.CellStyle = CreateTitleStyle(book);
  50. cell = rowTitle.CreateCell();
  51. cell.SetCellValue("尿液");
  52. sheet.AddMergedRegion(new CellRangeAddress(, , , ));
  53. cell.CellStyle = CreateTitleStyle(book);
  54. rowTitle = sheet.CreateRow();
  55. for (int i = ; i <= ; i++)
  56. {
  57. cell = rowTitle.CreateCell(i);
  58. cell.SetCellValue(dt.Columns[i].ColumnName);
  59. cell.CellStyle = CreateTitleStyle(book);
  60. }
  61.  
  62. for (int i = ; i < ; i++)
  63. {
  64. sheet.AddMergedRegion(new CellRangeAddress(, , i, i));
  65. }
  66. //开始写数据
  67. for (int i = ; i < dt.Rows.Count; i++)
  68. {
  69. IRow rowContent = sheet.CreateRow(i + );
  70. rowContent.Height = ;
  71. for (int j = ; j < dt.Columns.Count; j++)
  72. {
  73. cell = rowContent.CreateCell(j);
  74. if (cell != null)
  75. {
  76. cell.SetCellValue(Convert.ToString(dt.Rows[i][j]));
  77. cell.CellStyle = CreateContentStyle(book);
  78. }
  79. }
  80. }
  81. // 写入到客户端
  82. using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
  83. {
  84. book.Write(ms);
  85. using (FileStream fs = new FileStream(filepath, FileMode.Create, FileAccess.Write))
  86. {
  87. byte[] d = ms.ToArray();
  88. fs.Write(d, , d.Length);
  89. fs.Flush();
  90. }
  91. book = null;
  92. }
  93. #endregion

  知道这些基本上就可以创建一个稍微复杂的表格了,但是在这之前,必须要进行NOPI库的引入,

  官方网站:http://npoi.codeplex.com/,里面下载最新的版本库,目前应该是2.3版本的。下载好之后,进入到npoi-master\npoi-master\solution\visualstudio,打开OOXML.sln,进行重新生成DLL,在npoi-master\npoi-master\solution\Lib这个目录。 如下所示

  我们需要的是将NOPI.DLL  ,NOPI.OOXML.DLL ,NOPI.OPENXML4NET.DLL,ICSharpCode.SharpZipLib.DLL.NPOI.OpenXmlFormats.dll这五个库进入到工程即可。现在将编译好的库供大家下载   https://files.cnblogs.com/files/techdreaming/nopi.zip

c# 使用NOPI 操作Excel的更多相关文章

  1. 使用NPIO操作Excel

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using NPOI.SS. ...

  2. NOPI导出Excel 自定义列名

    NOPI 做Excel 导出确实很方便 ,但是一直在用没好好研究. 在网上没找到自定义Columns的方法 ,于是乎自己就在原来的方法上简单地改改. 想用的童鞋们可以直接拿去用! /// 数据大于65 ...

  3. 使用NPOI操作Excel文件及其日期处理

    工作中经常遇到需要读取或导出Excel文件的情况,而NPOI是目前最宜用.效率最高的操作的Office(不只是Excel哟)文件的组件,使用方便,不详细说明了. Excel工作表约定:整个Excel表 ...

  4. .Net Core NOPI操作word(二) 表格操作

    一.创建表格操作 private void btnExport_Click(object sender, EventArgs e) { var dbcontext = new BlogModel(); ...

  5. 免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)

    很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel ...

  6. C#通过NPOI操作Excel

    参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-post.html http://www.yuanjiaocheng.net/w ...

  7. POI操作Excel

    POI和Excel简介 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作 ...

  8. NPOI操作EXCEL(六)——矩阵类表头EXCEL模板的解析

    哈哈~~~很高兴还活着.总算加班加点的把最后一类EXCEL模板的解析做完了... 前面几篇文章介绍了博主最近项目中对于复杂excel表头的解析,写得不好,感谢园友们的支持~~~ 今天再简单讲诉一下另一 ...

  9. VB操作EXCEL文件

    用VB操作Excel(VB6.0)(整理) 首先创建Excel对象,使用ComObj:Dim ExcelID as Excel.ApplicationSet ExcelID as new Excel. ...

随机推荐

  1. Java并发编程教程

    Java是一种多线程编程语言,我们可以使用Java来开发多线程程序. 多线程程序包含两个或多个可同时运行的部分,每个部分可以同时处理不同的任务,从而能更好地利用可用资源,特别是当您的计算机有多个CPU ...

  2. 利用os和pandas来合并当前目录下所有excel文件

    #1.引入模块 import os import pandas as pd #2.取出指定目录下的全部excel文件路径 path="C:\\TEST" dirlist=[] fo ...

  3. 35-python基础-python3-字符串修改大小写的方法-title()方法-lower()方法-upper()方法

    1-title()-注:不是原地修改,有返回值 以首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写. 2-lower()和upper()-注:不是原地修改,有返回值 将字符串改为全部小写或 ...

  4. Neo4j基础入门

    图数据库基础知识 图数据库以图这种数据结构为基础,可以保存任意种类的数据,以下图为基础,简单介绍Neo4j中的几个简单概念: 1.节点(Nodes) 表示图数据库的实体(entities),代表图数据 ...

  5. SQL Server 2014 中新建登录及权限分配【界面版】

    本篇经验将和大家介绍分配SQL Server 2014 中,新建登录用户,分配权限,并指定该用户的数据库的方法,希望对大家的工作和学习有所帮助! 方法/步骤 1 打开 MS SQL Server Ma ...

  6. Javafx弹窗

    在javafx中可能用到一些弹窗,比如点击某个按钮后弹出弹窗提示信息等等 Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle( ...

  7. java爬取猫咪上的图片

    首先是对知识点归纳 1.用到获取网页源代码,分析图片地址,发现图片的地址都是按编号排列的,所以想到用循环获取 2.保存图片要用到流操作和文件操作,对两部分知识进行了复习巩固 3.保存后的图片有一部分是 ...

  8. c# DataTable join 两表连接

    转:https://www.cnblogs.com/xuxiaona/p/4000344.html JlrInfodt和dtsource是两个datatable,通过[姓名]和[lqry]进行关联 v ...

  9. 【记录】ajax跨域问题jsonp正确的使用方式

    最近遇到ajax请求跨域问题,解决方案用jsonp,现记录如下: //跨域请求jsonp封装 function doJsonPostCallBack(type, url, data,async, ca ...

  10. 同一子网建立ssh通道,映射到本地

    在办公室有一台机器连入同一子网络,开启jupyter-notebook但是只能在这台机器上访问到,怎样可以在家也可以访问呢? 此时最简单的方法是在本地建立一个ssh通道: 在本地终端中输入 ssh u ...