c# 使用NOPI 操作Excel

  最近项目需要导出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,

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

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

 public static ICellStyle CreateHeaderStyle(IWorkbook book)
        {
            ICellStyle style = book.CreateCellStyle();
            //设置单元格的样式:水平对齐居中
            style.Alignment = HorizontalAlignment.Center;
            style.VerticalAlignment = VerticalAlignment.Center;
            //新建一个字体样式对象
            IFont font = book.CreateFont();
            //设置字体加粗样式
            font.Boldweight = short.MaxValue;
            font.FontHeightInPoints = 20;
            font.Boldweight = (short)FontBoldWeight.Bold;
            font.FontName = "微软雅黑";
            //使用SetFont方法将字体样式添加到单元格样式中
            style.SetFont(font);
            return style;
        }
        public static ICellStyle CreateTitleStyle(IWorkbook book)
        {
            ICellStyle cellStyle = book.CreateCellStyle();
            cellStyle.Alignment = HorizontalAlignment.Center;
            cellStyle.VerticalAlignment = VerticalAlignment.Center;
            IFont fontLeft = book.CreateFont();
            fontLeft.FontHeightInPoints = 15;
            fontLeft.Boldweight = (short)FontBoldWeight.Bold;
            fontLeft.FontName = "宋体";
            cellStyle.ShrinkToFit = true;
            cellStyle.SetFont(fontLeft);
            return cellStyle;
        }
        public static ICellStyle CreateContentStyle(IWorkbook book)
        {
            ICellStyle cellStyle = book.CreateCellStyle();
            IFont fontLeft = book.CreateFont();
            fontLeft.FontHeightInPoints = 15;
            fontLeft.FontName = "宋体";
            cellStyle.ShrinkToFit = true;
            cellStyle.SetFont(fontLeft);
            return cellStyle;
        }

  一个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);

 #region 写Excel 文件
                //HSSFWorkbook book = new HSSFWorkbook();
                IWorkbook book = null;
                if (filepath.IndexOf(".xlsx") > 0) // 2007版本
                    book = new XSSFWorkbook();
                else if (filepath.IndexOf(".xls") > 0) // 2003版本
                    book = new HSSFWorkbook();
                ISheet sheet = book.CreateSheet(dt.TableName);
                //创建Excel 头,合并单元格10列
                sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 10));
                IRow rowHeader = sheet.CreateRow(0);
                //在行中:建立单元格,参数为列号,从0计
                ICell cellHeader = rowHeader.CreateCell(0);
                //设置单元格内容
                cellHeader.SetCellValue("健康一体机检测报告");
                cellHeader.CellStyle = CreateHeaderStyle(book);
                rowHeader.Height = 650;
                rowHeader.RowStyle = CreateHeaderStyle(book);

                //创建Excel 列
                IRow rowTitle = sheet.CreateRow(1);
                rowTitle.Height = 500;
                ICell cell = null;
                for (int i = 0; i < 9; i++)
                {
                    cell = rowTitle.CreateCell(i);
                    cell.SetCellValue(dt.Columns[i].ColumnName);
                    cell.CellStyle = CreateTitleStyle(book);
                }
                cell = rowTitle.CreateCell(9);
                cell.SetCellValue("心电");
                sheet.AddMergedRegion(new CellRangeAddress(1, 1, 9, 23));
                cell.CellStyle = CreateTitleStyle(book);
                cell = rowTitle.CreateCell(24);
                cell.SetCellValue("血压");
                sheet.AddMergedRegion(new CellRangeAddress(1, 1, 24, 31));
                cell.CellStyle = CreateTitleStyle(book);
                cell = rowTitle.CreateCell(43);
                cell.SetCellValue("血氧");
                sheet.AddMergedRegion(new CellRangeAddress(1, 1, 32, 33));
                cell.CellStyle = CreateTitleStyle(book);
                cell = rowTitle.CreateCell(34);
                cell.SetCellValue("体温");
                sheet.AddMergedRegion(new CellRangeAddress(1, 1, 34, 35));
                cell.CellStyle = CreateTitleStyle(book);
                cell = rowTitle.CreateCell(36);
                cell.SetCellValue("血糖");
                sheet.AddMergedRegion(new CellRangeAddress(1, 1, 36, 37));
                cell.CellStyle = CreateTitleStyle(book);
                cell = rowTitle.CreateCell(38);
                cell.SetCellValue("尿液");
                sheet.AddMergedRegion(new CellRangeAddress(1, 1, 38, 48));
                cell.CellStyle = CreateTitleStyle(book);
                rowTitle = sheet.CreateRow(2);
                for (int i = 9; i <= 48; i++)
                {
                    cell = rowTitle.CreateCell(i);
                    cell.SetCellValue(dt.Columns[i].ColumnName);
                    cell.CellStyle = CreateTitleStyle(book);
                }

                for (int i = 0; i < 9; i++)
                {
                    sheet.AddMergedRegion(new CellRangeAddress(1, 2, i, i));
                }
                //开始写数据
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    IRow rowContent = sheet.CreateRow(i + 3);
                    rowContent.Height = 500;
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        cell = rowContent.CreateCell(j);
                        if (cell != null)
                        {
                            cell.SetCellValue(Convert.ToString(dt.Rows[i][j]));
                            cell.CellStyle = CreateContentStyle(book);
                        }
                    }
                }
                // 写入到客户端
                using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
                {
                    book.Write(ms);
                    using (FileStream fs = new FileStream(filepath, FileMode.Create, FileAccess.Write))
                    {
                        byte[] d = ms.ToArray();
                        fs.Write(d, 0, d.Length);
                        fs.Flush();
                    }
                    book = null;
                }
                #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/lib.zip

