NPOI 导出Excel

news2024/11/26 13:32:40

NPOI是一个用于处理Office文档的开源项目。它是用C#编写的,允许开发人员在.NET平台上读取、写入和操作Word、Excel和PowerPoint文件。NPOI提供了一组API,使开发人员能够以编程方式创建、修改和处理Office文档,这对于自动化生成报表、导出数据等任务非常有用。NPOI是一个非营利性的开源项目,旨在为开发人员提供处理Office文档的免费解决方案。

引用NPOI2.5.5

导出工具类库

using System;
using System.Data;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using Serenity.ComponentModel;
using System.Linq;
using System.Reflection;
using NPOI.XSSF.UserModel;//NPOI2.0
using NPOI.SS.UserModel;
using NPOI.HSSF.Util;

/// <summary>
/// NPOI导出Excel
/// </summary>
namespace NDPS.Code
{
    public class ExcelExportHelp
    {

        XSSFWorkbook hssfworkbook;//2.0
        public ExcelExportHelp()
        {
            hssfworkbook = new XSSFWorkbook();
        }

        #region HSSFWorkbook

        /// <summary>
        /// List 数据写入Excel Sheet
        /// </summary>
        /// <typeparam name="T">数据模型实体</typeparam>
        /// <param name="list">数据列表</param>
        /// <param name="sheetName">Excel表格名称</param>
        public void GenerateData<T>(IEnumerable<T> list, string sheetName)
        {
            DataTable dt = ListToDataTable<T>(list);

            List<int> columnWiths = new List<int>();//列宽
            List<string> headColumnName = new List<string>();//Excel列名
            List<string> dataColumnFieldName = new List<string>();//数据字段名
            var props = typeof(T).GetProperties();
            foreach (var item in props)
            {
                string fieldENName = item.Name;//列英文字段名称
                string fieldCNName = item.Name;//列中文字段名称
                int colWidth = 15;//列宽 默认15
                DescriptionAttribute customAttribute = (DescriptionAttribute)Attribute.GetCustomAttribute(item, typeof(DescriptionAttribute));
                if (customAttribute != null)
                {
                    fieldCNName = customAttribute.Description;
                }
                WidthAttribute widthAttribute = (WidthAttribute)Attribute.GetCustomAttribute(item, typeof(WidthAttribute));
                if (widthAttribute != null)
                {
                    colWidth = widthAttribute.Value;
                }
                headColumnName.Add(fieldCNName);
                dataColumnFieldName.Add(fieldENName);
                columnWiths.Add(colWidth);
            }

            ISheet sheet1 = hssfworkbook.CreateSheet(sheetName);
            AddMergedRegion(sheet1);
            SetHead(sheet1);
            SetColumnWidth(sheet1, columnWiths);
            LoadData(dt, headColumnName, dataColumnFieldName, sheet1, StyleBorderBg(), StyleBorder());
        }

        public MemoryStream WriteToStream()
        {
            //Write the stream data of workbook to the root directory
            MemoryStream msData = new MemoryStream();
            hssfworkbook.Write(msData);
            return msData;
        }

        /// <summary>
        /// 将数据写入Excel文件
        /// </summary>
        /// <param name="hssfworkbook">工作簿</param>
        /// <param name="exportPath">文件导出路径</param>
        public void WirteToFile(string exportPath)
        {
            FileStream file = null;
            try
            {
                file = new FileStream(exportPath, FileMode.Create);
                hssfworkbook.Write(file);
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                file.Dispose();
                hssfworkbook.Close();
            }

        }

        private void AddMergedRegion(ISheet sheet1)
        {
            //sheet1.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, 7));
        }

        private void SetHead(ISheet sheet1)
        {
            //IFont font1 = hssfworkbook.CreateFont();
            //font1.Color = HSSFColor.DarkBlue.Index;
            //font1.FontHeightInPoints = 16;
            //ICellStyle style1 = hssfworkbook.CreateCellStyle();
            //style1.SetFont(font1);
            //style1.Alignment = HorizontalAlignment.Center;
            //IRow row0 = sheet1.CreateRow(0);
            //row0.CreateCell(0).SetCellValue("");
            //row0.Cells[0].CellStyle = style1;
            //InsertPic(sheet1, "listLogo.jpg", 0, 0, 0, 0);
            //row0.Height = 20 * 20;
        }

