当前位置: 首页 > news >正文

.NET用C#导入Excel数据到数据库

将Excel文件中的数据导入到数据库中不仅能够提升数据处理的效率和准确性,还能极大地促进数据分析和决策制定的过程。尤其在企业级应用中,Excel作为数据输入和初步整理的工具非常普遍,但其功能对于复杂查询、大规模数据管理和跨部门的数据共享来说有所局限。通过使用C#在.NET平台上实现这一过程,可以充分利用其强大的数据操作能力和丰富的库支持,确保数据从Excel无缝迁移到诸如SQLite等关系型数据库中,从而实现更高效的数据管理、增强的数据安全性和更好的性能优化,同时为后续的数据挖掘和商业智能分析打下坚实的基础。
本文将介绍如何在.NET平台使用C#导入Excel文件数据到数据库中

文章目录

    • 导入Excel数据到SQLite数据库
    • 导入Excel数据到SQLite数据库

本文所使用的方法需要用到免费的Free Spire.XLS for .NET,NuGet:PM> Install-Package FreeSpire.XLS,以及System.Data.SQLite,NuGet:PM> Install-Package System.Data.SQLite

导入Excel数据到SQLite数据库

我们可以使用Free Spire.XLS for .NET中的Workbook.LoadFromFile方法载入Excel文件,然后使用CellRange.Value读取单元格的数据,并搭配System.Data.SQLite模块将数据写入到SQLite数据库中。以下是操作步骤示例:
以下是将提供的C#代码转换为操作步骤的介绍:

  1. 设置SQLite数据库文件路径为Sample.db,并指定Excel输出文件路径为output/DatabaseToExcel.xlsx
  2. 创建一个新的Workbook实例以表示Excel工作簿,并清除默认的工作表。
  3. 使用SQLiteConnection创建一个到SQLite数据库的新连接,并打开这个连接。
  4. 通过调用GetSchema("Tables")从数据库获取所有表的名字,并存储在一个DataTable对象中。
  5. 遍历每个表名:
    • 对于每个表,添加一个新的工作表到工作簿中,工作表名称设为当前表名。
  6. 构建SQL查询语句以选择表中的所有数据,并使用SQLiteCommand执行此查询。
  7. 使用SQLiteDataReader读取查询结果,并进行以下操作:
    • 获取列名并将它们写入新工作表的第一行。
    • 设置第一行(即标题行)的字体样式为粗体,字号为12。
  8. 继续遍历数据行,并对每一行执行以下操作:
    • 将每一行的数据值写入相应的单元格中。
    • 自动调整每列的宽度以适应内容。
    • 设置数据行的字体大小为11。
  9. 关闭与SQLite数据库的连接。
  10. 保存生成的工作簿到之前定义的Excel文件路径,并释放workbook对象使用的资源。

代码示例:

