把Excel工作表中数据导入数据库

把Excel工作表中数据导入数据库,第1张

这是第二次了,市场部那边又来要求改数据。他们要改的是数据库某张表中类似商品价格等的数据,需要改的地方又多,我们上次是靠新来的兄弟一个个给Update进去的,这次老大去教了他们Update语句,把烦人的皮球踢给他们了。但这样一个个更新很明显不是办法,我想通过excel直接把数据导入数据库应该是可行的吧,就开始找方法了。

我想至少有这样两种比较容易实现的方法:

1、直接用Sql语句查询

2、先用excle中的数据生成xml文件,再把xml导入数据库

第一种方法(方法二以后再试),找到联机丛书里实现此功能的Sql语句如下:

SELECT FROMOpenDataSource('MicrosoftJetOLEDB40', 'DataSource="c:Financeaccountxls";UserID=Admin;Password=;Extendedproperties=Excel50')…xactions

语句是有了,但我还是试了很久,因为各个参数具体该怎么设置它没有说。Data Source就是excel文件的路径,这个简单;UserId、Password和Extended properties这三个属性我改成了各种各样的与本机有关的用户名、密码以及excel版本都不对,最后用上面例子里的值“User ID=Admin;Password=;Extended properties=Excel 50”才成功了,晕啊;最后个“xactions”更是查了很多资料,其实就仅仅是excel文件里所选的工作表名而已,怪我对excel不够熟悉了,另外注意默认的Sheet1要写成[Sheet1$]

最后,看看我成功的测试

数据库里建好一个表testTable_1,有5个字段id, name, date, money, content,C盘下book1xls文件的sheet1工作表里写好对应的数据并设好数据类型,执行如下插入语句:

insertintotestTable_1([name],[date],[money],[content]) Select[姓名],[日期],[金额],[内容] FROMOpenDataSource('MicrosoftJetOLEDB40', 'DataSource="C:Book1xls"; UserID=Admin;Password=;Extendedproperties=Excel50')…[Sheet1$]

select里的列名我一开始用代替,但发现输出顺序与我预期的不同,是“金额、内容、日期、姓名”,不知道具体有什么规律,就老老实实写名字了。 *** 作成功

回过头来看看市场部的要求,假设在我这张表里实现,可以先判断如excel里存在与记录相同的name字段(name要唯一非空)时就删除记录,之后再插入,这样简单,但自增的id字段会因为插入而改变,那是不行的了。可行的方法是先读出excel里全部记录,然后用游标一条条分析,如果存在这个name就更新否则就插入。OK,下次就不用让他们再对着文档一条条Update了

1、打开企业管理器,打开要导入数据的数据库,在表上按右键,所有任务--导入数据,d出DTS导入/导出向导,按下一步

2、选择数据源MicrosoftExcel97-2000,文件名选择要导入的xls文件,按下一步

3、选择目的用于SQLServer的MicrosoftOLEDB提供程序,服务器选择本地(如果是本地数据库的话,如VVV),使用SQLServer身份验证,用户名sa,密码为空,数据库选择要导入数据的数据库(如client),按下一步

4、选择用一条查询指定要传输的数据,按下一步

5、按查询生成器,在源表列表中,有要导入的xls文件的列,将各列加入到右边的选中的列列表中,这一步一定要注意,加入列的顺序一定要与数据库中字段定义的顺序相同,否则将会出错,按下一步

6、选择要对数据进行排列的顺序,在这一步中选择的列就是在查询语句中orderby后面所跟的列,按下一步

7、如果要全部导入,则选择全部行,按下一步

8、则会看到根据前面的 *** 作生成的查询语句,确认无误后,按下一步

9、会看到表/工作表/Excel命名区域列表,在目的列,选择要导入数据的那个表,按下一步

10、选择立即运行,按下一步,11、会看到整个 *** 作的摘要,按完成即可。

--如果导入数据并生成表

selectinto表from

OPENROWSET('MICROSOFTJETOLEDB40'

,'Excel50;HDR=YES;DATABASE=c: estxls',sheet1$)

===

--将某个目录上的Excel表,导入到数据库中

--将所有的Excel文件放到一个目录中,假设为c: est,然后用下面的方法来做

createtable#t(fnamevarchar(260),depthint,isfbit)

insertinto#texecmasterxp_dirtree'c: est',1,1

declaretbcursorforselectfn='c: est'+fnamefrom#t

whereisf=1andfnamelike'%xls'--取xls文件(EXCEL)