        private void SetColumnWidth(ISheet sheet1, List<int> columnWiths)
        {
            for (int i = 0; i < columnWiths.Count; i++)
            {
                sheet1.SetColumnWidth(i, columnWiths[i] * 256);
            }
        }

        private void LoadData(DataTable dt, List<string> headColumnName, List<string> dataColumnFieldName, ISheet sheet1, ICellStyle styleBorderBg, ICellStyle styleBorder)
        {
            IRow row1 = sheet1.CreateRow(0);
            for (int i = 0; i < headColumnName.Count; i++)
            {
                row1.CreateCell(i).SetCellValue(headColumnName[i]);
                row1.Cells[i].CellStyle = styleBorderBg;
            }

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                IRow arow = sheet1.CreateRow(i + 1);
                DataRow dataRow = dt.Rows[i];
                for (int j = 0; j < dataColumnFieldName.Count; j++)
                {
                    if (String.IsNullOrEmpty(dataColumnFieldName[j]))
                    {
                        arow.CreateCell(j).SetCellValue("");
                    }
                    else
                    {
                        arow.CreateCell(j).SetCellValue(dataRow[dataColumnFieldName[j]].ToString());
                        //Attments
                       /* if (dataColumnFieldName[j] == "Attments"){
                            XSSFHyperlink link = new XSSFHyperlink(HyperlinkType.Url);//建一个HSSFHyperlink实体,指明链接类型为URL(这里是枚举,可以根据需求自行更改)
                                                                                      //link.Address = "http://blog.csdn.net/shiershilian";//给HSSFHyperlink的地址赋值
                            link.Address = dataRow[dataColumnFieldName[j]].ToString();
                            arow.CreateCell(j).Hyperlink = link;//将链接方式赋值给单元格的Hyperlink即可将链接附加到单元格上
                        }*/
                    }
                    arow.Cells[j].CellStyle = styleBorderBg;
                }
            }
        }

        private ICellStyle StyleBorderBg()
        {
            ICellStyle styleBorderBg = hssfworkbook.CreateCellStyle();
            //styleBorderBg.BorderBottom = NPOI.SS.UserModel.BorderStyle.THIN;
            //styleBorderBg.BottomBorderColor = HSSFColor.BLACK.index;
            //styleBorderBg.BorderLeft = NPOI.SS.UserModel.BorderStyle.THIN;
            //styleBorderBg.LeftBorderColor = HSSFColor.BLACK.index;
            //styleBorderBg.BorderRight = NPOI.SS.UserModel.BorderStyle.THIN;
            //styleBorderBg.RightBorderColor = HSSFColor.BLACK.index;
            //styleBorderBg.BorderTop = NPOI.SS.UserModel.BorderStyle.THIN;
            //styleBorderBg.TopBorderColor = HSSFColor.BLACK.index;
            //styleBorderBg.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.LIME.index;
            //styleBorderBg.FillPattern = FillPatternType.LESS_DOTS;
            //styleBorderBg.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.BLACK.index;
            return styleBorderBg;
        }

        private ICellStyle StyleBorder()
        {
            ICellStyle styleBorder = hssfworkbook.CreateCellStyle();
            styleBorder.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
            styleBorder.BottomBorderColor = HSSFColor.Black.Index;
            styleBorder.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
            styleBorder.LeftBorderColor = HSSFColor.Black.Index;
            styleBorder.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
            styleBorder.RightBorderColor = HSSFColor.Black.Index;
            styleBorder.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
            styleBorder.TopBorderColor = HSSFColor.Black.Index;
            return styleBorder;
        }

        public void InitializeWorkbook()
        {
            hssfworkbook = new XSSFWorkbook();//2.0
            //create a entry of DocumentSummaryInformation
            //DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
            //dsi.Company = "";
            //hssfworkbook.DocumentSummaryInformation = dsi;

            //create a entry of SummaryInformation
            //SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
            //si.Subject = "";
            //hssfworkbook.SummaryInformation = si;
        }

        #endregion

