C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C# NPOI数据导入Excel

C#使用NPOI实现将表格中数据导入Excel

作者:就是有点傻

NPOI是.NET版本的POI,可以帮助我们在没有安装Microsoft Office的情况下读写Office文件,下面我们就来看看C#如何使用NPOI实现将表格中数据导入Excel吧

在C#中,使用NPOI库将表格数据导入Excel的操作相对直接。NPOI是.NET版本的POI,可以帮助我们在没有安装Microsoft Office的情况下读写Office文件,如xls和xlsx。以下是使用NPOI将DataTable导出到Excel的基本步骤:

创建工作簿:首先,你需要创建一个IWorkbook对象,这是Excel文件的开始。

创建工作表:使用workbook.CreateSheet("Sheet1")创建一个新的工作表。

创建表头:通过遍历DataTable的列来创建Excel文件的表头。

填充数据:遍历DataTable的每一行,并为每个单元格填充数据。

写入文件:最后,将工作簿写入到文件流中,保存为Excel文件。

下面是一个简单的示例代码,展示了如何将DataTable导出到Excel文件:

using NPOI.XSSF.UserModel; // 用于处理xlsx文件
using NPOI.HSSF.UserModel; // 用于处理xls文件
using System.Data;
using System.IO;
 
public void ExportToExcel(DataTable dt, string filePath)
{
    IWorkbook workbook;
    // 根据文件扩展名选择工作簿类型
    if (Path.GetExtension(filePath).Equals(".xlsx", StringComparison.OrdinalIgnoreCase))
    {
        workbook = new XSSFWorkbook();
    }
    else
    {
        workbook = new HSSFWorkbook();
    }
 
    ISheet sheet = workbook.CreateSheet("Sheet1");
 
    // 创建表头
    IRow headerRow = sheet.CreateRow(0);
    for (int i = 0; i < dt.Columns.Count; i++)
    {
        headerRow.CreateCell(i).SetCellValue(dt.Columns[i].ColumnName);
    }
 
    // 填充数据
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        IRow row = sheet.CreateRow(i + 1);
        for (int j = 0; j < dt.Columns.Count; j++)
        {
            row.CreateCell(j).SetCellValue(dt.Rows[i][j].ToString());
        }
    }
 
    // 写入文件
    using (FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
    {
        workbook.Write(fileStream);
    }
}

在上述代码中,我们首先检查文件扩展名来决定创建XSSFWorkbook(用于.xlsx文件)还是HSSFWorkbook(用于.xls文件)。然后,我们创建一个工作表,并填充表头和数据。最后,我们将工作簿写入到指定的文件路径。

