C#使用NPOI读取excel转为DataSet

让我来为你详细讲解“C#使用NPOI读取excel转为DataSet”的完整攻略。

什么是NPOI?

NPOI是一款开源的适用于.NET和Java平台的POI开发包。POI是Apache Software Foundation的一个开源项目,其主要功能是对Microsoft Format Documents的解析和创建,比如Word、Excel、PowerPoint等。

准备工作

首先我们需要安装NPOI这个库,可以通过NuGet获取,也可以前往官网下载安装。接着,我们需要引入以下DLL文件:
- NPOI.dll
- NPOI.OOXML.dll
- NPOI.OpenXmlFormats.dll

读取Excel

现在我们开始来读取Excel,代码如下:

using System.Data;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;

public static DataSet ReadExcel(string filePath)
{
    DataSet ds = new DataSet();

    using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
    {
        IWorkbook workbook = new XSSFWorkbook(stream);

        for (int i = 0; i < workbook.NumberOfSheets; i++)
        {
            ISheet sheet = workbook.GetSheetAt(i);

            DataTable dataTable = new DataTable(sheet.SheetName);

            IRow header = sheet.GetRow(0);
            if (header != null)
            {
                int columnIndex = 0;
                foreach (ICell cell in header)
                {
                    var column = new DataColumn(cell.ToString());
                    dataTable.Columns.Add(column);
                    columnIndex++;
                }
            }

            for (int rowIndex = 1; rowIndex <= sheet.LastRowNum; rowIndex++)
            {
                IRow row = sheet.GetRow(rowIndex);
                if (row == null)
                    continue;

                var dataRow = dataTable.NewRow();

                for (int columnIndex = 0; columnIndex < row.LastCellNum; columnIndex++)
                {
                    ICell cell = row.GetCell(columnIndex);
                    if (cell == null)
                        continue;

                    dataRow[columnIndex] = cell.ToString();
                }

                dataTable.Rows.Add(dataRow);
            }

            ds.Tables.Add(dataTable);
        }
    }

    return ds;
}
  • 首先,我们使用FileStream来读取Excel文件。
  • 然后,我们使用XSSFWorkbook来实例化IWorkbook对象,其中,XSSFWorkbook用于读取xlsx格式文件,如果要读取xls格式文件,则需要使用HSSFWorkbook
  • 接着,我们使用workbook.NumberOfSheets获取工作簿的工作表数量,再使用workbook.GetSheetAt(i)来获取相应的工作表。
  • 对于每个工作表,我们使用sheet.SheetName作为数据表的表名,并实例化一个DataTable对象。
  • 接着,我们使用sheet.GetRow(0)来获取表头的行,然后使用header.ToString()来将每个单元格的值转化成字符串,并用DataColumn来创建数据表的列。
  • 然后,我们从第二行开始,使用sheet.GetRow(rowIndex)来获取每一行,使用row.GetCell(columnIndex)获取每个单元格,并将其转化成字符串,并将其放入DataRow中。
  • 最后,我们使用ds.Tables.Add(dataTable)将数据表添加到数据集中,并返回数据集。

示例

下面,我来举两个例子:

示例1:读取单个工作表

var filePath = "path/to/file.xlsx";
var ds = ReadExcel(filePath);

var dataTable = ds.Tables[0];
for (int rowIndex = 0; rowIndex < dataTable.Rows.Count; rowIndex++)
{
    var row = dataTable.Rows[rowIndex];
    for (int columnIndex = 0; columnIndex < dataTable.Columns.Count; columnIndex++)
    {
        Console.Write(row[columnIndex] + "\t");
    }
    Console.WriteLine();
}

以上代码会读取file.xlsx文件的第一个工作表,并将其输出到控制台中。

示例2:读取多个工作表

var filePath = "path/to/file.xlsx";
var ds = ReadExcel(filePath);

foreach (DataTable dataTable in ds.Tables)
{
    Console.WriteLine(dataTable.TableName);
    for (int rowIndex = 0; rowIndex < dataTable.Rows.Count; rowIndex++)
    {
        var row = dataTable.Rows[rowIndex];
        for (int columnIndex = 0; columnIndex < dataTable.Columns.Count; columnIndex++)
        {
            Console.Write(row[columnIndex] + "\t");
        }
        Console.WriteLine();
    }
}