        #region Other Method
        public DataTable ListToDataTable<T>(IEnumerable<T> collection)
        {
            var props = typeof(T).GetProperties();
            var dt = new DataTable();
            foreach (var item in props)
            {
                //解决DataSet不支持System.Nullable<>问题
                Type colType = item.PropertyType;
                if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
                {
                    colType = colType.GetGenericArguments()[0];
                }
                //添加列明及对应类型 
                dt.Columns.Add(item.Name, colType);
            }
            if (collection.Count() > 0)
            {
                for (int i = 0; i < collection.Count(); i++)
                {
                    ArrayList tempList = new ArrayList();
                    foreach (PropertyInfo pi in props)
                    {
                        object obj = pi.GetValue(collection.ElementAt(i), null);
                        tempList.Add(obj);
                    }
                    object[] array = tempList.ToArray();
                    dt.LoadDataRow(array, true);
                }
            }
            return dt;
        }

        #endregion
    }
}

实体类ExportEntity

using System.ComponentModel;
using Serenity.ComponentModel;

namespace NDPS.Domain
{
    public class ExportEntity
    {
        [DescriptionAttribute("订单编号"),Width(15)]//列名称和列宽
        public string ordernum { get; set; }       


        [DescriptionAttribute("创建时间")]
        public string addtime { get; set; }

    }
}

调用代码

注意导出Excel的列名是根据实体类的字段来的。

var list = await _service.GetList();//获取业务数据 该行代码需要自行修改

string fileName = "信息列表.xlsx";
string sheetName = "信息表";

ExcelExportHelp exportHP = new ExcelExportHelp();
exportHP.GenerateData<ExportEntity>(list, sheetName);

return File(exportHP.WriteToStream().ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName);

总结

以上代码已经在多个生产项目中成功使用,导出稳定,Window和Linux操作系统均可稳定运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1332410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

go写的海盗王数据库重置工具

很久没有用go去写代码了&#xff0c;很多语法都快忘记了。 为了测试一下界面库govcl的用法&#xff0c;拉了一个界面窗口之后&#xff0c;想想还是把代码也补上去吧。 于是&#xff0c;就写了这个海盗王数据库重置工具。 这个工具适合开服的人使用&#xff0c;可以将海盗王的账…

1.关于浏览器

一、认识主流浏览器 Chrome谷歌浏览器Safari苹果浏览器Firefox火狐浏览器Opera欧朋浏览器 二、浏览器内核是什么&#xff1f; 三、五大浏览器&#xff0c;四大内核 四、前端做网页开发用什么浏览器&#xff1f; Chrome谷歌浏览器。

VM固定虚拟机IP

命令 vim /etc/sysconfig/network-scripts/ifcfg-enosystemctl restart network子网掩码、网关、DNS获取如下&#xff1a;

什么是MVC?MVC框架的优势和特点

目录 一、什么是MVC 二、MVC模式的组成部分和工作原理 1、模型&#xff08;Model&#xff09; 2、视图&#xff08;View&#xff09; 3、控制器&#xff08;Controller&#xff09; 三、MVC模式的工作过程如下&#xff1a; 用户发送请求&#xff0c;请求由控制器处理。 …

windows下切换JDK8、JDK11、JDK17

问题背景&#xff1a; 需要同时使用不同版本的JDK进行开发和运行&#xff0c;可通过下述操作改变JDK版本。 一、java分类以及JDK、JRE、JVM的联系 1、JAVA分类 JAVA EE——Java Enterprise Edition&#xff0c; JAVA企业版&#xff0c;主要用于WEB开发。 JAVA SE——Java Stand…

LeetCode刷题--- 组合总和

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述递归递归、搜…

计算机是如何工作的(下)

4. 编程语言&#xff08;Program Language&#xff09; 本块内容主要是还原下我们已经熟悉的编程语言&#xff0c;即编程语言是如何和 CPU 指令对应起来的。 4.1 程序&#xff08;Program&#xff09; 所谓程序&#xff0c;就是一组指令以及这组指令要处理的数据。狭义上来说&…

python dash学习2

代码 内有说明&#xff1a; from dash import Dash, html, dcc, callback, Output, Input import plotly.express as px import pandas as pd# 从 Plotly 数据集中读取数据 df pd.read_csv(https://raw.githubusercontent.com/plotly/datasets/master/gapminder_unfiltered.c…

Html / CSS刷题笔记

WebKit是一个开源的浏览器引擎&#xff0c;它最初是由苹果公司开发的&#xff0c;并且被广泛用于Safari浏览器和其他基于WebKit的浏览器&#xff0c;比如Google Chrome的早期版本。它也是构建许多移动设备浏览器的基础。WebKit的主要功能是解析HTML和CSS&#xff0c;并将其渲染…

