C#使用NPOI对Excel数据进行导入导出

下面就给大家详细讲解一下“C#使用NPOI对Excel数据进行导入导出”的完整攻略。

一、NPOI是什么?

NPOI是一个跨平台的第三方.xls和.xlsx格式操作组件库,适用于.NET平台,可以方便地读取、创建和编辑Excel文件,提供了针对Excel文件的内存读写支持,支持xls、xlsx、doc、docx、ppt、pptx等多种Office格式。

二、NPOI应用的常用类

在使用NPOI进行Excel读写时,常用的类有以下几个:

  • HSSFWorkbook:对应xls格式
  • XSSFWorkbook:对应xlsx格式
  • HSSFSheet:对应Excel工作表(xls)
  • XSSFSheet:对应Excel工作表(xlsx)
  • HSSFRow:对应Excel工作表中的行(xls)
  • XSSFRow:对应Excel工作表中的行(xlsx)

三、C#使用NPOI进行Excel导出

3.1 创建Excel文件

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;
using System.Web;

public ActionResult Export()
{
    //创建工作簿对象
    HSSFWorkbook workbook = new HSSFWorkbook();
    //创建工作表对象
    ISheet sheet = workbook.CreateSheet("sheet1");
    //创建行对象
    IRow row1 = sheet.CreateRow(0);
    //创建列对象
    ICell cell1 = row1.CreateCell(0);
    cell1.SetCellValue("姓名");
    ICell cell2 = row1.CreateCell(1);
    cell2.SetCellValue("性别");
    ICell cell3 = row1.CreateCell(2);
    cell3.SetCellValue("年龄");
    //创建行对象
    IRow row2 = sheet.CreateRow(1);
    //创建列对象
    ICell cell4 = row2.CreateCell(0);
    cell4.SetCellValue("小明");
    ICell cell5 = row2.CreateCell(1);
    cell5.SetCellValue("男");
    ICell cell6 = row2.CreateCell(2);
    cell6.SetCellValue(18);
    //流方式,下载文件
    MemoryStream ms = new MemoryStream();
    workbook.Write(ms);
    Response.AddHeader("Content-Disposition", string.Format("attachment; filename=FileName.xls"));
    Response.BinaryWrite(ms.ToArray());
    return new EmptyResult();
}

3.2 Excel导出模板

public ActionResult ExportTemplate()
{
    //导出模板文件的路径
    string excelTemplatePath = System.Web.HttpContext.Current.Request.MapPath("~/UploadFiles/Template.xls");
    //创建工作簿对象
    HSSFWorkbook workbook = new HSSFWorkbook(new FileStream(excelTemplatePath, FileMode.Open, FileAccess.Read));
    //创建工作表对象
    ISheet sheet = workbook.GetSheetAt(0);
    //获取表头行
    IRow rowHeader = sheet.GetRow(0);
    //获取需要导出的数据列表
    List<User> userList = new List<User>()
    {
        new User { Name = "小明", Gender = "男", Age = 20 },
        new User { Name = "小红", Gender = "女", Age = 18 }
    };
    //导出数据到Excel
    int rowIndex = 1;
    foreach (User user in userList)
    {
        IRow row = sheet.CreateRow(rowIndex);
        ICell cell1 = row.CreateCell(0);
        cell1.SetCellValue(user.Name);
        ICell cell2 = row.CreateCell(1);
        cell2.SetCellValue(user.Gender);
        ICell cell3 = row.CreateCell(2);
        cell3.SetCellValue(user.Age);
        rowIndex++;
    }
    //流方式,下载文件
    MemoryStream ms = new MemoryStream();
    workbook.Write(ms);
    Response.AddHeader("Content-Disposition", string.Format("attachment; filename=FileName.xls"));
    Response.BinaryWrite(ms.ToArray());
    return new EmptyResult();
}

四、C#使用NPOI进行Excel导入

4.1 读取Excel文件

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;
using System.Web;

