基于NPOI的扩展

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.HSSF.Util;
using System.Data;

namespace Tools
{
    public static class NPOIHelper
    {
        /// <summary>
        /// 设置表格样式,边框线为黑色实线
        /// </summary>
        /// <param name="hssfworkbook">Excel表格</param>
        /// <returns></returns>
        public static ICellStyle CreateCellStyle(IWorkbook workbook)
        {
            var style = workbook.CreateCellStyle();
            style.BorderBottom = BorderStyle.THIN;
            style.BorderLeft = BorderStyle.THIN;
            style.BorderRight = BorderStyle.THIN;
            style.BorderTop = BorderStyle.THIN;
            style.TopBorderColor = HSSFColor.BLACK.index;
            style.BottomBorderColor = HSSFColor.BLACK.index;
            style.LeftBorderColor = HSSFColor.BLACK.index;
            style.RightBorderColor = HSSFColor.BLACK.index;
            style.VerticalAlignment = VerticalAlignment.CENTER;
            return style;
        }

        /// <summary>
        /// 创建一个普通的Excel表格
        /// </summary>
        /// <param name="sheetName">Sheet名称</param>
        /// <param name="headers">表格头部,默认取DataTable的ColumnName</param>
        /// <param name="columnWidths">各列宽度(单位:字符宽度)</param>
        /// <param name="rowHight">各行高度(单位:磅)</param>
        /// <param name="rowCount">表格创建行数,默认取DataTable的Rows.Count</param>
        /// <param name="data">数据</param>
        /// <returns></returns>
        public static IWorkbook CreateWorkbook(string sheetName, string[] headers, int[] columnWidths, int rowHight, int rowCount, DataTable data)
        {
            var hssfworkbook = new HSSFWorkbook();
            CreateSheet(hssfworkbook, sheetName, headers, columnWidths, rowHight, rowCount, data);
            return hssfworkbook;
        }

        /// <summary>
        /// 创建一个普通的Excel表格
        /// </summary>
        /// <param name="sheetName">Sheet名称</param>
        /// <param name="headers">表格头部</param>
        /// <param name="columnWidths">各列宽度(单位:字符宽度)</param>
        /// <param name="rowHight">各行高度(单位:磅)</param>
        /// <param name="rowCount">表格创建行数</param>
        /// <param name="data">数据</param>
        /// <returns></returns>
        public static IWorkbook CreateWorkbook(string sheetName, string[] headers, int[] columnWidths, int rowHight, int rowCount, List<List<string>> data)
        {
            var hssfworkbook = new HSSFWorkbook();
            CreateSheet(hssfworkbook, sheetName, headers, columnWidths, rowHight, rowCount, data);
            return hssfworkbook;
        }

        /// <summary>
        /// 创建一个普通的sheet表格
        /// </summary>
        /// <param name="workbook">Excel表格</param>
        /// <param name="sheetName">Sheet名称</param>
        /// <param name="headers">表格头部,默认取DataTable的ColumnName</param>
        /// <param name="columnWidths">各列宽度(单位:字符宽度)</param>
        /// <param name="rowHight">各行高度(单位:磅)</param>
        /// <param name="rowCount">表格创建行数,默认取DataTable的Rows.Count</param>
        /// <param name="data">数据</param>
        /// <returns></returns>
        public static ISheet CreateSheet(IWorkbook workbook, string sheetName, string[] headers, int[] columnWidths, int rowHight, int rowCount, DataTable data)
        {
            List<string> l = null;
            List<List<string>> d = null;

            if (data != null && data.Rows.Count > 0)
            {
                d = new List<List<string>>();
                foreach (DataRow dr in data.Rows)
                {
                    l = new List<string>();
                    foreach (object obj in dr.ItemArray)
                    {
                        l.Add(obj.ToZMStringOrEmpty());
                    }
                    d.Add(l);
                }

                if (headers.IsNullOrEmpty())
                {
                    var h = new List<string>();
                    foreach (DataColumn dc in data.Columns)
                    {
                        h.Add(dc.ColumnName);
                    }

                    //for (var i = 0; i < data.Columns.Count; ++i )
                    //{
                    //    h.Add(data.Columns[i].ColumnName);
                    //}

                    headers = h.ToArray();
                }
            }

            return CreateSheet(workbook, sheetName, headers, columnWidths, rowHight, rowCount, d);
        }

