在C#中使用NPOI实现DataTable与Excel文件相互转换

首先,打开Visual studio,新建项目,在Nuget中搜索并安装NPOI。

在c中如何实现数据调用,在c程序中调用api

创建类 DataTableExcelConverter ,并引入以下命名空间

using System;
using System.Data;
using System.IO;
using NPOI.HSSF.UserModel; // 用于HSSFWorkbook
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel; // 用于XSSFWorkbook

添加静态方法SaveDataTableToExcel,代码如下

public static void SaveDataTableToExcel(DataTable dataTable, string filePath, bool isXlsx = true)
{
  // 根据文件格式创建Workbook对象
  IWorkbook workbook;
  if (isXlsx)
  {
    workbook = new XSSFWorkbook();
  }
  else
  {
    workbook = new HSSFWorkbook();
  }
  // 创建Sheet对象
  ISheet sheet = workbook.CreateSheet("Data");
  // 将DataTable的列名写入Excel的第一行
  int i = 0;
  IRow excelRow = sheet.CreateRow(0);
  foreach (DataColumn column in dataTable.Columns)
  {
    excelRow.CreateCell(i).SetCellValue(column.ColumnName);
    i++;
  }
  i = 1;
  // 将DataTable的行数据写入Excel
  foreach (DataRow row in dataTable.Rows)
  {
    excelRow = sheet.CreateRow(i);
    for (int j = 0; j < dataTable.Columns.Count; j++)
    {
      excelRow.CreateCell(j).SetCellValue(row[j].ToString());
    }
    i++;
  }

  // 自动调整列宽
  for (int j = 0; j < dataTable.Columns.Count; j++)
  {
    sheet.AutoSizeColumn(j);
  }
  // 保存Workbook到文件
  using (FileStream file = new FileStream(filePath, FileMode.Create))
  {
    workbook.Write(file);
  }
  // 关闭Workbook释放资源
  workbook.Close();
}

该方法用于将DataTable内的数据存储到Excel文件中,其中dataTable是用于存储的数据,filePath是要报文Excel文件的路径, isXlsx表示存储格式是“xls”还是“xlsx”。

添加静态方*L法**oadExcelToDataTable,代码如下:

       public static DataTable LoadExcelToDataTable(string filePath, int sheetIndex = 0)
       {
           // 创建一个空的DataTable
           DataTable dataTable = new DataTable();
           // 确定文件类型并创建相应的Workbook对象
           IWorkbook workbook;
           if (filePath.EndsWith(".xls", StringComparison.OrdinalIgnoreCase))
           {
               workbook = new HSSFWorkbook(new FileStream(filePath, FileMode.Open, FileAccess.Read));
           }
           else if (filePath.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase))
           {
               workbook = new XSSFWorkbook(new FileStream(filePath, FileMode.Open, FileAccess.Read));
           }
           else
           {
               throw new ArgumentException("Invalid Excel file format.");
           }
           // 获取指定的工作表
           ISheet sheet = workbook.GetSheetAt(sheetIndex);
           // 读取第一行作为列名
           IRow headerRow = sheet.GetRow(0);
           if (headerRow == null)
           {
               throw new InvalidOperationException("The specified sheet does not contain any data.");
           }
           // 遍历第一行的每个单元格,创建DataTable的列
           for (int i = 0; i < headerRow.LastCellNum; i++)
           {
               var columnName = headerRow.GetCell(i)?.ToString() ?? #34;Column{i + 1}";
               dataTable.Columns.Add(columnName);
           }
           // 读取工作表中的数据行,填充到DataTable中
           for (int rowIndex = 1; rowIndex <= sheet.LastRowNum; rowIndex++)
           {
               IRow row = sheet.GetRow(rowIndex);
               if (row != null)
               {
                   DataRow dataRow = dataTable.NewRow();
                   for (int i = 0; i < row.LastCellNum; i++)
                   {
                       dataRow[i] = row.GetCell(i)?.ToString() ?? string.Empty;
                   }
                   dataTable.Rows.Add(dataRow);
               }
           }
           // 关闭Workbook释放资源
           workbook.Close();
           return dataTable;
       }

该方法用于将Excel文件转换为DataTable,"filePath"表示Excel文件的路径,sheetIndex"表示要读取的工作表索引,返回包含Excel数据的DataTable对象。