以上代码会读取file.xlsx文件的所有工作表,并将其输出到控制台中。

希望这些内容可以帮助到你。如果还有什么问题,请随时联系我。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#使用NPOI读取excel转为DataSet - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C#固定大小缓冲区及使用指针复制数据详解

    C#固定大小缓冲区及使用指针复制数据详解 什么是固定大小缓冲区? C#中引入了一种特殊的数据类型,即固定大小缓冲区。它是一段连续的、固定大小的内存空间,可以被用于存储临时数据、计算中间值、复制数据等多种操作。 关于固定大小缓冲区的定义,可以使用fixed关键字: fixed (byte* pBuffer = myBuffer) { // 在此区域中,pBuf…

    C# 2023年6月8日
    00
  • C# WinForm应用程序降低系统内存占用方法总结

    C# WinForm应用程序降低系统内存占用方法总结 简介 C# WinForm应用程序在运行过程中会消耗较多的系统内存,如果内存占用过高则会影响系统的反应速度,导致用户体验不佳。本篇文章将介绍降低C# WinForm应用程序内存占用的方法。 方法 1. 图片资源优化 图片资源占用大量内存,影响程序性能。对于C# WinForm应用程序,图片资源可以通过以下…

    C# 2023年6月3日
    00
  • 关于.NET6 Minimal API的使用方式详解

    关于 .NET 6 Minimal API 的使用方式详解 什么是 .NET 6 Minimal API .NET 6 Minimal API 是 .NET 6 新增的一个轻量级 Web API 框架,它旨在提供一种更简单、更轻量级的开发方式,用于快速搭建 Web API 服务。相对于传统的 ASP.NET Core Web API,它更加易于学习、更加灵活…

    C# 2023年6月3日
    00
  • China.com网站开发规范

    China.com网站开发规范 1. 前言 为了保证China.com网站的稳定性、可维护性和可扩展性,我们需要遵守一套标准的网站开发规范。本文档旨在为China.com网站的开发人员提供一些基本的规范和标准,帮助他们更好地编写规范化的代码并降低维护成本。 2. 代码规范 2.1. HTML规范 使用小写字母标签和属性,避免使用未定义的标签和属性 使用双引号…

    C# 2023年6月7日
    00
  • asp.net中oracle 存储过程(图文)

    下面我将详细讲解“ASP.NET 中 Oracle 存储过程”的完整攻略。 一、背景介绍 在使用ASP.NET框架进行Web应用程序开发的过程中,我们通常需要调用Oracle数据库的存储过程来获取数据或者对数据进行修改操作。而存储过程相比于单纯的SQL语句执行,能更好地提高数据库性能,同时还能提高代码实现的安全性。 因此,掌握ASP.NET中Oracle存储…

    C# 2023年6月3日
    00
  • 浅谈C#基础之类的访问修饰符

    浅谈C#基础之类的访问修饰符 C#中共有5种访问修饰符,分别为public、private、protected、internal和protected internal。不同的访问修饰符可以在不同的范围内控制类、方法、属性、字段及其他成员的可访问性。 public访问修饰符 public访问修饰符用于指定一个类、方法、属性或字段可以从任何其他类(包括其他项目中…

    C# 2023年5月31日
    00
  • c#创建vc可调用的com组件方法分享

    下面我就来详细讲解一下“C#创建VC可调用的COM组件方法分享”的完整攻略。 1. 确定组件需求 首先,我们需要确定下自己需要开发什么样的组件,这是COM组件开发的第一步。根据需求确定组件接口和类,建议先画一张组件结构图,方便我们更好地理解组件整体架构。 2. 创建COM组件项目 打开Visual Studio创建新的C# Class Library项目,选…

    C# 2023年6月7日
    00
  • C# List实现行转列的通用方案

    针对 C# List 实现行转列的通用方案,我可以提供以下完整攻略。 1.背景 在实际项目开发过程中,经常需要处理行列互换的操作,即将代表行的数据转换为代表列的数据格式,反之亦然。这种操作在数据仓库中非常常见,例如从 Excel 或数据库中读取的数据通常是行格式,但分析和绘图会更容易处理交换后的列存储数据。C# 中提供了 List 类实现行列转换的方法,本篇…

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