c# 将Datatable数据导出到Excel表格中

下面是将Datatable数据导出到Excel表格中的完整攻略。

1. 准备工作

在开始操作之前,需要确保已经将NPOI引入到项目中。可以通过NuGet包管理器或手动下载NPOI工具包的方式引入。

2. 代码实现

在代码中需要引入以下命名空间:

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;

具体实现步骤如下:

  1. 根据Excel版本创建一个工作簿对象:

C#
IWorkbook workbook = null;
if (excelType == ".xlsx")
{
workbook = new XSSFWorkbook();
}
else if (excelType == ".xls")
{
workbook = new HSSFWorkbook();
}

在创建工作簿对象时需要根据Excel文件的版本来选择HSSFWorkbook对象或XSSFWorkbook对象。

  1. 创建一个sheet,并设置sheet的名称:

C#
ISheet sheet = workbook.CreateSheet("Sheet1");

  1. 创建Excel的表头:

C#
IRow firstRow = sheet.CreateRow(0);
for (int i = 0; i < dataTable.Columns.Count; i++)
{
ICell cell = firstRow.CreateCell(i);
cell.SetCellValue(dataTable.Columns[i].ColumnName);
}

创建表头需要遍历datatable的列来创建一个单元格,设置单元格的值即为列名。

  1. 遍历datatable中的所有数据,并将数据填充到Excel表格对应的区域:

C#
for (int i = 0; i < dataTable.Rows.Count; i++){
IRow row = sheet.CreateRow(i + 1);
for (int j = 0; j < dataTable.Columns.Count; j++){
ICell cell = row.CreateCell(j);
cell.SetCellValue(dataTable.Rows[i][j].ToString());
}
}

遍历每一行数据,根据datatable的列数来创建单元格,将datatable中的数据填充到单元格中。

  1. 在内存中创建Excel文件,并保存文件:

C#
MemoryStream ms = new MemoryStream();
workbook.Write(ms);
byte[] fileByte = ms.ToArray();
File.WriteAllBytes(filePath, fileByte);

将Excel文件写入内存流中,然后将流写入到磁盘中。

完整代码如下:

public static void DataTableToExcel(DataTable dataTable, string filePath, string excelType)
{
    IWorkbook workbook = null;
    if (excelType == ".xlsx")
    {
        workbook = new XSSFWorkbook();
    }
    else if (excelType == ".xls")
    {
        workbook = new HSSFWorkbook();
    }

    ISheet sheet = workbook.CreateSheet("Sheet1");

    IRow firstRow = sheet.CreateRow(0);
    for (int i = 0; i < dataTable.Columns.Count; i++)
    {
        ICell cell = firstRow.CreateCell(i);
        cell.SetCellValue(dataTable.Columns[i].ColumnName);
    }

    for (int i = 0; i < dataTable.Rows.Count; i++)
    {
        IRow row = sheet.CreateRow(i + 1);
        for (int j = 0; j < dataTable.Columns.Count; j++)
        {
            ICell cell = row.CreateCell(j);
            cell.SetCellValue(dataTable.Rows[i][j].ToString());
        }
    }

    MemoryStream ms = new MemoryStream();
    workbook.Write(ms);
    byte[] fileByte = ms.ToArray();
    File.WriteAllBytes(filePath, fileByte);
}

3. 示例

下面是两个示例,一个是将一个datatable中的数据导出为Excel,一个是将两个datatable中的数据导出到Excel并分页放置。

示例1

DataTable dataTable = new DataTable();
dataTable.Columns.Add("col1", typeof(string));
dataTable.Columns.Add("col2", typeof(int));
dataTable.Columns.Add("col3", typeof(DateTime));
dataTable.Rows.Add("string1", 1, DateTime.Now);
dataTable.Rows.Add("string2", 2, DateTime.Now);
dataTable.Rows.Add("string3", 3, DateTime.Now);

DataTableToExcel(dataTable, @"C:\temp\test.xlsx", ".xlsx");

示例2

DataTable dataTable1 = new DataTable();
dataTable1.Columns.Add("col1", typeof(string));
dataTable1.Columns.Add("col2", typeof(int));
dataTable1.Columns.Add("col3", typeof(DateTime));
dataTable1.Rows.Add("string1", 1, DateTime.Now);
dataTable1.Rows.Add("string2", 2, DateTime.Now);

DataTable dataTable2 = new DataTable();
dataTable2.Columns.Add("col1", typeof(string));
dataTable2.Columns.Add("col2", typeof(int));
dataTable2.Columns.Add("col3", typeof(DateTime));
dataTable2.Rows.Add("string3", 3, DateTime.Now);

IWorkbook workbook = new XSSFWorkbook();
ISheet sheet1 = workbook.CreateSheet("Sheet1");

IRow firstRow = sheet1.CreateRow(0);
for (int i = 0; i < dataTable1.Columns.Count; i++)
{
    ICell cell = firstRow.CreateCell(i);
    cell.SetCellValue(dataTable1.Columns[i].ColumnName);
}

for (int i = 0; i < dataTable1.Rows.Count; i++)
{
    IRow row = sheet1.CreateRow(i + 1);
    for (int j = 0; j < dataTable1.Columns.Count; j++)
    {
        ICell cell = row.CreateCell(j);
        cell.SetCellValue(dataTable1.Rows[i][j].ToString());
    }
}

