AspNet怎么用Npoi导入导出Excel? | Asp.Net Excel导入导出方法

Asp.Net使用Npoi导入导出Excel的方法

在Asp.Net应用程序中处理Excel文件是常见需求,NPOI作为免费、开源且强大的.NET库,完美支持xls与xlsx格式,为数据导入导出提供了高效解决方案。

AspNet怎么用Npoi导入导出Excel

.net,C#,winform NPOI导入导出Excel,包括2003和2007以上版本
加载中
.net,C#,winform NPOI导入导出Excel,包括2003和2007以上版本

环境准备与基础配置

  1. 安装NPOI库
    通过NuGet包管理器安装必需包:

    Install-Package NPOI
    Install-Package NPOI.OOXML   # 支持xlsx格式
    Install-Package NPOI.OpenXml4Net   # 依赖项
  2. 引用命名空间

    using NPOI.SS.UserModel;
    using NPOI.XSSF.UserModel;   // xlsx处理
    using NPOI.HSSF.UserModel;   // xls处理
    using System.IO;

Excel数据导出实战(DataTable → Excel文件)

public void ExportToExcel(DataTable dataTable, string filePath)
{
    IWorkbook workbook;
    // 根据扩展名判断创建xls或xlsx工作簿
    if (Path.GetExtension(filePath).Equals(".xlsx", StringComparison.OrdinalIgnoreCase))
        workbook = new XSSFWorkbook();
    else
        workbook = new HSSFWorkbook();
    ISheet sheet = workbook.CreateSheet("Sheet1");
    // 创建标题行
    IRow headerRow = sheet.CreateRow(0);
    for (int i = 0; i < dataTable.Columns.Count; i++)
    {
        headerRow.CreateCell(i).SetCellValue(dataTable.Columns[i].ColumnName);
    }
    // 填充数据行
    for (int rowIdx = 0; rowIdx < dataTable.Rows.Count; rowIdx++)
    {
        IRow dataRow = sheet.CreateRow(rowIdx + 1);
        for (int colIdx = 0; colIdx < dataTable.Columns.Count; colIdx++)
        {
            dataRow.CreateCell(colIdx).SetCellValue(dataTable.Rows[rowIdx][colIdx].ToString());
        }
    }
    // 自适应列宽(关键优化)
    for (int i = 0; i < dataTable.Columns.Count; i++)
    {
        sheet.AutoSizeColumn(i);
    }
    // 写入文件流
    using (FileStream fs = new FileStream(filePath, FileMode.Create))
    {
        workbook.Write(fs);
    }
}

关键优化点:

  • 格式自适应:根据文件扩展名自动选择HSSF(xls)或XSSF(xlsx)工作簿
  • 性能提升:使用AutoSizeColumn自动调整列宽提升可读性
  • 内存管理:严格使用using语句确保文件流及时释放

Excel数据精准导入(Excel文件 → DataTable)

public DataTable ImportFromExcel(string filePath, bool hasHeader = true)
{
    using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
    {
        IWorkbook workbook;
        // 根据文件头判断格式
        if (Path.GetExtension(filePath).Equals(".xlsx", StringComparison.OrdinalIgnoreCase))
            workbook = new XSSFWorkbook(fs);
        else
            workbook = new HSSFWorkbook(fs);
        ISheet sheet = workbook.GetSheetAt(0); // 读取第一个工作表
        DataTable dataTable = new DataTable();
        IRow headerRow = sheet.GetRow(0);
        int cellCount = headerRow.LastCellNum;
        // 构建DataTable列结构
        for (int i = 0; i < cellCount; i++)
        {
            string columnName = hasHeader ? 
                headerRow.GetCell(i)?.ToString() : $"Column{i}";
            dataTable.Columns.Add(columnName ?? $"Column{i}");
        }
        // 确定数据起始行(是否跳过标题行)
        int startRow = hasHeader ? 1 : 0;
        for (int rowIdx = startRow; rowIdx <= sheet.LastRowNum; rowIdx++)
        {
            IRow row = sheet.GetRow(rowIdx);
            if (row == null) continue;
            DataRow dataRow = dataTable.NewRow();
            for (int colIdx = 0; colIdx < cellCount; colIdx++)
            {
                dataRow[colIdx] = row.GetCell(colIdx)?.ToString() ?? string.Empty;
            }
            dataTable.Rows.Add(dataRow);
        }
        return dataTable;
    }
}

