如何将excel数据导入数据库(mysql)且能自动更新
发布时间:2025-05-20 03:32:29 发布人:远客网络
一、如何将excel数据导入数据库(mysql)且能自动更新
1、实现Excel数据导入数据库(如MySQL)并自动更新的流程可简化为以下步骤。此过程需确保数据库与Excel文件之间的实时同步,以反映数据的变化。
2、首先,在数据库中创建目标表,确保其结构与Excel文件中的数据对应。使用ExcelToDatabase工具,通过“一键导入”功能,将Excel数据导入至数据库。此步骤可简化Excel数据与数据库之间的初始同步过程。
3、接下来,决定数据更新方式。数据更新一般分为全量更新与增量更新两种策略。
4、全量更新方式:删除数据库表中已有的所有数据,然后将Excel表中的全部数据导入数据库。这种方式确保数据的一致性,但当数据量较大或更新频繁时,可能会消耗更多资源和时间。适合数据量较小或更新不频繁的场景。
5、增量更新方式:在数据库表已有数据的基础上,仅更新Excel新增或修改的数据。此方法需要为每一行数据设置唯一标识(例如产品ID),以区分数据行。此方式适用于数据量大、更新频繁且需要保留历史数据的场景。
6、实现全量更新时,导入配置保存为产品信息,并选择数据库表及导入模式(覆盖)。新建定时任务“产品信息-全量更新”。对Excel进行数据修改测试,确认数据库更新效果。
7、对于增量更新,先停止全量更新任务,选择产品ID作为唯一标识,并在数据库中设置为主键。设置导入模式为“更新”,保存配置。新增定时任务“产品信息-增量更新”。对Excel进行数据修改和新增测试,确保数据库能够实时反映Excel数据变化。
8、设置定时任务,包括开始/结束时间、月份、星期、天、小时、分钟和秒。以“每分钟”为例,设置为每分钟执行一次任务。在“实时定时任务”界面,可查看定时任务的基本信息。
9、为了保持定时任务的持续运行,避免在关闭软件界面时停止任务,可在软件菜单栏的“工具”设置中勾选“隐藏到托盘区”。这样,即使关闭主界面,定时任务仍可继续执行。
10、将ExcelToDatabase程序加入开机启动,确保电脑重启后定时任务自动运行。在电脑的“开始”菜单下创建程序快捷方式,将其放入“启动”文件夹。此方法适用于需要持续执行定时任务的场景。
11、对于希望不直接运行程序而让定时任务在后台运行的情况,可以使用Windows自带的任务计划程序等外部定时任务工具,调用ExcelToDatabase提供的API实现。这种方式提供无图形界面的后台运行能力,并支持随电脑开机自动启动。
12、此外,ExcelToDatabase是一款自动化工具,用于批量导入Excel文件至数据库。此工具具备多种功能,包括数据同步与定时任务设置等,旨在简化数据导入与管理流程。欲了解更多关于ExcelToDatabase的信息,可访问其官方介绍与下载页面。
二、如何更新Excel的数据库查询函数库
更新一下之前写的Excel的数据库类,将其改成函数的形式,调用更简单(省却了生成类实例的步骤)。现在这个代码在工作中用了一年多,已经比较健壮。若有问题,请留言指出或与我联系。
•无需任何配置。在VBA中新建模块,并把代码复制转帖过去即可使用。
•有以下函数:执行数据库语句、查询数据库、结果复制到单元格(Excel中最常用)、将Excel表格上传到数据库。基本覆盖Excel中对数据库的常用操作。
•会在立即窗口显示数据库错误信息,方便查错。
•在数据库连接字符串字典中配好数据库连接信息后,数据库访问时可直接使用配好的链接字符串。
具体的函数用法已经写在下面代码注释里。简单描述一下:
•dqQueryToArray(sql, connection_string)查询数据库,返回一个二维数组
•dbQueryOne(sql, connection_string)查询数据库,返回单个变量。
•dbQueryToCell(sql, range, connection_string, withHeader)查询数据库后,将结果显示在range开始的区域中;withHeader控制是否显示列名。
•dbExec(sql, necction_string)执行数据库语句;无返回值
•dbInsertRange(table, range, connection_string, is_empty)将本Excel文件的range区域里的数据插入到数据库的表table。其中is_empty控制在上传数据前是否清空table的原数据。
' EXCEL的ADO数据库操作函数库
'这些代码应该放在Excel的VBA模块中,类模块的名字为database,并以以下形式引用:
' res= dbQueryToArry(sql, connection_string)
''返回sql的查询结果,结果为一个二维数组
' res= dbQueryOne(sql, connection_string)
''返回sql的查询结果,但只返回第一个数据(相当于数据库查询结果的左上角那个数据)
' dbQueryToCell sql, save_to_range, connection_string, withHeader
''将sql的查询结果直接写入到以save_to_range开头的单元格区域中
'' withHeader控制是否复制表头,默认为true(复制表头)
'其中参数sql为数据库查询语句,connection_string为数据库连接字符串。
'比如要连接SQL数据库,并已经设置ODBC,连接字符串为:
'"Provider=MSDASQL;DSN=odbc_name;UID=username;PWD=password;database=database_name;"
'如果未设置ODBC,连接字符串为:
'"driver={SQL Server};server=service_name_or_ip;uid=username;pwd=password;database=database_name;"
'其中最后面的database变量可省略。对于SQL Server,推荐使用后一种方法。
'如果数据来源为Excel文件,connection_string参数可省略
'其它功能:内置数据库的连接字符串、查询存储过程
' Author: zhang@zhiqiang.org, 2014-03-01 v4
' url:
Private sqlDict As Object'缓存数据
Private cnn As Object, rst As Object, lastConn As String
If Not sqlDict Is Nothing Then Exit Sub
Set sqlDict= CreateObject("scripting.Dictionary")
'在这里可以缓存一些常用的数据库信息,这样在查询数据库时可以直接调用
'比如dbQueryToArry(sql,"this")
"Provider=MSDASQL;DSN=odbc_name;UID=username;PWD=password;database=database_name;"
.Add"SQL服务器(无需配置ODBC)", _
"driver={SQL Server};server=ip;uid=username;pwd=password;database=database_name;"
.Add"this","Provider=Microsoft.ACE.OLEDB.12.0;Data Source="& ThisWorkbook.FullName& _
";Extended Properties=Excel"& Application.Version&";"
'查询数据库,返回RecordSet对象
' sqlConnectString:数据库连接信息,或者直接指定数据库,比如"Wind"、"JYDB"等,
Public Function dbQuery(sql As String, _
Optional ByVal sqlConnectString As String="this") As Object' ADODB.Recordset
' sqlConnectString:数据库连接信息,或者直接指定数据库,比如"Wind"、"JYDB"等,
Public Function dbQueryToArray(sql As String, _
Optional ByVal sqlConnectString As String="this")
dbQueryToArray= rst.GetRows(10000000)
' sqlConnectString:数据库连接信息,或者直接指定数据库,比如"Wind"、"JYDB"等,
Public Function dbQueryOne(sql As String, _
Optional ByVal sqlConnectString As String="this")
dbQueryOne= rst.Fields.Item(0).value
' sqlConnectString:数据库连接信息,或者直接指定数据库,比如"Wind"、"JYDB"等,
Public Function dbQueryToCell(sql$, Optional rng As Excel.Range, _
Optional ByVal sqlConnectString$="this", _
Optional withHeader As Boolean= True)
For i= 0 To rst.Fields.Count- 1
rng.Offset(0, i).value= rst.Fields(i).Name
rng.Offset(1, 0).CopyFromRecordset rst
'执行任意数据库语句,无返回结果。如需返回结果,请使用Query、QueryOne、QueryToCell等函数
' sqlConnectString:数据库连接信息,或者直接指定数据库,比如"Wind"、"JYDB"等,利用内设的数据库连接信息
Sub dbExec(ByVal sql As String, _
Optional ByVal sqlConnectString As String="this")
'这个函数用来上传一个Excel区域到数据库,数据表必须事先建好,并且包括Excel区域的第一行
' Database.InsertRange(table, rng, sqlConnectString, isEmpty)
' table:Excel数据将上传到这个表内
' sqlConnectString:数据库连接字符串
' isEmpty:是否清空原有表格数据
Public Function dbInsertRange(table$, rng As Excel.Range, Optional ByVal sqlConnectString$="this", _
Optional isEmpty As Boolean= False)
If isEmpty Then dbExec"delete from"& table, sqlConnectString$
Dim r As Long, sqlHead$, i As Long
'首选根据isEmpty选项,删除原表内所有数据
sqlHead= sqlHead&",["& rng.Cells(1, i)&"]"
'目前每一行都需运行一个SQL语句,效率较低,如果数据量较大,可能会引起Excel死机
sqlHead="insert into"& table&"("& mid(sqlHead, 2, 10000000)&") values"
sql= sql&",'"& Format(v,"yyyy-mm-dd")&"'"
ElseIf v<>"" And IsNumeric(v) Then
dbExec sqlHead&"("& mid(sql, 2, 1000000)&")", sqlConnectString$
'查询存储过程,返回的是ADODB.RecordSet对象
Public Function dbQueryStoredProc(procName$, para, _
Optional ByVal sqlConnectString As String="this", _
Optional returnPara As Boolean= True) As Object'ADODB.Recordset
'如果存在输出参数,则删除它,默认第一个为输出参数
If returnPara Then.Parameters.Delete 0
.Parameters.Item(i).value= para(i)
Set dbQueryStoredProc=.Execute()
'当类被注销时,断开数据库连接
If cnn.State<> 0 Then cnn.Close
'此处首先检查cnn是否已经连接到想要连接的数据库,如果已经连接,将不产生任何操作
'本Database对象在对象存续过程中,不会主动断开;
'只有在对象注销之时,才断开数据库,如需断开数据库连接,请set db= nothing
Private Function dbConnectSQL(ByVal sqlConnectString$) As String
If sqlDict.Exists(LCase(sqlConnectString)) Then
sqlConnectString= sqlDict.Item(LCase(sqlConnectString))
If rst Is Nothing Then Set rst= CreateObject("ADODB.Recordset")
If cnn Is Nothing Then Set cnn= CreateObject("ADODB.Connection")
If cnn.State<> 1 Or lastCnn<> sqlConnectString Then
Set cnn= CreateObject("ADODB.Connection")
dbConnectSQL= sqlConnectString
'显示查询数据库过程中出现的错误信息,信息被显示在立即窗口。
Private Sub dbDisplayError(sql$)
If cnn.Errors.Count> 0 Then
Debug.Print cnn.Errors.Count&" errors found when exec"""& sql&""""
Debug.Print"Error info:"& e.description&" Source:"& e.Source
三、在excel 来执行update语句这样子,sql中对应的数据做更新
1、我理解你的数据已经放在EXCEL中,然后想执行数据更改。如果是这样,可以添加一列,用if语句,比如bill字段列为c列,id所在的列为a列,从第二行开始,if(a2=2,7,c2).然后公式下拉。
2、之后,你可以用这一列代替bill所在的列,也可以复制此列,数值粘贴覆盖bill所在的列。
3、如果数据仍然在数据库,想通过excel去操作,这个就要麻烦一点。涉及到数据连接等等。