NPOI从数据库中调取数据直接导出到EXCEL中

2023-11-16

https://blog.csdn.net/weixin_30725315/article/details/98769248

 

一、关于NPOI

  NPOI是POI项目的.NET版本,是由@Tony Qu(http://tonyqus.cnblogs.com/)等大侠基于POI开发的,可以从http://npoi.codeplex.com/下 载到它的最新版本。它不使用Office COM组件(Microsoft.Office.Interop.XXX.dll),不需要安装Microsoft Office,支持对Office 97-2003的文件格式,功能比较强大。更详细的说明请看作者的博客或官方网站。

  它的以下一些特性让我相当喜欢:

 支持对标准的Excel读写

 支持对流(Stream)的读写 (而Jet OLEDB和Office COM都只能针对文件)

 支持大部分Office COM组件的常用功能

 性能优异 (相对于前面的方法)

 使用简单,易上手

二、使用NPOI

  本文使用的是它当前的最新版本1.2.4,此版本的程序集缩减至2个:NPOI.dll、Ionic.Zip.dll,直接引用到项目中即可。

  对于我们开发者使用的对象主要位于NPOI.HSSF.UserModel空间下,主要有HSSFWorkbook、HSSFSheet、 HSSFRow、HSSFCell,对应的接口为位于NPOI.SS.UserModel空间下的IWorkbook、ISheet、IRow、 ICell,分别对应Excel文件、工作表、行、列。

  简单演示一下创建一个Workbook对象,添加一个工作表,在工作表中添加一行一列:

       操作示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.Data;
using System.Data.SqlClient;


public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        MemoryStream ms =  RenderToExcel(GetTable());
        string fileName = @"c:\2.xls";
        SaveToFile(ms,  fileName);
        Response.Write("成功");
    }

    public MemoryStream RenderToExcel(DataTable table)
    {
        MemoryStream ms = new MemoryStream();

        using (table)
        {
            IWorkbook workbook = new HSSFWorkbook();
            ISheet sheet = workbook.CreateSheet();
            IRow headerRow = sheet.CreateRow(0);
            // handling header.
            foreach (DataColumn column in table.Columns)
                headerRow.CreateCell(column.Ordinal).SetCellValue(column.Caption);//If Caption not set, returns the ColumnName value
            // handling value.
            int rowIndex = 1;

            foreach (DataRow row in table.Rows)
            {
                IRow dataRow = sheet.CreateRow(rowIndex);
                foreach (DataColumn column in table.Columns)
                {
                 dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
                }
                rowIndex++;
            }
            workbook.Write(ms);
            ms.Flush();
            ms.Position = 0;
        }                
        return ms;
    }


    private void SaveToFile(MemoryStream ms, string fileName)
    {
        using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
        {
            byte[] data = ms.ToArray();
            fs.Write(data, 0, data.Length);
            fs.Flush();
            data = null;
        }
    }


    private DataTable GetTable()
    {
        SqlHelperXhf xhf = new SqlHelperXhf();
        string sql = "select calling_no '电话号码',starttime '时间' ,hname '楼盘名称' from [fc_freetel] a where hname<>'无'and a.id = (select min(id) from fc_freetel where calling_no=a.calling_no) order by hname,starttime desc";
       
        return xhf.ExecuteDataTable(sql);

    }


    private  DataTable GetTable(int hid)
    {
        SqlHelperXhf xhf = new SqlHelperXhf();
        string sql = "select calling_no '电话号码',starttime '时间' ,hname '楼盘名称' from [fc_freetel] a where hid=@hid and a.id = (select min(id) from fc_freetel where calling_no=a.calling_no) order by hname,starttime desc";
        SqlParameter paramer = new SqlParameter("@hid", hid);
        return xhf.ExecuteDataTable(sql,paramer);
        
    }


    private DataTable GetTable(int hid1,int hid2,int hid3)
    {
        SqlHelperXhf xhf = new SqlHelperXhf();
        string sql = "select calling_no '电话号码',starttime '时间' ,hname '楼盘名称' from [fc_freetel] a where hid=@hid1 or hid=@hid2 or hid=@hid3 and a.id = (select min(id) from fc_freetel where calling_no=a.calling_no) order by hname,starttime desc";
        SqlParameter [] paramers = 
        {
            new SqlParameter("@hid1", hid1),
            new SqlParameter("@hid2", hid2),
            new SqlParameter("@hid3", hid3)
        };
        return xhf.ExecuteDataTable(sql, paramers);

    }
}

