.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数据到数据库中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/63192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中数组怎么转换为字符串

1、数组转字符串 #方法1 arr [a,b] str1 .join(arr)#方法2 arr [1,2,3] #str .join(str(i) for i in arr)#此处str命名与str函数冲突&#xff01; str2 .join(str(i) for i in arr) 2、字符串转数组 #方法一 str_x avfg st_list list(str_x) #使用list()#方法二 list_s…

国内管理咨询公司哪家落地辅导做的好?

在当今快速变化的市场环境中&#xff0c;企业面临着前所未有的竞争压力与转型挑战。为了在这场没有硝烟的战争中脱颖而出&#xff0c;许多企业开始寻求外部专业力量的帮助&#xff0c;以期通过科学的管理咨询实现战略升级和业绩突破。而在众多的管理咨询公司中&#xff0c;思博…

前端进阶指南:详解 Source Map 的作用与工作原理,解析.map文件

前言 在前端开发中&#xff0c;代码的压缩与混淆是提升网页性能的常见做法。然而&#xff0c;这种优化措施也带来了调试难度的增加&#xff0c;因为压缩后的代码往往难以阅读和理解。这时&#xff0c;Source Map 技术应运而生&#xff0c;作为连接源代码和构建后代码的桥梁&am…

Cursor vs VSCode:主要区别与优势分析

Cursor - The AI Code Editor 1. AI 集成能力 Cursor的优势 原生AI集成&#xff1a; # Cursor可以直接通过快捷键调用AI # 例如&#xff1a;按下 Ctrl K 可以直接获取代码建议 def complex_function():# 在这里&#xff0c;你可以直接询问AI如何实现功能# AI会直接在编辑器中…

python+selenium的八大定位方式

1.id定位 元素的id属 driver.find_element_by_id(By.ID,"username")2.name定位 driver.find_element_by_id(By.NAME,"username")#一个login_btn_list webdriver.find_elements(By.CLASS_NAME,)#多个元素组成的列表&#xff0c; login_btn_list[1].click…

RTCMultiConnection 跨域问题解决

js套件地址 https://github.com/muaz-khan/RTCMultiConnection server套件地址 https://github.com/muaz-khan/RTCMultiConnection-Server 要解决的就是server代码的跨域问题 原装写法&#xff1a; 解决写法&#xff1a; // 喜欢组合语法的自己组 const io new ioServer.S…

【JavaEE】多线程(6)

一、用户态与内核态 【概念】 用户态是指用户程序运行时的状态&#xff0c;在这种状态下&#xff0c;CPU只能执行用户态下的指令&#xff0c;并且只能访问受限的内存空间 内核态是操作系统内核运行时的状态&#xff0c;内核是计算机系统的核心部分&#xff0c;CPU可以执行所有…

Ajax:回忆与节点

一点回忆 面对我的Ajax学习&#xff0c;实现前后端交互&#xff0c;最开始我采用的使用网络寻找intellij IDEA Ultimate破解方法&#xff0c;然后最终成功&#xff0c;然后按照相关教程配置java ee项目&#xff0c;然后中间又去配置了Tomcat服务器&#xff0c;然后又去学习了一…

1688:开启跨境电商新篇章

引言 在全球化贸易不断深化的今天&#xff0c;跨境电商已成为中小企业拓展国际市场的重要渠道。1688&#xff0c;作为阿里巴巴集团旗下领先的内贸平台&#xff0c;近年来也逐渐发力跨境电商领域&#xff0c;为全球买家提供了一个直通中国工厂的贸易平台。本文将带您深入了解16…

2024-12-06 Unity Addressables3——资源加载

文章目录 1 引用加载1.1 Addressables 的资源引用类1.2 加载资源1.3 加载场景1.4 释放资源 2 Label 介绍3 动态加载3.1 加载单个资源3.2 加载多个资源 Unity 版本&#xff1a;6000.0.26f1c1Addressables 版本&#xff1a;2.3.1 1 引用加载 1.1 Addressables 的资源引用类 Ass…

API设计指南:详解HTTP状态码错误解析、HTTP方法及参数命名规则

