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

excel数据导入到数据库的方法

背景:最近在做和HW对接的某项目,需要将第三方接口提供的数据进行展示;在对方提供了详细的excel后,觉得也挺简单的就是将excel数据导入到数据库中。

方案一:

普通的初学者肯定会想,那我读取excel数据,一行一行的读,然后插入到数据库中进行存储,然而这样利用事务进行存储本身也没有问题;但是数据库如果涉及不规范,某列数据的数据类型(长度不够后),就会导致整个执行过程进行回滚;效率也不是很高。

excel数据存放到table中代码: 

DataTable dt = new DataTable();

                IWorkbook workbook; 
                string fileExt = Path.GetExtension(path).ToLower(); 
                using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))

                {
                    if (fileExt == ".xlsx") 
                    {
                        workbook = new XSSFWorkbook(fs);
                    }
                    else if (fileExt == ".xls")
                    { 
                        workbook = new HSSFWorkbook(fs); 
                    } 
                    else 
                    { 
                        workbook = null;
                    }
                    if (workbook == null) return;

                    ISheet sheet = workbook.GetSheetAt(0);//表头

                    IRow header = sheet.GetRow(sheet.FirstRowNum);

                    List<int> columns = new List<int>(); 
                    for (int i = 0; i < header.LastCellNum; i++)
                    {
                        object obj = GetValueType(header.GetCell(i));
                        if (obj == null || obj.ToString() == string.Empty)

                        {

                            dt.Columns.Add(new DataColumn("Columns" + i.ToString()));

                        }
                        else dt.Columns.Add(new DataColumn(obj.ToString()));

                        columns.Add(i);

                    }//数据

                    for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)

                    {

                        DataRow dr = dt.NewRow(); bool hasValue = false; 
                        foreach (int j in columns)

                        {

                            dr[j] = GetValueType(sheet.GetRow(i).GetCell(j)); if (dr[j] != null && dr[j].ToString() != string.Empty)

                            {

                                hasValue = true;

                            }

                        }
                        if (hasValue)
                        {

                            dt.Rows.Add(dr);
                        }

                    }

                }
遍历table数据到数据库

string connectstring = "";//数据库连接字符串
                SqlConnection conn = new SqlConnection(connectstring); //数据库连接
                conn.Open();                                                       
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    string sqlstr = "insert t_table (Column1,Column2,Column3,Column4,Column5) values ('" + dt.Rows[i][0].ToString()+"','" + dt.Rows[i][1].ToString() + "','"
                        + dt.Rows[i][2].ToString() + "','" + dt.Rows[i][3].ToString() + "','"+ dt.Rows[i][4].ToString() + "')";
                    SqlCommand com = new SqlCommand(sqlstr, conn);
                    if (com.ExecuteNonQuery() < 1)
                    {
                        Console.WriteLine("导入数据失败!");
                        System.Console.WriteLine("编码:"+dt.Rows[i][0].ToString()+"导入失败!");
                    }
                    System.Console.WriteLine("编码:" + dt.Rows[i][0].ToString() + "导入成功!");
                } 

其中 t_table为数据库中表名称,Column1~Column5为数据库中字段名称.

方案二:

比较高效的做法是利用office自带的功能OLEDB结合OPENROWSET导入数据;具体代码如下:

string connectstring = "";//数据库连接字符串
                SqlConnection conn = new SqlConnection(connectstring); //数据库连接   
                conn.Open();
                string sqlstr = @"insert into t_HWPromptMsg select 编码, 提示, 场景,提示信息,备注 from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;DATABASE="+ path + "',sheet1$)";
                SqlCommand cmd = new SqlCommand(sqlstr, conn);
                cmd.ExecuteNonQuery();
                conn.Close(); 

注意事项:在利用 OPENROWSET时需要打开SQL Server的Ad Hoc Distributed Queries组件,否则会报:报错内容是:SQL  Server 阻止了对组件 'Ad Hoc Distributed Queries' 的  STATEMENT'OpenRowset/OpenDatasource'  的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'Ad Hoc  Distributed Queries'。有关启用 'Ad Hoc Distributed Queries' 的详细信息,请参阅 SQL  Server 联机丛书中的 "外围应用配置器"。