ISheet sheet2 = workbook.CreateSheet("Sheet2");
firstRow = sheet2.CreateRow(0);
for (int i = 0; i < dataTable2.Columns.Count; i++)
{
    ICell cell = firstRow.CreateCell(i);
    cell.SetCellValue(dataTable2.Columns[i].ColumnName);
}

for (int i = 0; i < dataTable2.Rows.Count; i++)
{
    IRow row = sheet2.CreateRow(i + 1);
    for (int j = 0; j < dataTable2.Columns.Count; j++)
    {
        ICell cell = row.CreateCell(j);
        cell.SetCellValue(dataTable2.Rows[i][j].ToString());
    }
}

using (FileStream fs = File.Create(@"C:\temp\test.xlsx"))
{
    workbook.Write(fs);
}

这个示例将数据拆分成了两个datatable,然后使用NPOI创建两个sheet,并为每个sheet填充对应的数据。最终将所有数据写入Excel文件中,生成一个带有两个sheet的Excel文件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# 将Datatable数据导出到Excel表格中 - Python技术站

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

相关文章

  • C# new和override的区别分析

    C# new和override的区别分析 在 C# 中,new 和 override 都可以用于继承中方法的重写,它们具有相似的功能,但是在实现上有些区别。 1. new 关键字 new 关键字可以在子类中隐藏基类中已有的同名方法,即子类重写该方法并且使用 new 关键字进行修饰,这样当通过子类对象调用该方法时,就会调用子类中的方法,而不会调用基类中的同名方…

    C# 2023年6月1日
    00
  • Asp.net通过SignalR2进行实时聊天

    下面我将详细讲解“Asp.net通过SignalR2进行实时聊天”的完整攻略,包括如何使用SignalR2构建一个简单的实时聊天程序。 SignalR2是什么? SignalR2 是一个基于 ASP.NET 的开源框架,用于实时 Web 应用程序。它使得实时通讯变得简单,可以实现实时的消息推送、实时的服务器推送以及实时的交互等。 步骤 下面将以 Visual…

    C# 2023年6月3日
    00
  • ASP.NET Core使用EF SQLite对数据库增删改查

    下面我来详细讲解ASP.NET Core使用EF SQLite对数据库增删改查的完整攻略。这个过程包含以下步骤: 创建ASP.NET Core项目并添加EF SQLite支持 创建数据模型类 创建数据库上下文类 创建CRUD操作的API接口 运行应用程序检查功能 下面对每个步骤进行详细说明。 创建ASP.NET Core项目并添加EF SQLite支持 首先…

    C# 2023年6月3日
    00
  • C# 格式化字符串的实现代码

    C# 格式化字符串的实现代码是用于将不同数据类型的值格式化为指定的字符串输出。这里提供两种方式实现格式化字符串的功能:使用占位符的方式和使用字符串插值的方式。 使用占位符的方式 在C#中,使用占位符({})是一种常见的格式化字符串的方式,在占位符内可以使用大括号中指定的格式化字符将数据类型转换为字符串。下面是一个格式化字符串的示例: string s = s…

    C# 2023年5月31日
    00
  • 基于C#实现简单离线注册码生成与验证

    前言本篇攻略将介绍如何使用C#语言实现一个简单的离线注册码生成器与验证器,可适用于需要对软件进行授权的情形,如商业软件、企业内部软件等。首先我们将讲解注册码的生成方法,然后是注册码的验证方法,最后我们会给出完整的示例说明,希望这篇攻略对大家有所帮助。 一、注册码生成器的实现注册码生成器主要包括两个功能:生成唯一的机器码和根据机器码生成注册码。下面是代码实现:…

    C# 2023年6月6日
    00
  • C#(.Net)将非托管dll嵌入exe中的实现

    C# (.Net)可以嵌入非托管dll文件到exe文件中,使得软件的分发和运行更加简单。下面是该过程的实现攻略: 第一步:创建工程 首先,在Visual Studio中创建一个C#应用程序工程。然后,添加非托管dll文件到项目中。注意,该dll文件必须与工程中的所有程序集(包括已添加的其他dll文件)都是兼容的,否则该dll文件会导致工程编译失败。 第二步:…

    C# 2023年6月1日
    00
  • C#利用递归算法解决汉诺塔问题

    C#利用递归算法解决汉诺塔问题 汉诺塔问题是经典的递归问题,它的目标是将一堆盘子从A柱移动到C柱,其中B柱作为中转站,移动过程中应该保证任意时刻,大盘子不能压在小盘子的上面。 简单说明 为了方便,我们假定汉诺塔问题有3个柱子,A、B、C,有N个大小不相同的盘子,初始时这些盘子都放在A柱上,要求将这些盘子全部移动到C柱上,同时按照大盘子在下,小盘子在上的顺序排…

    C# 2023年6月6日
    00
  • C# DirectoryInfo.GetFiles – 获取目录下的所有文件信息

    DirectoryInfo.GetFiles() 方法是C#文件操作中用于获取目录中所有文件的方法之一。该方法可以返回当前 DirectoryInfo 的所有文件(包括子目录中的文件),并且可以使用模式进行过滤。 DirectoryInfo.GetFiles() 方法返回一个 FileInfo 数组,其中每个文件都表示找到的文件。可以使用 FileInfo …

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