实际中第一步

 private void BtnDerive_Click(object sender, EventArgs e)
 {
     SaveFileDialog saveFileDialog = new SaveFileDialog();
     saveFileDialog.Filter = "Excel files (*.xlsx)|*.xlsx";
     saveFileDialog.Title = "选择导出文件保存位置";
     saveFileDialog.FileName = GetFileName();
 
     if (saveFileDialog.ShowDialog() == DialogResult.OK)
     {
         Export(dataGridView1, saveFileDialog.FileName);
     }
 }
  private string GetFileName()
  {
      return $"产品类型表_{DateTime.Now:yyyyMMddHHmmss}.xlsx";
  }
 private void Export(DataGridView dgv, string fileName)
 {
     try
     {
         IWorkbook wb = new XSSFWorkbook();
         //NPOI 使用HSSFWorkbook 类来处理 xls,XSSFWorkbook 类来处理 xlsx。
         //它们都继承接口 IWorkbook,通过 IWorkbook 来统一处理 xls 和 xlsx 格式的文件
         ISheet sheet = wb.CreateSheet();
         IRow row;
         //获取DataGridView的列名,其中 i 表示低级列,i从0开始
         row = sheet.CreateRow(0);
         // 生成标题,注意第一列是“操作”列,不处理
         for (int k = 1; k < dgv.Columns.Count; k++)
         {
             row.CreateCell(k - 1).SetCellValue(dgv.Columns[k].HeaderText.ToString());
         }
         for (int i = 0; i < dgv.Rows.Count; i++)
         {
             row = sheet.CreateRow(i + 1);
             for (int k = 1; k < dgv.Columns.Count; k++)
             {
                 string value = dgv.Rows[i].Cells[k].Value == null ? "" : dgv.Rows[i].Cells[k].Value.ToString();
                 row.CreateCell(k - 1).SetCellValue(value);
             }
         }
         using (var fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
         {
             wb.Write(fs); //写入到Excel中
         }
         MessageBox.Show("保存成功,文件名:" + fileName, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
 }

c# 使用NPOI将DataTable 写入Excel 中的数据类型转换

方法一

using System;
using System.Data;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
 
public class ExcelWriter
{
    public static void WriteDataTableToExcel(DataTable dataTable, string filePath)
    {
        // 创建一个新的工作簿
        IWorkbook workbook = new XSSFWorkbook();
        // 创建一个工作表
        ISheet sheet = workbook.CreateSheet("Sheet1");
 
        // 创建标题行
        IRow headerRow = sheet.CreateRow(0);
        for (int i = 0; i < dataTable.Columns.Count; i++)
        {
            headerRow.CreateCell(i).SetCellValue(dataTable.Columns[i].ColumnName);
        }
 
        // 填充数据行
        int rowIndex = 1;
        foreach (DataRow row in dataTable.Rows)
        {
            IRow dataRow = sheet.CreateRow(rowIndex++);
            for (int i = 0; i < dataTable.Columns.Count; i++)
            {
                DataColumn column = dataTable.Columns[i];
                ICell cell = dataRow.CreateCell(i);
 
                switch (column.DataType.Name.ToLower())
                {
                    case "string":
                        cell.SetCellValue(row[i].ToString());
                        break;
                    case "int32":
                    case "int64":
                        cell.SetCellValue(Convert.ToInt32(row[i]));
                        break;
                    case "double":
                        cell.SetCellValue(Convert.ToDouble(row[i]));
                        break;
                    case "datetime":
                        cell.SetCellValue(Convert.ToDateTime(row[i]));
                        break;
                    case "boolean":
                        cell.SetCellValue(Convert.ToBoolean(row[i]));
                        break;
                    default:
                        cell.SetCellValue(row[i].ToString());
                        break;
                }
            }
        }
 
        // 将工作簿写入文件
        using (var fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
        {
            workbook.Write(fs);
        }
    }
}

方法二

public static void CreateSheet(IWorkbook workbook, DataTable dt, int num)
{
    ISheet sheet = string.IsNullOrEmpty(dt.TableName) ? workbook.CreateSheet("Sheet" + num) : workbook.CreateSheet(dt.TableName);
 
    ICellStyle style = workbook.CreateCellStyle();//设置表格样式
    style.BorderBottom = BorderStyle.Thin;//下边框线(给表格加入背景颜色后,就会覆盖原来的边框,直接设置边框样式可以解决这一问题)
    style.BorderLeft = BorderStyle.Thin; //左边框线
    style.BorderRight = BorderStyle.Thin;//右边框线
    style.BorderTop = BorderStyle.Thin;//上边框线
 
    sheet.PrintSetup.PaperSize = 9;//A4纸张打印
    sheet.PrintSetup.Landscape = true;//横向打印(默认为false即竖向)
 
    //设置自动调整为一页宽度
    sheet.Autobreaks = false;//必须设置
    sheet.FitToPage = true; //一页宽   
    sheet.PrintSetup.FitWidth = 1;
    sheet.PrintSetup.FitHeight = short.MaxValue;
 
    //表头  
    IRow row = sheet.CreateRow(0);
    for (int i = 0; i < dt.Columns.Count; i++)
    {
        ICell cell = row.CreateCell(i);
        cell.SetCellValue(dt.Columns[i].ColumnName);
        cell.CellStyle = style;
    }
 
    //数据  
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        IRow row1 = sheet.CreateRow(i + 1);
        for (int j = 0; j < dt.Columns.Count; j++)
        {
            ICell cell = row1.CreateCell(j);
            cell.CellStyle = style;
 
            if (dt.Columns[j].DataType.Equals(typeof(bool)) && bool.TryParse(dt.Rows[i][j].ToString(), out bool b))
            {
                cell.SetCellValue(b);
            }
            else if (double.TryParse(dt.Rows[i][j].ToString(), out double d))//数字格式
            {
                cell.SetCellValue(d);
            }
            else
            {
                cell.SetCellValue(dt.Rows[i][j].ToString());
            }
        }
    }
 
    for (int columnIndex = 0; columnIndex < dt.Rows.Count; columnIndex++)
    {
        sheet.AutoSizeColumn(columnIndex); //列宽自适应
    }
 
}

到此这篇关于C#使用NPOI实现将表格中数据导入Excel的文章就介绍到这了,更多相关C# NPOI数据导入Excel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文