C# NPOI导入Excel

需要用NPOI导入EXCEL到数据库,但是一个sheet里的每一行有两个表的内容,请问要怎么处理,表不能改动

img

循环插入数据库的时候,每一行分为左右2次插入即可

引用chatgpt内容作答:
使用 NPOI 将一个 Excel 文件中的数据导入到数据库中,特别是当一个 sheet 中的每一行包含两个表的内容时,可以按照以下步骤进行处理。在这个过程中,我将假设你已经熟悉如何使用 NPOI 操作 Excel 和数据库连接的基本知识。

假设 Excel 中的数据结构如下:

img


数据库中有两个表,分别是 Table1 和 Table2,它们的结构和 Excel 中的数据对应。

以下是大致的处理步骤:

1、读取 Excel 数据: 使用 NPOI 读取 Excel 文件中的数据,遍历每一行,同时读取表1和表2的数据。

2、连接数据库: 使用合适的数据库连接库(如 ADO.NET)建立与数据库的连接。

3、插入数据: 将从 Excel 中读取的数据分别插入到表1和表2中。可以使用 SQL 语句或者 ORM(对象关系映射)框架,根据读取的数据构建插入语句或调用 ORM 方法。

下面是一个简单的伪代码示例,演示如何实现上述步骤:

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.Data.SqlClient;

// 读取 Excel 数据
using (FileStream fileStream = new FileStream("path/to/excel.xlsx", FileMode.Open, FileAccess.Read))
{
    IWorkbook workbook = new XSSFWorkbook(fileStream);
    ISheet sheet = workbook.GetSheetAt(0);

    foreach (IRow row in sheet)
    {
        // 假设每行的数据按照顺序分别为 表1字段1、表1字段2、表2字段1、表2字段2
        string table1Field1 = row.GetCell(0).ToString();
        string table1Field2 = row.GetCell(1).ToString();
        string table2Field1 = row.GetCell(2).ToString();
        string table2Field2 = row.GetCell(3).ToString();

        // 连接数据库
        using (SqlConnection connection = new SqlConnection("your_connection_string"))
        {
            connection.Open();

            // 插入数据到 Table1
            string insertTable1Query = $"INSERT INTO Table1 (Field1, Field2) VALUES ('{table1Field1}', '{table1Field2}')";
            using (SqlCommand command = new SqlCommand(insertTable1Query, connection))
            {
                command.ExecuteNonQuery();
            }

            // 插入数据到 Table2
            string insertTable2Query = $"INSERT INTO Table2 (Field1, Field2) VALUES ('{table2Field1}', '{table2Field2}')";
            using (SqlCommand command = new SqlCommand(insertTable2Query, connection))
            {
                command.ExecuteNonQuery();
            }
        }
    }
}

上述示例中使用了简单的字符串插值来构建 SQL 查询语句,但这存在 SQL 注入的风险。在实际应用中,应该使用参数化查询或 ORM 框架来更安全地插入数据。

另外,为了提高性能,可以考虑使用批量插入的方法,而不是逐行插入。这样可以减少与数据库的交互次数,从而提高导入速度。

两个表结构不是一样的吗?为啥还分两个表?
可以像楼上说的循环分两次插入。或者数据库里建一个大表,把Excel数据导进去以后,再在数据库中将数据分别插入原来的两张表中。

为每个表创建一个实体类,然后使用NPOI读取Excel中的数据,转换为实体类的集合,然后遍历实体类的集合,根据一定的规则或条件,将每一行的数据分别插入到对应的表中,如果两个表之间有关联关系,可以在插入数据时返回主键值,然后作为外键值插入到另一个表中。

在使用 NPOI 导入 Excel 数据到数据库时,如果一个 sheet 里的每一行包含两个表的内容,您可以按照以下步骤处理:

  1. 读取 Excel 文件:
    使用 NPOI 读取 Excel 文件,遍历每一行,获取每一行的单元格数据。

  2. 按行解析数据:
    对于每一行数据,您需要判断数据属于哪个表,并将数据解析成对应的实体对象。

  3. 分别插入到不同表:
    将解析出来的数据插入到相应的数据库表中。

下面是一个示例代码,假设您有两个表,分别是 Table1Table2,并且您已经定义了对应的实体类 Table1EntityTable2Entity

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.IO;
using System.Data.SqlClient;

// 读取 Excel 文件
using (FileStream fs = new FileStream("your_file_path.xlsx", FileMode.Open, FileAccess.Read))
{
    IWorkbook workbook = new XSSFWorkbook(fs);
    ISheet sheet = workbook.GetSheetAt(0); // 假设第一个 sheet

    // 遍历每一行
    for (int rowIndex = 1; rowIndex <= sheet.LastRowNum; rowIndex++)
    {
        IRow row = sheet.GetRow(rowIndex);

        // 解析第一个表的数据
        Table1Entity table1Data = new Table1Entity();
        table1Data.Field1 = row.GetCell(0).StringCellValue;
        table1Data.Field2 = row.GetCell(1).StringCellValue;

        // 解析第二个表的数据
        Table2Entity table2Data = new Table2Entity();
        table2Data.Field1 = row.GetCell(2).StringCellValue;
        table2Data.Field2 = row.GetCell(3).StringCellValue;

        // 将数据插入到数据库
        using (SqlConnection connection = new SqlConnection("your_connection_string"))
        {
            connection.Open();

            // 插入第一个表数据
            SqlCommand cmd1 = new SqlCommand("INSERT INTO Table1 (Field1, Field2) VALUES (@Field1, @Field2)", connection);
            cmd1.Parameters.AddWithValue("@Field1", table1Data.Field1);
            cmd1.Parameters.AddWithValue("@Field2", table1Data.Field2);
            cmd1.ExecuteNonQuery();

            // 插入第二个表数据
            SqlCommand cmd2 = new SqlCommand("INSERT INTO Table2 (Field1, Field2) VALUES (@Field1, @Field2)", connection);
            cmd2.Parameters.AddWithValue("@Field1", table2Data.Field1);
            cmd2.Parameters.AddWithValue("@Field2", table2Data.Field2);
            cmd2.ExecuteNonQuery();
        }
    }
}

请注意,上述代码是一个简化的示例,您需要根据实际情况进行调整。其中,your_file_path.xlsx 是您的 Excel 文件路径,your_connection_string 是数据库连接字符串。您还需要根据实际情况修改表名、字段名以及实体类定义。

这个简单。我写个解决方案打包发给你。