参考资料:

简单演示一下创建一个Workbook对象,添加一个工作表,在工作表中添加一行一列:

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
 
public class NPOIWrite
{
    void CreateSheet()
    {
        IWorkbook workbook = new HSSFWorkbook();//创建Workbook对象
        ISheet sheet = workbook.CreateSheet("Sheet1");//创建工作表
        IRow row = sheet.CreateRow(0);//在工作表中添加一行
        ICell cell = row.CreateCell(0);//在行中添加一列
        cell.SetCellValue("test");//设置列的内容
    }
}

相应的读取代码:

using System.IO;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
 
public class NPOIRead
{
    void GetSheet(Stream stream)
    {
        IWorkbook workbook = new HSSFWorkbook(stream);//从流内容创建Workbook对象
        ISheet sheet = workbook.GetSheetAt(0);//获取第一个工作表
        IRow row = sheet.GetRow(0);//获取工作表第一行
        ICell cell = row.GetCell(0);//获取行的第一列
        string value = cell.ToString();//获取列的值
    }
}

 

三、使用NPOI导出

从DataTable读取内容来创建Workbook对象:

public static MemoryStream RenderToExcel(DataTable table)
{
    MemoryStream ms = new MemoryStream();
 
    using (table)
    {
        using (IWorkbook workbook = new HSSFWorkbook())
        {
            using (ISheet sheet = workbook.CreateSheet())
            {
                IRow headerRow = sheet.CreateRow(0);
                // handling header.
                foreach (DataColumn column in table.Columns)
                   headerRow.CreateCell(column.Ordinal).SetCellValue(column.Caption);//If Caption not set, returns the ColumnName value
                 // handling value.
                int rowIndex = 1;
                 foreach (DataRow row in table.Rows)
                {
                    IRow dataRow = sheet.CreateRow(rowIndex);
                     foreach (DataColumn column in table.Columns)
                    {                     
                 dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
                    } 
                    rowIndex++;
                }
                workbook.Write(ms);
                ms.Flush();
                ms.Position = 0;
            }
        }
    }
    return ms;
}

如果看不惯DataTable,那么DataReader也行:

public static MemoryStream RenderToExcel(IDataReader reader)
{
    MemoryStream ms = new MemoryStream();
 
    using (reader)
    {
        using (IWorkbook workbook = new HSSFWorkbook())
        {
            using (ISheet sheet = workbook.CreateSheet())
            {
                IRow headerRow = sheet.CreateRow(0);
                int cellCount = reader.FieldCount;
 
                // handling header.
                for (int i = 0; i < cellCount; i++)
                {
                    headerRow.CreateCell(i).SetCellValue(reader.GetName(i));
                }
                // handling value.
                int rowIndex = 1;
                while (reader.Read())
                {
                    IRow dataRow = sheet.CreateRow(rowIndex);
                    for (int i = 0; i < cellCount; i++)
                    {
                        dataRow.CreateCell(i).SetCellValue(reader[i].ToString());
                    }
                    rowIndex++;
                }
                workbook.Write(ms);
                ms.Flush();
                ms.Position = 0;
            }
        }
    }
    return ms;
}

以上代码把创建的Workbook对象保存到流中,可以通过以下方法输出到浏览器,或是保存到硬盘中:

static void SaveToFile(MemoryStream ms, string fileName)
{
    using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
    {
        byte[] data = ms.ToArray();
 
        fs.Write(data, 0, data.Length);
        fs.Flush();
 
        data = null;
    }
}
 
static void RenderToBrowser(MemoryStream ms, HttpContext context, string fileName)
{
    if (context.Request.Browser.Browser == "IE")
        fileName = HttpUtility.UrlEncode(fileName);
    context.Response.AddHeader("Content-Disposition", "attachment;fileName=" + fileName);
    context.Response.BinaryWrite(ms.ToArray());
}