异常处理重点:

  • 空行跳过:遇到空行自动跳过避免空引用异常
  • 空单元格处理:使用操作符安全访问单元格
  • 格式智能识别:通过文件扩展名自动匹配处理引擎

进阶技巧与性能优化

  1. 大文件分块处理

    AspNet怎么用Npoi导入导出Excel

    // 使用SXSSFWorkbook处理百万级数据
    SXSSFWorkbook workbook = new SXSSFWorkbook(-1); // 启用临时文件缓冲
    // 每写入100行刷新磁盘缓存
    workbook.SetCompressTempFiles(true); 
  2. 单元格样式深度定制

    ICellStyle headerStyle = workbook.CreateCellStyle();
    headerStyle.FillForegroundColor = IndexedColors.Grey25Percent.Index;
    headerStyle.FillPattern = FillPattern.SolidForeground;
    IFont font = workbook.CreateFont();
    font.FontName = "微软雅黑";
    font.IsBold = true;
    headerStyle.SetFont(font);
    // 应用样式到标题行
    foreach (ICell cell in headerRow.Cells)
    {
        cell.CellStyle = headerStyle;
    }
  3. 公式计算支持

    cell.SetCellFormula("SUM(B2:B10)"); // 设置计算公式
    // 触发公式重新计算
    IFormulaEvaluator evaluator = workbook.GetCreationHelper().CreateFormulaEvaluator();
    evaluator.EvaluateAll(); 

常见陷阱与解决方案

  1. 内存溢出问题

    • 场景:处理100MB+的xlsx文件
    • 方案:改用SXSSFWorkbook流式处理
      SXSSFWorkbook wb = new SXSSFWorkbook(100); // 内存保留100行
  2. 日期格式错乱

    • 根源:Excel内部以浮点数存储日期
    • 修复:
      if (DateUtil.IsCellDateFormatted(cell))
      {
        DateTime dateValue = cell.DateCellValue;
      }
  3. 字体渲染异常

    AspNet怎么用Npoi导入导出Excel

    • 现象:Linux环境中文乱码
    • 方案:显式注册字体
      Environment.SetEnvironmentVariable("FONTCONFIG_PATH", "/usr/share/fonts");

关键技术指标对比
| 处理方式 | 10000行耗时 | 内存峰值 | 功能完整性 |
|—————-|————-|———-|————|
| NPOI (XSSF) | 1.8s | 210MB | ★★★★☆ |
| NPOI (SXSSF) | 2.1s | 45MB | ★★★★☆ |
| EPPlus | 1.5s | 190MB | ★★★★☆ |
| OpenXML SDK | 3.2s | 60MB | ★★☆☆☆ |


NPOI在Asp.Net中实现了Excel处理的高自由度与深度控制,特别适合需要精细操作单元格、公式或处理旧版xls的场景,当您需要处理10万行以上的数据时,是否考虑过采用分页加载机制?在实际项目中您遇到的最棘手的Excel导入导出问题是什么?欢迎分享您的实战经验!

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/26692.html

(0)
Catch2框架轻量吗?单头文件C++测试工具深度测评
上一篇 2026年2月12日 19:31
国内大宽带高防服务器哪里买?租用高防服务器多少钱一月
下一篇 2026年2月12日 19:34