目录 1、HTTP API规范1.1 原则1.2 协议1.3 版本1.4 路径1.5 HTTP 方法&#xff08;Method&#xff09;1.6 过滤信息1.7 参数命名1.8 HTTP 状态码&#xff08;Response Code&#xff09;1.9 鉴权 2、状态码2.1 API返回基础规范2.2 常见的 HTTP 状态码2.3 API错误信息应该放到响应…

【C#】键值对的一种常见数据结构Dictionary<TKey, TValue>

在 C# 中&#xff0c;Dictionary<TKey, TValue> 是一个 键值对&#xff08;key-value&#xff09;集合&#xff0c;是一种非常常见的数据结构。它允许通过 键&#xff08;key&#xff09;来快速查找与之相关的 值&#xff08;value&#xff09;。你可以将其类比为一个映射…

Word处理表格的一些宏

目录 1、表格首行居中2、表格内容靠左上下居中&#xff08;排除首行&#xff09; 1、表格首行居中 说明&#xff1a; 遇到错误将进行捕获&#xff0c;然后继续处理下一个表格 宏&#xff1a; Sub 表格首行居中()Dim tbl As tableOn Error Resume Next 错误时继续执行下一个…

相机动态/在线标定

图1 图2 基本原理 【原理1】平行线在射影变换后会交于一点。如图所示,A为相机光心,蓝色矩形框为归一化平面,O为平面中心。地面四条黄色直线为平行且等距的车道线。HI交其中两条车道线于H、I, 过G作HI的平行线GM交车道线于M。HI、GM在归一化平面上的投影分别为JK、PN,二者会…

嵌入式Linux(SOC带GPU树莓派)无窗口系统下搭建 OpenGL ES + Qt 开发环境,并绘制旋转金字塔

树莓派无窗口系统下搭建 OpenGL ES Qt 开发环境&#xff0c;并绘制旋转金字塔 1. 安装 OpenGL ES 开发环境 运行以下命令安装所需的 OpenGL ES 开发工具和库&#xff1a; sudo apt install cmake mesa-utils libegl1-mesa-dev libgles2-mesa-dev libdrm-dev libgbm-dev2. 安…

工作:SolidWorks从3D文件导出2D的DWG或DXF类型文件方法

工作&#xff1a;SolidWorks从3D文件导出2D的DWG或DXF类型文件方法 SolidWorks从3D文件导出2D的DWG或2D DXF类型文件方法&#xff08;一&#xff09;打开3D文件&#xff08;二&#xff09;从装配体到工程图&#xff08;三&#xff09;拖出想要的角度的图型&#xff08;四&#…

【AI系统】低比特量化原理

低比特量化原理 计算机里面数值有很多种表示方式&#xff0c;如浮点表示的 FP32、FP16&#xff0c;整数表示的 INT32、INT16、INT8&#xff0c;量化一般是将 FP32、FP16 降低为 INT8 甚至 INT4 等低比特表示。 模型量化则是一种将浮点值映射到低比特离散值的技术&#xff0c;可…

Spark区分应用程序 Application、作业Job、阶段Stage、任务Task

目录 一、Spark核心概念 1、应用程序Application 2、作业Job 3、阶段Stage 4、任务Task 二、示例 一、Spark核心概念 在Apache Spark中&#xff0c;有几个核心概念用于描述应用程序的执行流程和组件&#xff0c;包括应用程序 Application、作业Job、阶段Stage、任务Task…

《跨越平台壁垒:C++ 人工智能模型在移动设备的部署之路》

在人工智能技术如日中天的今天&#xff0c;C以其卓越的性能和高效的资源利用&#xff0c;在人工智能模型开发领域占据着举足轻重的地位。然而&#xff0c;如何将 C实现的人工智能模型成功部署到移动设备上&#xff0c;让智能应用触手可及&#xff0c;成为了众多开发者亟待攻克的…

《乌合之众》笔记

1.集体会降智&#xff0c;会互相传染 2.群体是无名氏&#xff0c;因此没必要承担责任。约束个人的责任感消失 3.有意识人格的消失&#xff0c;无意识人格的得势&#xff0c;思想和感情因为暗示和互相传染而转向一个共同的方向&#xff0c;以及立刻把暗示的观念转化为行动的倾…