四、使用NPOI导入

        需要注意的是,sheet.LastRowNum = sheet.PhysicalNumberOfRows - 1,这里可能存在BUG:当没有数据或只有一行数据时sheet.LastRowNum为0,PhysicalNumberOfRows 表现正常

        这里读取流中的Excel来创建Workbook对象,并转换成DataTable:

static DataTable RenderFromExcel(Stream excelFileStream)
{
    using (excelFileStream)
    {
        using (IWorkbook workbook = new HSSFWorkbook(excelFileStream))
        {
            using (ISheet sheet = workbook.GetSheetAt(0))//取第一个表
            {
                DataTable table = new DataTable();
 
                IRow headerRow = sheet.GetRow(0);//第一行为标题行
                int cellCount = headerRow.LastCellNum;//LastCellNum = PhysicalNumberOfCells
                int rowCount = sheet.LastRowNum;//LastRowNum = PhysicalNumberOfRows - 1
 
                //handling header.
                for (int i = headerRow.FirstCellNum; i < cellCount; i++)
                {
                    DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
                    table.Columns.Add(column);
                }
 
                for (int i = (sheet.FirstRowNum + 1); i <= rowCount; i++)
                {
                    IRow row = sheet.GetRow(i);
                    DataRow dataRow = table.NewRow();
 
                    if (row != null)
                    {
                        for (int j = row.FirstCellNum; j < cellCount; j++)
                        {
                            if (row.GetCell(j) != null)
                                dataRow[j] = GetCellValue(row.GetCell(j));
                        }
                    }
 
                    table.Rows.Add(dataRow);
                }
                return table;
 
            }
        }
    }
}

或者是直接生成SQL语句来插入到数据库:

public static int RenderToDb(Stream excelFileStream, string insertSql, DBAction dbAction)
{
    int rowAffected = 0;
    using (excelFileStream)
    {
        using (IWorkbook workbook = new HSSFWorkbook(excelFileStream))
        {
            using (ISheet sheet = workbook.GetSheetAt(0))//取第一个工作表
            {
                StringBuilder builder = new StringBuilder();
 
                IRow headerRow = sheet.GetRow(0);//第一行为标题行
                int cellCount = headerRow.LastCellNum;//LastCellNum = PhysicalNumberOfCells
                int rowCount = sheet.LastRowNum;//LastRowNum = PhysicalNumberOfRows - 1
 
                for (int i = (sheet.FirstRowNum + 1); i <= rowCount; i++)
                {
                    IRow row = sheet.GetRow(i);
                    if (row != null)
                    {
                        builder.Append(insertSql);
                        builder.Append(" values (");
                        for (int j = row.FirstCellNum; j < cellCount; j++)
                        {
                            builder.AppendFormat("'{0}',", GetCellValue(row.GetCell(j)).Replace("'", "''"));
                        }
                        builder.Length = builder.Length - 1;
                        builder.Append(");");
                    }
 
                    if ((i % 50 == 0 || i == rowCount) && builder.Length > 0)
                    {
                        //每50条记录一次批量插入到数据库
                        rowAffected += dbAction(builder.ToString());
                        builder.Length = 0;
                    }
                }
            }
        }
    }
    return rowAffected;
}

这里的Excel可能没有数据,所以可以加一个方法来检测:

public static bool HasData(Stream excelFileStream)
{
    using (excelFileStream)
    {
        using (IWorkbook workbook = new HSSFWorkbook(excelFileStream))
        {
            if (workbook.NumberOfSheets > 0)
            {
                using (ISheet sheet = workbook.GetSheetAt(0))
                {
                    return sheet.PhysicalNumberOfRows > 0;
                }
            }
        }
    }
    return false;
}

转载于:https://www.cnblogs.com/xuhongfei/p/3159018.html

 

 

 

