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日

相关文章

  • 关于Vue新搭档TypeScript快速入门实践

    关于Vue新搭档TypeScript快速入门实践 前言 Vue 是一个用于构建用户界面的渐进式框架,广泛应用于 Web 开发。而 TypeScript 是 JavaScript 的超集,它为 JavaScript 提供了类、接口、枚举类型等语法特性,让 JavaScript 的开发更具规范和可维护性。本文将介绍如何在 Vue 项目中使用 TypeScript…

    C# 2023年5月15日
    00
  • C# MVC模式下商品抽奖功能实现

    下面是“C# MVC模式下商品抽奖功能实现”的完整攻略: 1. 确定需求并进行规划 在进行开发之前,先要确定功能需求并进行详细的规划设计工作。在这个案例中,我们需要实现商品抽奖功能,具体的规划流程如下: 确定数据库表结构:商品表、用户表、中奖记录表; 实现商品列表页面,展示商品的图片和基本信息; 实现用户登录和注册功能,用户登录后才能参与抽奖; 实现抽奖页面…

    C# 2023年5月31日
    00
  • Asp.net 下载功能的解决方案

    下面详细为大家介绍“Asp.net 下载功能的解决方案”的攻略。 一、方案介绍 在 Asp.net 中,我们经常需要实现文件下载的功能,这就需要对下载的过程进行控制和管理,以保证下载的正确性和安全性。为了满足这个需求,我们可以通过以下两种方式来实现: 利用 HttpResponse 对象下载文件 我们可以通过 Response 对象将文件以指定的方式输出到浏…

    C# 2023年6月3日
    00
  • C# 迭代器分部类与索引器详情

    让我通过以下标题,详细讲解C#迭代器分部类与索引器的详情: 1. 迭代器分部类 1.1 什么是迭代器 在C#中,迭代器是一种用于简化类似于集合、列表、数组等序列的遍历操作的机制。使用迭代器,我们可以通过简单且易于理解的方式遍历序列,而无需考虑复杂的内部实现。 1.2 什么是迭代器分部类 迭代器分部类是一种特殊的类类型,它可以在多个文件中声明并定义,在编译时会…

    C# 2023年5月31日
    00
  • C#中Entity Framework常见报错汇总

    下面是详细讲解“C#中EntityFramework常见报错汇总”的完整攻略。 C#中EntityFramework常见报错汇总 1. 连接字符串错误 连接字符串错误是EntityFramework中最常见的错误之一。连接字符串属于配置信息中的一部分,提供给DbContext使用。连接字符串可以包含数据库的名称、数据库服务器的名称(或IP)和其他必要的信息,…

    C# 2023年5月15日
    00
  • C#入门教程之集合ArrayList用法详解

    C#入门教程之集合ArrayList用法详解 什么是ArrayList? ArrayList是C#中的一种集合,其可存储任意类型的元素,并且可以动态增加或删除元素。与数组相比,ArrayList的大小可以动态变化,使其更加灵活。 ArrayList的基本用法 创建和初始化ArrayList 使用ArrayList时,需要先实例化一个ArrayList对象,然…

    C# 2023年6月1日
    00
  • 无法从 int? 转换为 int 运行时出现错误

    问题分析 在程序中常常会使用到可空类型(Nullable Type),可空类型表示能存储特定值类型(如 int、float)或者 null 值。在使用可空类型时,我们需要注意到数据类型转换的问题。例如,当我们把一个可空类型的 int? 变量赋值给 int 类型的变量时,就需要进行数据类型转换。如果该 int? 变量的值为 null,就会在进行转换时出现运行时…

    C# 2023年5月15日
    00
  • C#模拟实现QQ窗体功能

    C#模拟实现QQ窗体功能攻略 简介 随着互联网的发展,”QQ社交”已经成为我们日常生活中不可或缺的一部分。在众多QQ客户端中,QQ窗口是其中一款使用最为频繁,且功能最为复杂的应用程序。 本文将详细介绍如何使用C#模拟实现QQ窗体功能,并将分步骤以示例的形式进行说明。 准备设备和环境 在开始实验之前,需要准备好以下基本设备和环境: 一台Windows PC V…

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