using System.Data.SQLite;
using Spire.Xls;namespace ExcelToSQLite
{class Program{static void Main(string[] args){// Excel 文件路径string excelFilePath = "G:/Documents/Sample37.xlsx";// SQLite 数据库路径string sqliteFilePath = "output/Database.db";// 打开 Excel 文件Workbook workbook = new Workbook();workbook.LoadFromFile(excelFilePath);// 如果数据库文件不存在,则创建它if (!File.Exists(sqliteFilePath)){SQLiteConnection.CreateFile(sqliteFilePath);Console.WriteLine("已创建新的 SQLite 数据库文件:output.db");}// 创建 SQLite 连接using (SQLiteConnection connection = new SQLiteConnection($"Data Source={sqliteFilePath};Version=3;")){connection.Open();// 遍历每个工作表foreach (Worksheet sheet in workbook.Worksheets){string tableName = sheet.Name;// 获取第一行作为列名var columns = sheet.Rows[0].CellList;string createTableQuery = $"CREATE TABLE IF NOT EXISTS [{tableName}] (";foreach (var column in columns){createTableQuery += $"[{column.Value}] TEXT,";}createTableQuery = createTableQuery.TrimEnd(',') + ");";// 创建表using (SQLiteCommand createTableCommand = new SQLiteCommand(createTableQuery, connection)){createTableCommand.ExecuteNonQuery();}// 插入数据for (int i = 1; i < sheet.Rows.Length; i++) // 跳过第一行{var row = sheet.Rows[i];string insertQuery = $"INSERT INTO [{tableName}] VALUES (";foreach (var cell in row.CellList){insertQuery += $"'{cell.Value?.Replace("'", "''")}',"; // 防止 SQL 注入}insertQuery = insertQuery.TrimEnd(',') + ");";using (SQLiteCommand insertCommand = new SQLiteCommand(insertQuery, connection)){insertCommand.ExecuteNonQuery();}}}connection.Close();workbook.Dispose();}Console.WriteLine("Excel 数据已成功写入新的 SQLite 数据库!");}}
}

结果
C#导入Excel到SQLite数据库

导入Excel数据到SQLite数据库

写入到Access数据库则需要用到System.Data.OleDb模块,以下是操作步骤示例:
以下是将提供的C#代码转换为操作步骤的介绍:

  1. 设置Excel文件路径为Sample.xlsx,并指定Access数据库文件路径为output/Database.accdb
  2. 使用Workbook类打开指定路径的Excel文件,并加载该文件到内存中。
  3. 创建一个用于连接Access数据库的OleDb连接字符串。
  4. 检查Access数据库文件是否存在。如果不存在,则提示用户首先创建Access数据库文件,并终止程序执行。
  5. 创建一个新的OleDb连接对象,并打开与Access数据库的连接。
  6. 遍历Excel工作簿中的每个工作表:
    • 获取当前工作表的名称,并将其作为新表的名称。
  7. 从工作表的第一行获取列名,并构建创建新表的SQL语句,假定所有列的数据类型均为文本类型(TEXT)。
  8. 尝试执行以下操作,对于每个工作表:
    • 使用构建的CREATE TABLE SQL语句创建新的表。
  9. 对于每个工作表中的每一行数据(跳过第一行,因为它包含列名):
    • 构建INSERT INTO SQL语句以插入数据行,同时处理可能的SQL注入问题,例如通过转义单引号。
  10. 执行构建的INSERT INTO命令,将一行数据插入到对应的Access表中。
  11. 如果在处理某个工作表时发生错误,捕获异常并打印错误信息,继续处理下一个工作表。
  12. 关闭与Access数据库的连接,并释放workbook对象使用的资源。

代码示例:

using System.Data.OleDb;
using Spire.Xls;namespace ExcelToAccess
{class Program{static void Main(string[] args){// Excel 文件路径string excelFilePath = "G:/Documents/Sample37.xlsx";// Access 数据库路径string accessDbPath = "output/Database.accdb";// 打开 Excel 文件Workbook workbook = new Workbook();workbook.LoadFromFile(excelFilePath);// 为 Access 创建 OleDb 连接字符串string connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={accessDbPath};Persist Security Info=False;";// 如果数据库文件不存在,提示创建 - 注意:此步骤通常在代码外部完成if (!System.IO.File.Exists(accessDbPath)){Console.WriteLine("请先创建一个 Access 数据库文件。");return;}// 创建 OleDb 连接using (OleDbConnection connection = new OleDbConnection(connectionString)){connection.Open();// 遍历每个工作表foreach (Worksheet sheet in workbook.Worksheets){string tableName = sheet.Name;// 获取第一行作为列名var columns = sheet.Rows[0].CellList;string createTableQuery = $"CREATE TABLE [{tableName}] (";foreach (var column in columns){createTableQuery += $"[{column.Value}] TEXT,"; // 假设所有列都是文本类型}createTableQuery = createTableQuery.TrimEnd(',') + ");";try{// 创建表using (OleDbCommand createTableCommand = new OleDbCommand(createTableQuery, connection)){createTableCommand.ExecuteNonQuery();}// 插入数据for (int i = 1; i < sheet.Rows.Length; i++) // 跳过第一行{var row = sheet.Rows[i];string insertQuery = $"INSERT INTO [{tableName}] VALUES (";foreach (var cell in row.CellList){insertQuery += $"'{cell.Value?.Replace("'", "''")}',"; // 防止 SQL 注入}insertQuery = insertQuery.TrimEnd(',') + ");";using (OleDbCommand insertCommand = new OleDbCommand(insertQuery, connection)){insertCommand.ExecuteNonQuery();}}}catch (Exception ex){Console.WriteLine($"处理工作表 {sheet.Name} 时发生错误:{ex.Message}");}}connection.Close();workbook.Dispose();}Console.WriteLine("Excel 数据已成功写入新的 Access 数据库!");}}
}

结果
C#将Excel数据导入Access数据库

本文介绍如何在.NET平台使用C#导入Excel数据到数据库中。

相关文章:

.NET用C#导入Excel数据到数据库

将Excel文件中的数据导入到数据库中不仅能够提升数据处理的效率和准确性&#xff0c;还能极大地促进数据分析和决策制定的过程。尤其在企业级应用中&#xff0c;Excel作为数据输入和初步整理的工具非常普遍&#xff0c;但其功能对于复杂查询、大规模数据管理和跨部门的数据共享…...

小身躯大能量-供热系统通过EtherCAT转Profinet网关进行升级

在现代工业自动化领域&#xff0c;通信技术的进步对于提高系统效率、稳定性和可靠性起着至关重要的作用。EtherCAT&#xff08;Ethernet for Control Automation Technology&#xff09;作为一种实时以太网解决方案&#xff0c;因其高性能及成本效益高等特点&#xff0c;在众多…...

Android11.0系统关闭App所有通知

通过广播接收方式&#xff0c;根据包名关闭App所有通知。 packages/apps/Settings$ git diff diff --git a/AndroidManifest.xml b/AndroidManifest.xml index d4c54c6ed8..1ce7d4136f 100644 --- a/AndroidManifest.xmlb/AndroidManifest.xml-106,6 106,7 <uses-permissio…...

# issue 8 TCP内部原理和UDP编程

TCP 通信三大步骤&#xff1a; 1 三次握手建立连接; 2 开始通信&#xff0c;进行数据交换; 3 四次挥手断开连接&#xff1b; 一、TCP内部原理--三次握手 【第一次握手】套接字A∶"你好&#xff0c;套接字B。我这儿有数据要传给你&#xff0c;建立连接吧。" 【第二次…...

力扣100题--移动零

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […...

Spring 邮件发送

Spring 邮件发送 1. 主要内容&#xff08;了解&#xff09; 2. JavaMail 概述&#xff08;了解&#xff09; JavaMail&#xff0c;顾名思义&#xff0c;提供给开发者处理电⼦邮件相关的编程接⼝。JavaMail 是由 Sun 定义的⼀套收发电⼦邮件的 API&#xff0c;它可以⽅便地执⾏⼀…...

利用 360 安全卫士极速版关闭电脑开机自启动软件教程

在使用电脑的过程中&#xff0c;过多的开机自启动软件会严重拖慢电脑的开机速度&#xff0c;影响我们的使用体验。本教程中简鹿办公将详细介绍如何使用 360 安全卫士极速版关闭电脑开机自启动软件&#xff0c;让您的电脑开机更加迅速流畅。 一、打开 360 安全卫士极速版 在电…...

楼房销售系统

文末获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;楼房销售系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xf…...

UML箭线图的理解和实践

在软件开发的世界里&#xff0c;UML&#xff08;统一建模语言&#xff09;作为一种标准化的建模语言&#xff0c;扮演着举足轻重的角色。UML类图更是软件开发设计和架构过程中的核心工具&#xff0c;它不仅能帮助开发者明确系统中的类及其关系&#xff0c;还能为后续的代码实现…...

Qt入门8——Qt文件

1. Qt文件概述 文件操作是应用程序必不可少的部分。Qt作为⼀个通用开发库&#xff0c;提供了跨平台的文件操作能力。Qt 提供了很多关于文件的类&#xff0c;通过这些类能够对文件系统进行操作&#xff0c;如文件读写、文件信息获取、文件复制或重命名等。 2. 输入输出设备类 在…...

鸿翼受邀出席2024海峡两岸档案暨缩微学术交流会

近日&#xff0c;由中国档案学会、中国文献影像技术协会共同主办&#xff0c;中华档案暨资讯微缩管理学会参加的2024年海峡两岸档案暨缩微学术交流会在乌鲁木齐召开。鸿翼联合创始人兼CTO罗永秀受邀出席本次交流会并作主题分享。 自1992年以来&#xff0c;该学术交流会已连续举…...

支持win7系统的onnxruntime

在win7 X86系统上&#xff0c;使用了onnxruntime.dll库做AI识别&#xff0c;但是在win7上运行报0xc0000005的错误 经查&#xff0c;ONNX Runtime从v1.15.0版本开始不再支持Windows 7及其之前的操作系统&#xff0c;即便尝试重新编译源代码亦无法在这些老系统上运行&#xff0c;…...

如何利用内链策略提升网站的整体权重?

内链是谷歌SEO中常常被低估的部分&#xff0c;实际上&#xff0c;合理的内链策略不仅能帮助提升页面间的关联性&#xff0c;还可以增强网站的整体权重。通过正确的内链布局&#xff0c;用户可以更流畅地浏览你的网站&#xff0c;谷歌爬虫也能更快地抓取到更多页面&#xff0c;有…...

鸿蒙分享(二):引入zrouter路由跳转+封装

码仓库&#xff1a;https://gitee.com/linguanzhong/share_harmonyos 鸿蒙api:12 鸿蒙第三方库地址&#xff1a;OpenHarmony三方库中心仓 zrouter地址&#xff1a;OpenHarmony三方库中心仓 1.引入zrouter 1.打开终端界面&#xff1a;输入 ohpm install hzw/zrouter 2.在项目…...

【计算机网络】实验11:边界网关协议BGP

实验11 边界网关协议BGP 一、实验目的 本次实验旨在验证边界网关协议&#xff08;BGP&#xff09;的实际作用&#xff0c;并深入学习在路由器上配置和使用BGP协议的方法。通过实验&#xff0c;我将探索BGP在不同自治系统之间的路由选择和信息交换的功能&#xff0c;理解其在互…...

leetcode 1853 转换日期格式(postgresql)

需求 表: Days ----------------- | Column Name | Type | ----------------- | day | date | ----------------- day 是这个表的主键。 给定一个Days表&#xff0c;请你编写SQL查询语句&#xff0c;将Days表中的每一个日期转化为"day_name, month_name day, year"…...

掌握时间,从`datetime`开始

文章目录 掌握时间&#xff0c;从datetime开始第一部分&#xff1a;背景介绍第二部分&#xff1a;datetime库是什么&#xff1f;第三部分&#xff1a;如何安装这个库&#xff1f;第四部分&#xff1a;简单库函数使用方法1. 获取当前日期和时间2. 创建特定的日期3. 计算两个日期…...

剖析千益畅行,共享旅游-卡,合规运营与技术赋能双驱下的旅游新篇

在数字化浪潮席卷各行各业的当下&#xff0c;旅游产业与共享经济模式深度融合&#xff0c;催生出旅游卡这类新兴产品。然而&#xff0c;市场乱象丛生&#xff0c;诸多打着 “共享” 幌子的旅游卡弊病百出&#xff0c;让从业者与消费者都深陷困扰。今天&#xff0c;咱们聚焦技术…...

集合框架(2)List

Collection的子接口&#xff1a;List、Set 1、List接口 鉴于Java中数组用来存储数据的局限性&#xff0c;我们通常使用java.util.List替代数组List集合类中元素有序、且可重复&#xff0c;集合中的每个元素都有其对应的顺序索引。JDK API中List接口的实现类常用的有&#xff…...

【子查询】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...