https://blog.csdn.net/weixin_30725315/article/details/98769248

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NPOI从数据库中调取数据直接导出到EXCEL中 的相关文章

  • C# web端 NPOI导出Excel详解

    最近的项目需求 xff0c 需要将SqlServer数据库中的数据导出到Excel中 xff0c 导出excel方式有很多 xff0c 其中一种方式是使用NPOI xff0c NPOI具体是什么 xff0c 可以参考博客NPOI使用手册 接
  • C# web端 NPOI导出Excel详解

    最近的项目需求 xff0c 需要将SqlServer数据库中的数据导出到Excel中 xff0c 导出excel方式有很多 xff0c 其中一种方式是使用NPOI xff0c NPOI具体是什么 xff0c 可以参考博客NPOI使用手册 接
  • C# NPOI写excel文件,设置某个单元格为自动筛选

    https blog csdn net qq 40467670 article details 118102078 如标题所示 附上几行代码 HSSFWorkbook workbook new HSSFWorkbook 创建工作表 var
  • WIN10操作系统 Visual Studio 2017 C# ASP.net Web 简单接口+MySQL数据库+NPOI导出到EXCEL开发、发布及部署到局域网详细教程(一)

    本文利用Visual Studio 2017 C 编写一个简单的WEB程序发布和部署到局域网内 目的是实现 在局域网内任意一台未安装OFFICE办公软件的电脑上打开浏览器后在地址栏输入IP地址和端口号 即可链接到WEB网页 点击 导出到EX
  • NPOI 单元格设置边框

    很多表格中都要使用边框 本节将为你重点讲解NPOI中边框的设置和使用 边框和其他单元格设置一样也是调用ICellStyle接口 ICellStyle有2种和边框相关的属性 分别是 边框相关属性 说明 范例 Border 方向 边框类型 Bo
  • C# NPOI 将单元格样式设置为文本/字符串 1-19 格式化为日期/禁用任何格式

    我正在创建一个Excel 当我编写一些值示例1 19时 当我打开Excel文档时 我看到1 19 但是如果我单击它 那么Excel会尝试将其格式化为日期 有没有办法强制工作表不使用任何公式或格式 我查了一下 数据格式是字符串 private
  • 如何通过 angularJS 和 webaAPI2 下载内存流对象

    我有一个正在使用的项目NPOI从我的 Angular 应用程序生成 Excel 文档 我从我的 Angular 服务向我的 webapi 控制器发出调用 如下所示 function exportReportToExcel report re
  • WCF MemoryStream 返回类型是否可以写入 Http Response 对象以作为 Excel 文件下载?

    我构建了一个解析应用程序 它读取 xml 文件并使用以下命令填充 Excel 工作簿NPOI http npoi codeplex com 图书馆 最初 我将其作为 net Web 应用程序的一部分 从 NPOI 获取 MemoryStre
  • NPOI 日期格式单元格

    我正在使用 NPOI 在 Sheet1 中创建固定工作表模板 并需要 Sheet2 中日期格式的数据 我从数据库生成 DataTable 以在 Sheet2 中设置数据 这是我的代码 private DataTable getWeek st
  • NPOI 格式错误

    我正在开发一个会计软件 它还将创建 Excel 格式的报告 xls 我几乎在每个需要 Excel 报告的项目中都使用过 NPOI 没有出现任何重大问题 但我现在面临一个问题 似乎无法通过浏览互联网找到任何解决方案 正如您所看到的 在报表中途
  • C#。 NPOI 2.0 将 xlsx 日期单元格导入到 DataTable

    我尝试使用 NPOI 2 0 库将 xlsx 文件转换为 DataTable 格式 没关系 但我在转换为字符串日期单元格时遇到问题 当我尝试使用像 row GetCell j ToString 这样的构造时 它抛出异常 无法从文本单元格获取
  • 使用 NPOI 将图像添加到 Word docx 文件

    我开始使用 NPOI 创建 Word 文档 并且尝试将简单的图像添加到文档中 但它没有显示 不过我可以让文字显示得很好 这是我的代码 var wDoc new XWPFDocument var bytes File ReadAllBytes
  • 使用 NPOI 将 Excel 单元格区域格式化为表格

    我正在使用 NPOI 来操作 Excel xlsx 文件数据和格式 我想知道是否有一种方法可以将单元格范围格式化为表格 something like ITable table worksheet FormatAsTable A1 C4 在互
  • NPOI - 写入文件会损坏 .xlsx 工作簿

    我有一段代码当前正在写入 xls工作簿 HSSFWorkbook 没有问题 但是 当我尝试使用相同的代码写入 xlsx工作簿 XSSFWorkbook 存档已损坏并且无法在 Excel 中打开 以下代码是我用来访问工作簿 编辑工作簿 然后保
  • NPOI 数据格式

    我正在使用 NPOI v1 2 3 导出网格 但在使单元格格式正常工作时遇到问题 我有一个类将对象列表导出到 XLS 文件 为每个对象创建一行 并为每个配置的属性添加一个单元格 可以在每个属性级别设置单元格数据格式 我读过您不应该为每个单元
  • 使用 NPOI,如何返回已由 Excel 格式化的单元格值?

    Using NPOI https npoi codeplex com 是否有任何内置的可能性来格式化单元格值 特别是数字和日期值 因为它已经 如果不是 最好的实施方式是什么 我想到了从 Excel 格式字符串到 C 格式字符串的格式字符串转
  • 使用 NPOI 将图像插入 Excel 文件

    我正在使用 C 在 Visual Studio 2010 中编写一个程序 并且正在使用 NPOI 库 我正在尝试将图像插入到 Excel 文件中 我尝试了两种不同的方法 但都不起作用 Method 1 HSSFPatriarch patri
  • 如何重新计算单元格的公式?

    我的代码设置了很多单元格值 最后 在生成 Excel 文件之前需要评估每个单元格中的公式 对于大多数床单来说 一切进展顺利 但是 有一个单元格抛出异常 该单元格正在计算其后面的一系列单元格以及其他工作表中的参考单元格的平均值 我猜当第一个单
  • “OutOfMemoryException”读取 20mb XLSX 文件

    我在用着NPOI https www nuget org packages NPOI 来处理Excel文件 这是我读取文件的方式 using FileStream stream File OpenRead excelFilePath IWo
  • NPOI 不会更改单元格的字体颜色

    我正在尝试有条件地更改单元格的字体颜色 这是我最后一次尝试 IWorkbook wb null using FileStream fileStream new FileStream path FileMode Open FileAccess