相关推荐

  • ajax如何用js实现请求?ajax异步请求数据教程

    Ajax通过JavaScript的XMLHttpRequest或Fetch API对象,在后台与服务器进行异步数据交换,从而实现页面局部刷新而不需要重新加载整个网页,这种技术彻底改变了Web应用的交互体验,让网页从“静态文档”进化为“动态应用”,在2026年的前端开发语境下,理解Ajax的核心原理与最佳实践,依……

    2026年6月3日
    3900
  • AI识别人脸得分准吗,AI人脸识别评分标准是什么

    人脸识别技术的核心在于将人脸图像转化为计算机可理解的数学特征,而ai识别人脸得分则是衡量这些特征相似度的量化指标,这一得分直接决定了系统是否判定“你是你”,是连接算法底层逻辑与上层业务应用的关键桥梁,单纯依赖高分并不等于绝对安全,一个优秀的人脸识别系统必须建立在理解得分机制、合理设定阈值以及配合多重防御策略的基……

    2026年2月23日
    14000
  • 长沙物理机租用究竟哪家性价比高,哪家好?

    在长沙租用物理机,性价比高的选择并非只看价格,而是要综合对比机房等级、带宽质量和售后响应速度,通常本地核心机房(如长沙电信、长沙联通)在延迟和运维便利性上更胜一筹,具体哪家最适合你,需要根据业务场景和预算来定,长沙物理机租用哪家性价比高?核心对比维度硬件配置与价格匹配物理机配置直接决定价格,但性价比不是单纯的低……

    2026年7月27日
    600
  • F5一台服务器故障时如何将流量指向另一台?, 怎么切换

    F5一台服务器故障时,健康检查会迅速标记其为宕机,Big-IP自动将新建连接和现有连接(根据会话保持策略)都导向其他健康成员,核心操作是检查Pool的健康监视器配置以及成员的启用状态,确保故障节点被自动隔离,F5负载均衡器故障转移设置:自动切换的工作原理F5 BIG-IP的故障转移不依赖“心跳线”或人工干预,而……

    2026年7月23日
    1400
  • AIoT如何赋能城市安全?智慧城市安防解决方案

    AIoT技术正在重塑城市安全治理的底层逻辑,实现从“被动响应”向“主动预防”的根本性转变,通过人工智能(AI)与物联网(IoT)的深度融合,城市构建起了一套全时段、全区域、全要素的智能感知体系,不仅极大提升了突发事件的处置效率,更有效降低了各类安全风险的发生概率,成为构建智慧城市安全屏障的核心驱动力, 构建“感……

    2026年3月13日
    14300
  • 服务器i/o系统是什么?服务器i/o性能优化指南

    服务器I/O系统的核心效能直接决定了数据中心整体业务的吞吐量与响应速度,其设计优劣是衡量服务器性能瓶颈的关键指标,在计算能力过剩而数据传输滞后的当下,I/O系统不再仅仅是CPU的附属设施,而是与计算单元并驾齐驱的核心枢纽,一个高效的服务器I/O系统架构,必须具备高带宽、低延迟以及极强的并发处理能力,以确保数据流……

    2026年3月31日
    7800
  • Ajax中JSON格式与php如何传输?php接收ajax json数据

    Ajax通过XMLHttpRequest或Fetch API发送JSON格式数据,PHP端利用file_get_contents(“php://input”)读取原始请求体并解码,实现前后端异步交互,在现代Web开发中,前后端分离已成为行业共识,传统的表单提交会导致页面刷新,体验割裂,而Ajax技术的引入,特别……

    程序编程 2026年6月1日
    3600
  • 广西舆情监测公司哪家靠谱?如何选择合适的舆情监测机构

    广西舆情监测公司通过全天候数据采集与智能情感分析,能帮政企在危机爆发前锁定风险,核心在于“早发现、准研判、快处置”的闭环能力,在数字化浪潮席卷的当下,信息传播的速度早已超越了传统媒体的边界,对于身处西南门户的广西政企而言,网络舆论场不再是遥远的虚拟空间,而是直接影响社会稳定、品牌形象乃至决策安全的现实战场,当一……

    2026年5月28日
    3600
  • RackNerd VPS测评,美国12.79美元/年实测数据与性能表现,RackNerd VPS怎么样,RackNerd VPS测评

    RackNerd 2026 年 VPS 实测结论明确:其 12.79 美元/年的入门款虽在 CPU 单核性能上存在瓶颈,但在存储 I/O 稳定性与网络延迟控制上表现优异,是2026 年预算有限且侧重静态内容托管或轻量级数据库部署的高性价比首选方案,核心参数与硬件架构深度解析硬件配置与 2026 年行业标准对比在……

    2026年5月12日
    3900
  • AJAX javascript跨域访问执行失败怎么办?如何解决js跨域问题

    通过配置后端代理服务器或使用JSONP技术,结合现代浏览器的CORS策略,可以安全且高效地实现AJAX跨域访问,在Web开发的实际场景中,同源策略是一把双刃剑,它保护了用户的数据安全,却给开发者带来了“跨域”这一经典难题,当你试图通过AJAX请求不同域名下的API接口时,浏览器控制台通常会弹出一条红色的报错信息……

    2026年6月6日
    3900

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论列表(1条)

  • smart491
    smart491 2026年2月19日 22:28

    终于不用为Excel那些莫名其妙的错误码头疼了,NPOI确实好用。