原文地址:https://www.cnblogs.com/techdreaming/p/8485895.html

时间: 2024-11-05 17:30:49

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

NOPI操作Excel

using System.Collections.Generic; using System.Data; using System.Text; using System.Data.SqlClient; using Common; using BusinessLogic.Entity; using System.IO; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.SS.Util; using System.Web;

NOPI操作EXCEL导入导出

private void btnOutput_Click(object sender, EventArgs e) { List<MODEL.Classes> list = cm.GetClassInfo(false); //获取对象数据集合 HSSFWorkbook workbook=new HSSFWorkbook (); //新建Excel工作表 HSSFSheet sheet=workbook.CreateSheet("classes"); //在工作文档中新建页 f

NOPI导出Excel 自定义列名

NOPI 做Excel 导出确实很方便 ,但是一直在用没好好研究. 在网上没找到自定义Columns的方法 ,于是乎自己就在原来的方法上简单地改改. 想用的童鞋们可以直接拿去用! 1 /// 数据大于65536时使用 2 /// </summary> 3 /// <param name="dt">数据源</param> 4 /// <param name="Columns">列名</param> 5 ///

POI操作Excel

Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,从A开始到Z共26列,然后再从AA到AZ又26列,再从BA到BZ再26列以此类推.行则使用数字表示,例如:A3 表示第三行第一列,E5表示第五行第五列. POI工具包 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 9

java 操作 Excel,java导出excel

WritableWorkbook out = null; try { response.getServletResponse().reset(); ((HttpServletResponse) response.getServletResponse()).setHeader("Content-Disposition", "attachment;filename=export.xls"); response.getServletResponse().setConten

python操作excel

python操作exce的方式: 使用win32com 使用xlrd(读excel).xlwt(写excel) 1.使用win32com方式 代码: # coding=utf-8 from win32com.client import Dispatch import pywintypes ''' 查看excel最大行数和列数 打开一个空白新建EXCEL表格,按CTRL+下箭头,可以查看到最大行数:按CTRL+右箭头, 可以查看到最大列标(若想显示列数,可在最右一列的某单元格中输入=column(

java使用POI操作excel文件,实现批量导出,和导入

一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel. POI全称 Poor Obfuscation Implementation,直译为"可怜的模糊实现",利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能.官网:htt

POI组件:POI操作Excel

1.Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,从A开始到Z共26列,然后再从AA到AZ又26列,再从BA到BZ再26列以此类推.行则使用数字表示,例如:A3 表示第三行第一列,E5表示第五行第五列. 2.POI工具包 POI全称 Poor Obfuscation Implementation,直译为"可怜的模糊实现&qu

JAVA的POI操作Excel

1.1Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,从A开始到Z共26列,然后再从AA到AZ又26列,再从BA到BZ再26列以此类推.行则使用数字表示,例如:A3 表示第三行第一列,E5表示第五行第五列. 1.2 POI工具包 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Exce