C#将Excel导入DataTable

我写这篇文章主要目的就是复习一下这个代码,加深我自己的理解,写的不对的地方,请各位不吝赐教,接下来让我们进入主题。

首先我们要添加这个NPOI这个包,并且引用

  1. 创建一个字符串变量 filename,用于存储 Excel 文件的路径。

  2. 创建一个空的 IWorkbook 对象 workbook,用于代表 Excel 工作簿。

  3. 创建一个空的 ISheet 对象 sheet,用于代表 Excel 的工作表。

  4. 创建一个 DataTable 对象 dt,用于存储 Excel 表格数据。

  5. 设置 filename 的值,将其指向 Excel 文件的路径。

  6. 创建一个 FileStream 对象 fs,用于读取 Excel 文件。这里使用 FileMode.Open 表示以只读方式打开文件,FileAccess.Read 表示允许读取文件。

  1. 判断 filename 是否包含 ".xlsx",如果是,就创建一个 XSSFWorkbook 对象 workbook,用于代表 Excel 工作簿。XSSFWorkbook 对象用于处理 Excel 2007 或更高版本的 .xlsx 格式文件。

  2. 如果 filename 不包含 ".xlsx",则判断 filename 是否包含 ".xls",如果是,就创建一个 HSSFWorkbook 对象 workbook,用于代表 Excel 工作簿。HSSFWorkbook 对象用于处理 Excel 97-2003 版本的 .xls 格式文件。

  1. 判断传入的 sheetName 是否为 null。如果是 null,则使用 workbook.GetSheetAt(0) 获取第一个工作表。

  2. 如果 sheetName 不为 null,则使用 workbook.GetSheet(sheetName) 方法获取指定名称的工作表对象。如果找不到该名称对应的工作表,会返回 null。

  3. 如果获取到的工作表对象 sheet 仍为 null,则说明找不到指定名称的工作表。这时,我们尝试获取第一个工作表对象,即 workbook.GetSheetAt(0)

  1. 判断传入的 sheet 参数是否为 null。如果 sheet 为 null,则说明没有成功读取 Excel 文件或者工作表名称不存在。这时,直接返回一个空的 DataTable 对象。

  2. 使用 sheet.GetRow(0) 方法获取工作表的第一行数据,即列名。然后,使用 fistRow.LastCellNum 获取该行最后一个单元格的索引。

  3. 判断 IsFirstRowColum 参数的值。如果为 true,则说明第一行是列名,需要将其作为 DataTable 的列添加进去。否则,从第二行开始读取数据。

  4. 循环遍历工作表中的每一行数据。使用 sheet.LastRowNum 获取工作表最后一行的行号。

  5. 对于每一行,使用 sheet.GetRow(i) 方法获取行对象。如果该行为空,则跳过当前循环,读取下一行的数据。

  6. 创建一个空的 DataRow 对象,用于存储当前行的数据。

  7. 循环遍历每一列单元格。使用 rows.FirstCellNum 获取当前行第一个单元格的索引。如果该单元格不为空,则将其值转换成字符串,并将其存储到对应的 DataColumn 中。

  8. 使用 dt.NewRow() 创建一个新的 DataRow,然后将该 DataRow 中的每一列数据填充完整。使用 dataRow[j] = rows.GetCell(j).ToString(); 将单元格的值赋值给该 DataRow。

  9. 将填充好的 DataRow 添加到 DataTable 中,然后循环下一行数据。

  10. 返回填充好数据的 DataTable 对象。

大体就是这个就是这些,接下来是我整体的代码

public static DataTable ExcelByDataTable(string Namepath, string sheetName = null, bool IsFirstRowColum = true)
{
    try
    {
        // 储存路径
        string filename;

        IWorkbook workbook=null;

        // 工作表
        ISheet sheet = null;

        DataTable dt = new();

        // 表格路径
        filename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory) + "Config" + Namepath + ".xlsx";

        FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);


        if (filename.IndexOf(".xlsx") > 0)
        {
            workbook = new XSSFWorkbook(fs);
        }
        else if (filename.IndexOf(".xls") > 0)
        {
            workbook = new HSSFWorkbook(fs);
        }

        if (sheetName != null)  // 是否指定Excel表格
        {
            sheet = workbook.GetSheet(sheetName);

            // 如果找不到指定的sheetName对应的sheet,就尝试获取第一个sheet
            if (sheet == null)
            {
                sheet = workbook.GetSheetAt(0);
            }
        }
        else
        {
            sheet = workbook.GetSheetAt(0);
        }

        if (sheet != null)
        {
            IRow fistRow = sheet.GetRow(0);

            int cellCount = fistRow.LastCellNum; // 第一行最后一个cell

            int StartRow;

            
            if (IsFirstRowColum)
            {
                for (int i = fistRow.FirstCellNum; i < cellCount; i++)
                {
                    ICell cell = fistRow.GetCell(i);

                    // 列不为空
                    if (cell != null)
                    {
                        string cellValue = cell.StringCellValue;

                        if (cellValue != null)
                        {
                            DataColumn column = new DataColumn(cellValue);

                            dt.Columns.Add(column);
                        }
                    }
                }

                StartRow = sheet.FirstRowNum + 1;
            }
            else
            {
                StartRow = sheet.FirstRowNum;
            }

            int rowcount = sheet.LastRowNum; // 最后一列的行号


            for (int i = StartRow; i <= rowcount; i++)
            {
                IRow rows = sheet.GetRow(i);

                if (rows == null)
                {
                    continue; // 没有数据的行默认是null
                }

                DataRow dataRow = dt.NewRow();

                for (int j = rows.FirstCellNum; j < cellCount; j++)
                {
                    if (rows.GetCell(j) != null)
                    {
                        dataRow[j] = rows.GetCell(j).ToString();
                    }
                }
                dt.Rows.Add(dataRow);

            }
        }

        return dt;

    }
    catch (Exception err)
    {
        return null;
    }


}

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#导入Excel有多种方法。其中一种方法是使用MyXls库。首先,你需要获取Excel文件的路径,然后使用XlsDocument类加载Excel文件。接下来,你可以使用Worksheet类来读取Excel中的指定工作页,并通过循环每一行来获取数据。最后,你可以将获取到的数据写入到数据库中。123 #### 引用[.reference_title] - *1* [C# 导入Excel文件数据的几种方法](https://blog.csdn.net/mojocube/article/details/104532469)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *2* [C#各种导入Excel文件的数据的方法总结](https://blog.csdn.net/qq_43857510/article/details/103693790)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *3* [C# Excel 导入两种方式](https://blog.csdn.net/NAN_ana/article/details/98314465)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值