vue3(五)-基础入门之计算属性

一、计算属性 1.计算属性与普通方法的的区别&#xff1a; 计算属性在需要渲染数据时调用一次&#xff0c;而后将结果缓存起来。只有计算属性所依赖的数据发生改变时才会重新调用函数&#xff0c;否则每次渲染相同的数据都只会从缓存中读取。 普通方法在每次数据需要渲染时都会…

prometheus二进制安装

1、在需要安装prometheus的目录下执行wget命令下载软件到本地&#xff0c;如我的路径是/opt/module/prometheus wget https://github.com/prometheus/prometheus/releases/download/v2.34.0/prometheus-2.34.0.linux-amd64.tar.gz正在解析主机 objects.githubusercontent.com …

Head First Design Patterns - 策略模式

策略模式 策略模式&#xff1a;策略模式是一种行为型模式&#xff0c;它将对象和行为分开&#xff0c;将行为定义为 一个行为接口 和 具体行为的实现。策略模式最大的特点是行为的变化&#xff0c;行为之间可以相互替换。每个if判断都可以理解为就是一个策略。本模式使得算法可…

05_符号表

05_符号表 一、符号表符号表API设计符号表实现有序符号表 一、符号表 符号表最主要的目的就是将一个键和一个值联系起来&#xff0c;符号表能够将存储的数据元素是一个键和一个值共同组成的键值对数据&#xff0c;我们可以根据键来查找对应的值。符号表中&#xff0c;键具有唯…

2024华为OD机试真题指南宝典—持续更新(JAVAPythonC++JS)【彻底搞懂算法和数据结构—算法之翼】

PC端可直接搜索关键词 快捷键&#xff1a;CtrlF 年份关键字、题目关键字等等 注意看本文目录-快速了解本专栏 文章目录 &#x1f431;2024年华为OD机试真题&#xff08;马上更新&#xff09;&#x1f439;2023年华为OD机试真题&#xff08;更新中&#xff09;&#x1f436;新…

1.倒排索引 2.逻辑斯提回归算法

1.倒排索引 https://help.aliyun.com/zh/open-search/retrieval-engine-edition/introduction-to-inverted-indexes 倒排索引&#xff08;Inverted Index&#xff09;是一种数据结构&#xff0c;用于快速查找包含某个特定词或词语的文档。它主要用于全文搜索引擎等应用&#…

解锁JDK 12的奇妙之旅:新特性详解

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 解锁JDK 12的奇妙之旅&#xff1a;新特性详解 前言switch表达式拓展NumberFormat对复杂数字的格式化字符串支持transform、indent操作新增方法Files.mismatch(Path, Path)Teeing Collector支持unicode…

AG16KDDF256 User Manual

AGM AG16KDDF256 是由 AGM FPGA AG16K 与 DDR-SDRAM 叠封集成的芯片&#xff0c;具有 AG16K FPGA的可编程功能&#xff0c;提供更多可编程 IO&#xff0c;同时内部连接大容量 DDR-SDRAM。  FPGA 外部管脚 FBGA256 封装&#xff0c;管脚说明请见下表 Table-1&#xff1a; Tab…

微服务实战系列之Dubbo(上)

前言 随着一年一度冬至的到来&#xff0c;2023的步伐也将远去。而博主的系列文章&#xff0c;也将从今天起&#xff0c;越来越聚焦如何构建微服务“内核”上。前序系列文章几乎囊括了微服务的方方面面&#xff0c;无论使用什么框架、组件或工具&#xff0c;皆可拿来用之。 那么…

探秘JDK 13的黑科技:新特性一览

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探秘JDK 13的黑科技&#xff1a;新特性一览 前言switch表达式扩展Switch表达式的基本概念&#xff1a;使用Switch表达式的优势&#xff1a;示例代码&#xff1a;注意事项和最佳实践&#xff1a; Text …

【面向对象】对比JavaScript、Go、Ada、Python、C++、Java、PHP的访问限制。

在不同编程语言中&#xff0c;控制成员&#xff08;变量、方法、类等&#xff09;可见性的机制不尽相同。以下是对比JavaScript、Go、Ada、Python、C、Java、PHP所使用的访问限制关键字和约定&#xff1a; 一、JavaScript ### JavaScript访问限制 早期的JavaScript并没有类似…