当前位置:首页 > 行业动态 > 正文

如何在C中导入Excel表格数据库?

在c#中,可以使用 microsoft.office.interop.excel库来导入excel表格数据。

在C#中导入Excel表格数据到数据库,通常需要借助第三方库如EPPlus、NPOI或者Microsoft.Office.Interop.Excel,以下是一个使用EPPlus库的详细步骤:

如何在C中导入Excel表格数据库?  第1张

安装EPPlus库

你需要在你的项目中安装EPPlus库,你可以使用NuGet包管理器来安装它,打开你的NuGet包管理器控制台并运行以下命令:

Install-Package EPPlus

读取Excel文件

你需要编写代码来读取Excel文件,假设你有一个名为data.xlsx的Excel文件,其中包含一些数据。

using System;
using System.Data;
using System.IO;
using OfficeOpenXml;
namespace ExcelToDatabaseExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 设置Excel文件路径
            string filePath = @"pathtoyourdata.xlsx";
            // 创建一个新的Excel包对象
            FileInfo fileInfo = new FileInfo(filePath);
            using (ExcelPackage package = new ExcelPackage(fileInfo))
            {
                // 获取工作表
                ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; // 假设我们读取第一个工作表
                // 将工作表数据读取到DataTable中
                DataTable dataTable = new DataTable();
                bool hasHeader = true; // 根据你的Excel文件实际情况设置
                var startCell = worksheet.Dimension.Start;
                var endCell = worksheet.Dimension.End;
                for (int row = startCell.Row; row <= endCell.Row; row++)
                {
                    var wsRow = worksheet.Cells[row, startCell.Column, row, endCell.Column];
                    if (hasHeader)
                    {
                        foreach (var cell in wsRow)
                        {
                            dataTable.Columns.Add(cell.Text);
                        }
                        hasHeader = false;
                    }
                    else
                    {
                        var rowData = worksheet.Cells[row, startCell.Column, row, endCell.Column].Value;
                        dataTable.Rows.Add(rowData);
                    }
                }
            }
        }
    }
}

连接数据库并插入数据

读取Excel数据后,你需要连接到目标数据库并将数据插入到相应的表中,这里以SQL Server为例:

using System;
using System.Data;
using System.Data.SqlClient;
using OfficeOpenXml;
namespace ExcelToDatabaseExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 读取Excel数据(同上)
            DataTable dataTable = ReadExcelData(@"pathtoyourdata.xlsx");
            // 数据库连接字符串
            string connectionString = "your_connection_string_here";
            string tableName = "YourTargetTable";
            // 插入数据到数据库
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
                {
                    bulkCopy.DestinationTableName = tableName; // 目标表名
                    try
                    {
                        bulkCopy.WriteToServer(dataTable);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Error inserting data into Database: ", ex.Message);
                    }
                }
            }
        }
        static DataTable ReadExcelData(string filePath)
        {
            FileInfo fileInfo = new FileInfo(filePath);
            using (ExcelPackage package = new ExcelPackage(fileInfo))
            {
                ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; // 假设我们读取第一个工作表
                DataTable dataTable = new DataTable();
                bool hasHeader = true; // 根据你的Excel文件实际情况设置
                var startCell = worksheet.Dimension.Start;
                var endCell = worksheet.Dimension.End;
                for (int row = startCell.Row; row <= endCell.Row; row++)
                {
                    var wsRow = worksheet.Cells[row, startCell.Column, row, endCell.Column];
                    if (hasHeader)
                    {
                        foreach (var cell in wsRow)
                        {
                            dataTable.Columns.Add(cell.Text);
                        }
                        hasHeader = false;
                    }
                    else
                    {
                        var rowData = worksheet.Cells[row, startCell.Column, row, endCell.Column].Value;
                        dataTable.Rows.Add(rowData);
                    }
                }
                return dataTable;
            }
        }
    }
}

相关问答FAQs

Q1: 如果Excel文件中有多个工作表,如何处理?

A1: 你可以通过遍历所有工作表来处理多个工作表的数据,修改读取Excel数据的函数如下:

static DataTable ReadExcelData(string filePath)
{
    FileInfo fileInfo = new FileInfo(filePath);
    using (ExcelPackage package = new ExcelPackage(fileInfo))
    {
        foreach (var worksheet in package.Workbook.Worksheets)
        {
            DataTable dataTable = new DataTable(worksheet.Name); // 使用工作表名称作为DataTable的名称
            bool hasHeader = true; // 根据你的Excel文件实际情况设置
            var startCell = worksheet.Dimension.Start;
            var endCell = worksheet.Dimension.End;
            for (int row = startCell.Row; row <= endCell.Row; row++)
            {
                var wsRow = worksheet.Cells[row, startCell.Column, row, endCell.Column];
                if (hasHeader)
                {
                    foreach (var cell in wsRow)
                    {
                        dataTable.Columns.Add(cell.Text);
                    }
                    hasHeader = false;
                }
                else
                {
                    var rowData = worksheet.Cells[row, startCell.Column, row, endCell.Column].Value;
                    dataTable.Rows.Add(rowData);
                }
            }
            return dataTable; // 返回每个工作表的数据表
        }
    }
    return null; // 如果没有工作表则返回null
}

Q2: 如果Excel文件中的列名与数据库表中的列名不一致,如何处理?

A2: 你可以在读取Excel数据时进行列名映射,你可以创建一个字典来存储Excel列名和数据库列名之间的映射关系,然后在插入数据前进行列名转换,以下是示例代码:

static DataTable MapColumns(DataTable sourceTable, targetColumnMapping)
{
    DataTable mappedTable = new DataTable();
    foreach (DataColumn column in targetColumnMapping.Keys)
    {
        mappedTable.Columns.Add(column.ToString(), typeof(string)); // 根据实际类型设置列类型
    }
    foreach (DataRow row in sourceTable.Rows)
    {
        DataRow newRow = mappedTable.NewRow();
        foreach (DataColumn targetColumn in targetColumnMapping.Values)
        {
            newRow[targetColumn] = row[targetColumnMapping[targetColumn]];
        }
        mappedTable.Rows.Add(newRow);
    }
    return mappedTable;
}

在使用这个函数之前,你需要定义一个字典来存储列名映射关系:

Dictionary<string, string> columnMapping = new Dictionary<string, string>()
{
    { "ExcelColumn1", "DatabaseColumn1" },
    { "ExcelColumn2", "DatabaseColumn2" },
    // 添加更多映射关系...
};
0