public ActionResult Import()
{
    //获取要上传的Excel文件
    HttpPostedFileBase file = Request.Files["fileUpload"];
    //Excel文件的后缀名(xls/xlsx)
    string fileExtension = Path.GetExtension(file.FileName);
    //Excel文件的完整路径
    string filePath = Path.Combine(HttpContext.Server.MapPath("~/UploadFiles/"), file.FileName);
    file.SaveAs(filePath);
    //根据Excel文件的后缀名,创建对应的工作簿对象
    IWorkbook workbook = null;
    if (fileExtension == ".xls")
    {
        workbook = new HSSFWorkbook(new FileStream(filePath, FileMode.Open, FileAccess.Read));
    }
    else if (fileExtension == ".xlsx")
    {
        workbook = new XSSFWorkbook(new FileStream(filePath, FileMode.Open, FileAccess.Read));
    }
    //获取第一个工作表
    ISheet sheet = workbook.GetSheetAt(0);
    List<User> userList = new List<User>();
    //遍历工作表中的行
    for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
    {
        IRow row = sheet.GetRow(i);
        if (row == null)
        {
            continue;
        }
        User user = new User();
        user.Name = row.GetCell(0).ToString();
        user.Gender = row.GetCell(1).ToString();
        user.Age = Convert.ToInt32(row.GetCell(2).ToString());
        userList.Add(user);
    }
    //删除已上传的Excel文件
    if (System.IO.File.Exists(filePath))
    {
        System.IO.File.Delete(filePath);
    }
    return View(userList);
}

4.2 解析Excel内容

public ActionResult Import()
{
    //获取要上传的Excel文件
    HttpPostedFileBase file = Request.Files["fileUpload"];
    //Excel文件的后缀名(xls/xlsx)
    string fileExtension = Path.GetExtension(file.FileName);
    //Excel文件的完整路径
    string filePath = Path.Combine(HttpContext.Server.MapPath("~/UploadFiles/"), file.FileName);
    file.SaveAs(filePath);
    //根据Excel文件的后缀名,创建对应的工作簿对象
    IWorkbook workbook = null;
    if (fileExtension == ".xls")
    {
        workbook = new HSSFWorkbook(new FileStream(filePath, FileMode.Open, FileAccess.Read));
    }
    else if (fileExtension == ".xlsx")
    {
        workbook = new XSSFWorkbook(new FileStream(filePath, FileMode.Open, FileAccess.Read));
    }
    //获取第一个工作表
    ISheet sheet = workbook.GetSheetAt(0);
    List<User> userList = new List<User>();
    //获取表头行
    IRow rowHeader = sheet.GetRow(0);
    //获取需要解析的列的索引
    int nameIndex = -1;
    int genderIndex = -1;
    int ageIndex = -1;
    for (int i = rowHeader.FirstCellNum; i < rowHeader.LastCellNum; i++)
    {
        string cellValue = rowHeader.GetCell(i).ToString();
        if (cellValue == "姓名")
        {
            nameIndex = i;
        }
        else if (cellValue == "性别")
        {
            genderIndex = i;
        }
        else if (cellValue == "年龄")
        {
            ageIndex = i;
        }
    }
    //遍历工作表中的行
    for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
    {
        IRow row = sheet.GetRow(i);
        if (row == null)
        {
            continue;
        }
        User user = new User();
        if (nameIndex != -1)
        {
            user.Name = row.GetCell(nameIndex).ToString();
        }
        if (genderIndex != -1)
        {
            user.Gender = row.GetCell(genderIndex).ToString();
        }
        if (ageIndex != -1)
        {
            user.Age = Convert.ToInt32(row.GetCell(ageIndex).ToString());
        }
        userList.Add(user);
    }
    //删除已上传的Excel文件
    if (System.IO.File.Exists(filePath))
    {
        System.IO.File.Delete(filePath);
    }
    return View(userList);
}