随机推荐

  • vue添加水印踩坑

    介绍 前景 app页面添加水印展示 技术实现 watermark dom 完整代码 vue watermark 实现效果 功能描述 添加 删除 更新水印 引入 方式一 推荐 方便拓展 在index html引入相关文件 方式二 npm包引入
  • java byte[] 学习总结

    最近在学习netty 突然发现自己对字符数组是那么的陌生 吓死宝宝了 然后各种学习 然后测试 终于会用一些了 下线的都是本人的学习笔记 byte表是字符 一个字节 8位 可以组成2 8 256中不同数字 byte存值范围 128 127 1
  • pytorch基本使用_02

    import numpy as np import torch 从numpy引入tensor a np array 2 3 3 print torch from numpy a tensor 2 0000 3 3000 dtype torc
  • java线上CPU100%如何排查

    定位耗费CPU的进程 top c 就可以显示进程列表 然后输入P 按照cpu使用率排序 你会看到类似下面的东西 2 定位耗费CPU的线程 top Hp 1500 就是输入那个进程id就好了 然后输入P 按照cpu使用率排序 你会看到类型下面
  • 单片机c语言数码管显示0到9,单片机如何让8个数码管同时流水显示0到9,大家帮我看看!...

    按你的要求修改如下 include reg52 h 此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16 对数据类型进行声明定义 typedef unsigned char u8 sbit LSA P2
  • Java 网络编程UDP协议之发送数据和接收数据的详解

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 UDP协议 用户数据报协议 User Datagram Protocol UDP是无连接通信协议 即在数据传输时 数据的发送端和接收端不
  • 《信号与系统》4.10.2工频干扰的滤除

    平台 版本 Multisim14 1 参考书籍 信号与系统 4 10 2工频干扰的滤除 工程上 滤除工频干扰比较常用的电路是无源双T陷波滤波器 图示双T的无源陷波滤波器电路 陷波器是某一小频率范围内的带阻滤波器 陷波器的一个常见的应用是滤除
  • Seaborn入门详细教程

    作者 luanhz 来源 小数志 Seaborn入门详细教程 导读 今天我们来介绍 seaborn 这是一个基于matplotlib进行高级封装的可视化库 相比之下 绘制图表更为集成化 绘图风格具有更高的定制性 教程目录 01 初始seab
  • 一文带你了解序列化与反序列化基本原理与操作

    文章目录 一 什么是序列化与反序列化 二 为什么我们需要序列化与反序列化 三 步骤说明 四 注意说明 五 代码说明 六 序列化与反序列化原理 一 什么是序列化与反序列化 序列化是指将对象转换为字节序列的过程 以便于存储或传输 在序列化过程中
  • torch的交叉熵损失函数(cross_entropy)计算(含python代码)

    1 调用 首先 torch的交叉熵损失函数调用方式为 torch nn functional cross entropy input target weight None size average None ignore index 100
  • idea 配置log4j

    1 导入log4j jar包 放在lib目录下 右键jar包 createlibrary 好像是 还有一种方法 2 配置log4j properties文件 设置输出信息 DEBUG级别和ERROR级别 log4j rootLogger d
  • 【图像检测】基于计算机视觉和滤波实现热红外图像温度检测系统含Matlab源码

    1 简介 读入给定的热红外图像 完成彩色图像灰度化 对步骤1中的灰色图像加噪 并采用不同的方法对不同的加噪图像去噪 使得去噪效果更佳 基于灰度图像中标准温度对照带 提取图像中各像素的温度值 2 部分代码 function varargout
  • Keras-多输入多输出【多任务】

    模型结果设计 代码 from keras import Input Model from keras layers import Dense Concatenate import numpy as np from keras utils i
  • Reid 论文文章

    Reid 论文探索 Harmonious Attention Network for Person Re Identification 着重在空间注意力和通道注意力上 结构设计比较巧妙 通过global和local的两级将特征细化 参考链接
  • [QT_027]Qt学习之按钮类控件(QPushButton、QToolButton、QRadioButton、QCheckBox、QCommandLinkButton)

    本文转自 Qt编程指南 作者 奇先生 Qt编程指南 Qt新手教程 Qt Programming Guide 5 1 按钮类的控件 本节介绍图形程序里常见的按钮 包括普通的按钮按钮 之前都用过多次了 还有单选按钮 复选框 命令链接按钮等 本节
  • 【python】jupyter notebook的快捷键

    Jupyter Notebook 提供了许多快捷键以方便操作 这些快捷键分为两类 命令模式快捷键和编辑模式快捷键 命令模式快捷键 在命令模式下 细胞边框是蓝色的 这些快捷键主要用于操作单元格 Enter 进入编辑模式 Shift Enter
  • NoSQL数据库如何选型

    NoSQL数据库在体系结构和功能上各不相同 整体来说 NoSQL数据库选型需要从数据模型和存储特性两方面综合考虑 一 数据模型 NoSQL数据模型包括键值 宽列 图形 文档等 与关系型数据库使用的数据结构不同 具有高扩展性 弱一致性 适合分
  • Ozone作为Hadoop FileSystem的配置使用

    文章目录 前言 Ozone FileSystem的Hadoop兼容性文件系统实现原理 Ozone FileSystem的配置 Ozone FileSystem的使用 引用 前言 Ozone作为同样隶属于Hadoop大数据生态圈的一个系统 尽
  • Dynamics CRM 365 电子邮箱配置

    Dynamics CRM 365 如何配置电子邮箱服务 电子邮件服务器配置 电子邮件配置设置 邮箱 注意 天天在踩坑 坑坑不一样 启用CRM的电子邮箱通知 1 先配置电子邮件服务器文件 2 在电子邮件配置中设置好相关属性配置 3 在邮箱中设
  • NPOI从数据库中调取数据直接导出到EXCEL中

    https blog csdn net weixin 30725315 article details 98769248 一 关于NPOI NPOI是POI项目的 NET版本 是由 Tony Qu http tonyqus cnblogs