具体执行步骤:

1.开启Ad Hoc Distributed Queries组件,在sql查询编辑器中执行如下语句:

exec sp_configure 'show advanced options',1
reconfigure
exec sp_configure 'Ad Hoc Distributed Queries',1
reconfigure

2.执行c#程序代码

3.关闭Ad Hoc Distributed Queries组件,在sql查询编辑器中执行如下语句:

exec sp_configure 'Ad Hoc Distributed Queries',0
reconfigure
exec sp_configure 'show advanced options',0
reconfigure

看到这了,如果您觉得我的文章对您有帮助,我强烈建议您,在能力所极时,给我发一元打赏买瓶水;您的支持将是我无线创作的动力。

相关文章:

excel数据导入到数据库的方法

背景&#xff1a;最近在做和HW对接的某项目&#xff0c;需要将第三方接口提供的数据进行展示&#xff1b;在对方提供了详细的excel后&#xff0c;觉得也挺简单的就是将excel数据导入到数据库中。 方案一&#xff1a; 普通的初学者肯定会想&#xff0c;那我读取excel数据&…...

Runaway Queries 管理:提升 TiDB 稳定性的智能引擎

在数字化系统扮演重要角色的今天&#xff0c;数据库稳定性成为企业关注的核心问题。对于重要计算机系统而言&#xff0c;突发的性能下降可能对业务造成不可估量的损失。为了稳定数据库性能&#xff0c;用户可以从管理流程入手规范变更的测试&#xff0c;或者利用产品手段减少预…...

K8S部署Java项目(Gitlab CI/CD自动化部署终极版)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

对Redis锁延期的一些讨论与思考

上一篇文章提到使用针对不同的业务场景如何合理使用Redis分布式锁&#xff0c;并引入了一个新的问题 若定义锁的过期时间是10s&#xff0c;此时A线程获取了锁然后执行业务代码&#xff0c;但是业务代码消耗时间花费了15s。这就会导致A线程还没有执行完业务代码&#xff0c;A线程…...

【高德地图】Android高德地图初始化定位并显示小蓝点

&#x1f4d6;第3章 初始化定位并显示小蓝点 ✅第1步&#xff1a;配置AndroidManifest.xml✅第2步&#xff1a;设置定位蓝点✅第3步&#xff1a;初始化定位✅完整代码 ✅第1步&#xff1a;配置AndroidManifest.xml 在application标签下声明Service组件 <service android:n…...

继电器测试中需要注意的安全事项有哪些?

继电器广泛应用于电气控制系统中的开关元件&#xff0c;其主要功能是在输入信号的控制下实现输出电路的断开或闭合。在继电器测试过程中&#xff0c;为了确保测试的准确性和安全性&#xff0c;需要遵循一定的安全事项。以下是在进行继电器测试时需要注意的安全事项&#xff1a;…...

Java向ES库中插入数据报错:I/O reactor status: STOPPED

Java向ES库中插入数据报错&#xff1a;java.lang.IllegalStateException: Request cannot be executed; I/O reactor status: STO 一、问题问题原因 二、解决思路 一、问题 在使用Java向ES库中插入数据时&#xff0c;第一次成功插入&#xff0c;第二次出现以下错误&#xff1a…...

vue3实现页面跳转

有需求是在vue项目中实现点击按钮完成页面跳转。这里不适用a标签&#xff0c;而是用vue自带的vue-router。 首先看一下项目结构 src │ App.vue │ main.js │ ├─router │ index.js │ └─views index.vue content.vue 可以看到&…...

【Linux运维系列】vim操作

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Centos服务器部署前后端项目

目录 准备工作1. 准备传输软件2. 连接服务器 部署Mysql1.下载Mysql(Linux版本)2. 解压3. 修改配置4. 启动服务另一种方法Docker 部署后端1. 在项目根目录中创建Dockerfile文件写入2. 启动 部署前端1. 在项目根目录中创建Dockerfile文件写入2. 启动 准备工作 1. 准备传输软件 …...

【初始RabbitMQ】延迟队列的实现