        /// <summary>
        /// 创建一个普通的sheet表格
        /// </summary>
        /// <param name="workbook">Excel表格</param>
        /// <param name="sheetName">Sheet名称</param>
        /// <param name="headers">表格头部</param>
        /// <param name="columnWidths">各列宽度(单位:字符宽度)</param>
        /// <param name="rowHight">各行高度(单位:磅)</param>
        /// <param name="rowCount">表格创建行数</param>
        /// <param name="data">数据</param>
        /// <returns></returns>
        public static ISheet CreateSheet(IWorkbook workbook, string sheetName, string[] headers, int[] columnWidths, int rowHight, int rowCount, List<List<string>> data)
        {
            var sheet = workbook.CreateSheet(sheetName);
            ICellStyle cellStyle = null;
            ICell cell = null;
            IRow row = null;
            var columnCount = 0;

            // 设置头部
            if (headers.HasItem())
            {
                row = sheet.CreateRow(0);
                row.Height = 500;
                //新建一个字体样式对象
                IFont font = workbook.CreateFont();
                //设置字体加粗样式
                font.Boldweight = short.MaxValue;
                cellStyle = CreateCellStyle(workbook);
                for (var i = 0; i < headers.Length; ++i)
                {
                    cell = row.CreateCell(i, CellType.STRING);
                    cell.CellStyle = cellStyle;
                    cell.SetCellValue(headers[i]);
                    //使用SetFont方法将字体样式添加到单元格样式中
                    cell.CellStyle.SetFont(font);
                    cell.CellStyle.Alignment = HorizontalAlignment.CENTER;
                }
                columnCount = headers.Length;
            }

            // 设置列宽
            if (columnWidths.HasItem())
            {
                for (var i = 0; i < columnWidths.Length; ++i)
                {
                    // 设置表格宽度
                    sheet.SetColumnWidth(i, columnWidths[i] * 256);
                }
            }

            // 设置数据
            if (data.HasItem())
            {
                rowCount = data.Count;
                foreach (var array in data)
                {
                    if (array.Count > columnCount)
                    {
                        columnCount = array.Count;
                    }
                }
            }

            cellStyle = CreateCellStyle(workbook);
            for (var i = 0; i < rowCount; ++i)
            {
                row = sheet.CreateRow(sheet.LastRowNum + 1);
                row.Height = (short)(rowHight * 20);
                for (var j = 0; j < columnCount; ++j)
                {
                    cell = row.CreateCell(j, CellType.STRING);
                    cell.CellStyle = cellStyle;
                    try
                    {
                        cell.SetCellValue(data[i][j].ToZMStringOrEmpty());
                    }
                    catch
                    {
                        cell.SetCellValue(string.Empty);
                    }
                }
            }

            return sheet;
        }
    }
}
时间: 2024-08-04 05:36:52

基于NPOI的扩展的相关文章

【EXCEL终极总结分享】基于NPOI扩展封装的简易操作工具类库(简单灵活易用,支持导出、导入、上传等常见操作)

对于EXCEL的导入.导出,我之前已分享过多次,比如: 第一种方案:<我写的一个ExcelHelper通用类,可用于读取或生成数据>这个主要是利用把EXCEL当成一个DB来进行获取数据,导出则是采用拼接成HTML TABLE的方式,这种在ASP.NET,ASP.NET CORE 中也是可以的,简单方便,依赖Office Excel组件,仅适用于网站服务端. 推荐指数:♥♥♥ 第二种方案:<MVC导出数据到EXCEL新方法:将视图或分部视图转换为HTML后再直接返回FileResult&g

ExtJS4.2学习(13)基于表格的扩展插件---rowEditing