declare@fnvarchar(8000)

opentb

fetchnextfromtbinto@fn

while@@fetch_status=0

begin

--下面是查询语句,需要根据你的情况改为插入语句

--插入已有的表用:insertinto表selctfrom

--创建表用:selectinto表from

set@fn='selectfrom

OPENROWSET(''MICROSOFTJETOLEDB40'',''Excel50;HDR=YES;DATABASE='+@fn+''',全部客户$)'

exec(@fn)

fetchnextfromtbinto@fn

end

closetb

deallocatetb

droptable#t

1首先看一段实例代码

2IMEX=1的作用是,当读取Excel中每个单元格的值到DataTable中的时候,不管其在Excel单元格时候是什么数据类型,赋值到DataTable中都强制转化为字符串类型。

3在没有IMEX=1这个属性的时候,默认的是根据Excel中对应Column的数据类型来决定DataTable中Column的数据类型。这种情况在Excel中某一列的数据类型都是一致的情况下没有问题,是什么类型,就会在DataTable中的对应列设置相应的类型。但是如果Excel中这一列的类型混乱的话,比如说既包括数值型又有字符串型,在运行时创建DataTable的时候,从Excel中前8行进行采样分析,会去先判断Excel中这一列哪种类型的数据占主体,然后给DataTable的列设置为这种类型。比如说,如果一列中既有整数型又有字符型,而整数型单元格占主体,这时DataTable中的列就是整数型。

4这时又出现另外一个问题,当要把值写入到DataTable的时候,如果该单元格符合DataTable中要求的类型,就会写入,如果不符合的话,系统会去强制转换。比如,如果Excel中是字符串的5,而该单元格所在的列整数型占主体,DataTable中这一列是数值型,这时,系统会把字符串的5强制转为数值型的5然后赋给DataTable相应的地方。但是,此时,如果转换有问题的话,比如,此列中有一单元格中是“NO5”,这时强制转换就会有问题,系统就会给DataTable相应的地方赋值DBNull,现在如果你用DataGridView来显示那个DataTable的时候,这个地方显示出来就是一个空白的格,但要注意的是,并不是DataTable中的这一行这一列是null,而是DBNull其实,我觉得,跟null的作用是一样的,反正在DataGridView中是不会显示出来。只是我们在写程序如果需要对DataTable的null元素筛选的话,需要注意这个问题。

5如果Excel中,某一行字符串类型占主体的话,那么DataTable中这一列就会设置为字符串型,而且任何类型都能顺利转换成字符串类型,所以,Excel的类会完整的显示出来,不管这一列中的字符串类型的单元格,还是整数型的单元格,都能完整的显示出来。这是一很特别的地方。但这仅仅是一个特例。

6所以,如果为了处理的时候数据类型的一致性,如果Excel中数据类型混乱的话,可以使用IMEX=1使DataTable中的所有列都转为字符型。这种设置并不可靠,IMEX=1只确保在某列前8行数据至少有一个是文本项的时候才起作用,它只是把查找前8行数据中数据类型占优选择的行为作了略微的改变。例如某列前8行数据全为纯数字,那么它仍然以数字类型作为该列的数据类型(详细解释见下面的补充说明)

7接下来说一个相关的问题,那就是DataTable中使用语句进行筛选的问题这时也要注意DataTable中Column的类型问题。在下边的例子中,F1,F2,F3等都是DataTable的列名。

下边这个例子中,F1列是数值型,F5列是字符串型

当遇到F5='NO2'后,系统会自动去转换,此时,由于不能顺利转换成数值型,在筛选到这里的时候,就会抛出异常,Operator= can’t perform on SystemDouble and SystemString

再看一种情况,F1列是数值型,F5列是字符型

这种情况也是没问题的,F1=1540,因为本身F1就是数值型,所以不必给1540加引号

但是,注意一种特殊情况 ,F1列是数值型,F5列是字符型

这种情况下会报错,系统不会自动把NO2转换为字符串,而是把Grade2看成一个列了,系统做的判断是,这一行的这两列的单元格值相等,而DataTable中又没有这个列名,所以就会抛出找不到这个列的异常。所以,当某一列为字符串类型时,一定要加上单引号,否则会有异常抛出。

以上就是关于把Excel工作表中数据导入数据库全部的内容,包括:把Excel工作表中数据导入数据库、excel怎么将表格连入数据库(怎样把一个表格的数据导入到数据库中)、C#.NETExcel文件数据导入SQLServer数据库完整代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10112150.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存