延迟队列概念 延迟队列中的元素是希望在指定时间到了之后或之前取出和处理消息&#xff0c;并且队列内部是有序的。简单来说&#xff0c;延时队列就是用来存放需要在指定时间被处理的元素的队列 延迟队列使用场景 延迟队列经常使用的场景有以下几点&#xff1a; 订单在十分…...

spark为什么比mapreduce快?

spark为什么比mapreduce快&#xff1f; 首先澄清几个误区&#xff1a; 1&#xff1a;两者都是基于内存计算的&#xff0c;任何计算框架都肯定是基于内存的&#xff0c;所以网上说的spark是基于内存计算所以快&#xff0c;显然是错误的 2;DAG计算模型减少的是磁盘I/O次数&…...

Unity通过XXpermission插件获取MANAGE_EXTERNAL_STORAGE权限

最近公司准备用Unity做一个安卓端的文件管理器功能&#xff0c;文件管理器已经做完了。刚开始的时候想要申请一下所有文件权限&#xff0c;发现在Unity里面申请所有文件权限(android.permission.MANAGE_EXTERNAL_STORAGE)相对来说比较麻烦。所以准备写一下文章记录一下如何申请…...

「连载」边缘计算(二十一)02-26:边缘部分源码(源码分析篇)

&#xff08;接上篇&#xff09; DeviceTwin struct组成剖析 该部分对DeviceTwin struct的组成进行剖析。接着devicetwin struct调用链剖析的实例化DeviceTwin struct&#xff08;dt : DeviceTwin{}&#xff09;往下剖析&#xff0c;进入DeviceTwin struct的定义&#xff0c;…...

Unity(第四部)新手组件

暴力解释就是官方给你的功能&#xff1b;作用的对象上面如&#xff1a; 创建一个球体&#xff0c;给这个球体加上重力 所有物体都是一个空物体&#xff0c;加上一些组件才形成了所需要的GameObject。 这是一个空物体&#xff0c;在Scene场景中没有任何外在表现&#xff0c;因为…...

【JS】【Vue3】【React】获取鼠标位置的方法:JavaScript、Vue 3和React示例

目录 使用JavaScript原生方法在Vue 3中获取鼠标位置在React中获取鼠标位置 随着Web应用程序的复杂性不断增加&#xff0c;获取用户交互信息变得越来越重要。其中&#xff0c;获取鼠标位置是一项常见的任务&#xff0c;可以用于实现各种交互效果&#xff0c;如拖拽、悬停提示等。…...

[Docker 教学] 常用的Docker 命令

Docker是一种流行的容器化技术。使用Docker可以将数据科学应用程序连同代码和所需的依赖关系打包成一个名为镜像的便携式工件。因此&#xff0c;Docker可以简化开发环境的复制&#xff0c;并使本地开发变得轻松。 以下是一些必备的Docker命令列表&#xff0c;这些命令将在你下一…...

小程序应用、页面、组件生命周期

引言 微信小程序生命周期是指在小程序运行过程中&#xff0c;不同阶段触发的一系列事件和函数。这一概念对于理解小程序的整体架构和开发流程非常重要。本文将介绍小程序生命周期的概念以及在不同阶段触发的关键事件&#xff0c;帮助开发者更好地理解和利用小程序的生命周期。 …...

Springboot中如何记录好日志

Springboot中如何记录日志 日志体系整体介绍 日志一直在系统中占据这十分重要的地位&#xff0c;他是我们在系统发生故障时用来排查问题的利器&#xff0c;也是我们做操作审计的重要依据。那么如何记录好日志呢&#xff1f;选择什么框架来记录日志&#xff0c;是不是日志打越…...

vm 虚拟机中ubuntu环境配置共享文件夹的方式

1. 在虚拟机设置中启用共享文件夹选项&#xff0c;映射到Windows中具体的目录。 2. 启动虚拟机。 3. 挂在cd #查看cd设备文件 sudo blkid#创建挂载点 sudo mkdir -p /media/cdrom#挂载cd sudo mount /dev/sr0 /media/cdrom#卸载cd sudo umount /media/cdrom 4. 执行完挂载后…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...