鸣谢:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-11-24/182.html -------------------------------------------------------------------------------------------- 前一章说了EditorGrid可编辑表格,但是有点不方便,如果数据多的话,一次性保存未免有点不太方便.下面我们来说一个扩展插件rowEditin

基于 HtmlHelper 自定义扩展Container

基于 HtmlHelper 自定义扩展Container Intro 基于 asp.net mvc 的权限控制系统的一部分,适用于对UI层数据呈现的控制,基于 HtmlHelper 的扩展组件 Code 基于 asp.net mvc 的权限控制系统示例代码:https://github.com/WeihanLi/AccessControlDemo 权限控制核心代码:https://github.com/WeihanLi/AccessControlDemo/tree/master/AccessCo

asp.net使用MVC4框架基于NPOI做导出数据到Excel表

NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本

【个人使用.Net类库】(3)Excel文件操作类(基于NPOI)

Web开发工作中经常要根据业务的需要生成对应的报表.经常采用的方法如下: 将DataTable导出至Excel文件; 读取模板Excel文件; 修改模板Excel文件对应的内容. 因此,便想到封装一个基于NPOI的Excel操作类(至于为什么不用Excel组件,那是因为Excel组件效率低且必须安装Office),所完成的功能大致如上所示,这样平时的报表开发效率就比原来高效很多. 首先是DataTable导出至Excel文件,代码关键部分有注释说明,具体代码如下所示: /// <summary>

C#基于NPOI生成具有精确列宽行高的Excel文件的方法

本文实例讲述了C#基于NPOI生成具有精确列宽行高的Excel文件的方法,是非常具有实用价值的技巧分享给大家供大家参考.具体方法如下:. 一.前言 NPOI是操作Excel的神器,导出导入快如闪电, 但是SetColumnWidth函数个人感觉不会用,怎么弄都无法控制好,因为他是以字符数量去设置宽度,实际上Excel列宽还有个像素的概念,更难搞懂了. //附带SetColumnWidth的用法和注释 IWorkbook hssfworkbook = new HSSFWorkbook(); ISh

基于NPOI导出Excel

在上一篇文章[关于大数据的查询与导出]中,提到了使用NPOI组件导出Excel,本想上次一起分享给大家,无奈最近比较忙,今天抽空整理了下,分享出来. 预置填充模板,并且需要支持公式计算; 可导入图片; 可以追加数据形式填充表格. 简单分一下这个功能. 需要处理模板的读取,并根据模板中指定特定适配符替换模板中的数据,需要处理三种类型的单元格的格式化:散列单元格,图片单元格,数据明细区单元格; 散列单元格: 需要定义具体的模板字符串,及期望格式化后的数据,姑且将这里处理散列单元格的对象 命名为 Di

基于 MBTiles 规范扩展的缓存文件格式说明

MBTiles 是由 MapBox 制定的一种将瓦片地图数据存储到SQLite数据库中并可快速使用,管理和分享的规范.该规范由MapBox制定,详见http://mapbox.com/mbtiles-spec/. SuperMap iServer为了满足自身应用的需求,不仅支持生成和使用满足MBTiles规范的瓦片地图数据,并且基于原规范对MBTiles中的内容进行了扩展.扩展后的.mbtiles文件支持任意坐标系,支持任意分辨率,支持JPG和PNG混合格式的地图瓦片数据. 扩展后的.mbtil

基于NPOI的Excel数据导入

从Excel导入数据最令人头疼的是数据格式的兼容性,特别是日期类型的兼容性.为了能够无脑导入日期,折腾了一天的NPOI.在经过测试确实可以导入任意格式的合法日期后,写下这篇小文,与大家共享.完整代码请移步:https://github.com/xuanbg/Utility 概述: 这个帮助类是一个泛型类,泛型参数对应的实体类还起到模板的作用.如果你的Excel文件使用与实体类不同的列标题的话,可以通过给属性加上Alias特性,将列标题和属性进行对应.例如: Excel格式如图: 实体类: 1 u