以上就是C#使用NPOI对Excel数据进行导入导出的完整攻略,希望能够对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#使用NPOI对Excel数据进行导入导出 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • c#转换全角半角方法示例

    当我们需要对用户输入的字符或文本进行处理时,经常需要将全角字符转换为半角字符或者将半角字符转换为全角字符。c#中提供了相应的方法来实现这些功能。下面是一个完整的示例说明“c#转换全角半角方法”的攻略。 1. 转换全角到半角 使用 System.Text.RegularExpressions.Regex 类的 Replace 方法可以实现将全角字符转换为半角字…

    C# 2023年6月8日
    00
  • asp.net页面中如何获取Excel表的内容

    获取Excel表的内容,需要使用相关的类库和方法。在ASP.NET页面中,一般可以通过以下步骤来获取Excel表的内容: 1.导入相关命名空间和类库 首先需要在代码文件的开头导入相关命名空间和类库,包括: using System.Data; using System.Data.OleDb; 其中,System.Data提供了数据库操作的相关类,而Syste…

    C# 2023年6月6日
    00
  • Unity 实现贴花效果的制作教程

    下面是“Unity 实现贴花效果的制作教程”的完整攻略。 1. 概述 贴花效果指的是将一张图片或纹理贴在另一张图片或物体表面上,从而增强物体的细节和真实感。在 Unity 中,可以通过材质球和 Shader 实现贴花效果。 本文将介绍如何使用 Shader 在 Unity 中制作贴花效果。本文的 Shader 脚本实现了在物体表面绘制标准材质球的副本和一张透…

    C# 2023年6月3日
    00
  • C#移除字符串中的不可见Unicode字符 案例代码

    C#移除字符串中的不可见Unicode字符的完整攻略如下: 问题背景 在开发中,有时候字符串中可能会包含非常规的字符,例如不可见的Unicode字符。这些字符虽然不会影响字符串的显示,但会影响字符串的处理和运算。因此,需要移除字符串中的这些非常规字符,以便更好地进行后续的操作。 解决方案 我们可以通过正则表达式来匹配和替换字符串中的非常规字符。具体实现步骤如…

    C# 2023年5月31日
    00
  • 在C#使用字典存储事件示例及实现自定义事件访问器

    在C#中,我们可以使用字典作为存储事件的数据结构来方便地处理事件的订阅和触发。以下是一些实现自定义事件访问器的步骤: 1. 声明事件 首先,我们需要声明事件。事件是一种操作,它在特定条件下会被触发。在C#中,事件可以理解为委托的实例化。下面是一个声明事件的示例: public event Action<string> MyEvent; 这里声明了…

    C# 2023年5月31日
    00
  • 未能加载文件或程序集“XXX”或它的某一个依赖项。试图加载格式不正确的程序。

    这个错误提示通常表示程序在加载某个DLL文件时出现了问题,这个DLL文件可能是应用程序的依赖项之一,或者是应用程序本身的一部分。以下是解决这个错误的一些常见步骤: 1. 检查DLL文件的位数 如果应用程序是64位的,那么它需要使用64位的DLL文件。如果应用程序是32位的,那么它需要使用32位的DLL文件。如果你将不同位数的DLL文件混合使用会导致这个错误,…

    C# 2023年5月15日
    00
  • ASP.NET Core实现文件上传和下载

    一、ASP.NET Core实现文件上传的完整攻略 设置文件上传的API接口 要实现文件上传,首先需要在ASP.NET Core的API接口中设置文件上传的路由路径和它所用的http请求方式。例如,下面的代码演示了如何在API接口中设置文件上传的路由路径和它所用的http请求方式。 [HttpPost] [Route("api/uploadfile…

    C# 2023年6月3日
    00
  • C#调用C++版本dll时的类型转换需要注意的问题小结

    以下是详细的攻略。 标题 “C#调用C++版本dll时的类型转换需要注意的问题小结” 前言 在C#开发中,调用C++版本的dll时,需要进行类型转换。若不注意,可能会出现类型转换错误,导致程序崩溃。因此需要注意一些问题。 正文 问题1:传递指针类型 在C#中无法直接传递C++中的指针类型,需要通过IntPtr类型进行转换。 例如,C++中的函数声明如下: v…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部