Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

请教如何批量把csv或者excel文件导入access

huichao8785  发表于:2018-11-26 22:00:30  
复制

各位老师好,今天我试了很久,同时在网上差了很多方法都没有成功(没有理解具体如何操作)。

因为在工作中经常会遇到N个csv或者excel格式文件,需要导入到一个access数据库里面在整理,请问有什么快捷的方法一次性导入么,而不是一个一个追加。


谢谢。

 

Top
huichao8785 发表于:2018-11-26 22:05:19

我先看了这篇帖子,但是不知道事件写到哪里。。https://www.toutiao.com/a6605440064551911939/

后来又去网上下载了几个模板,但都不能正常运行。http://www.accessoft.com/article-show.asp?id=10961



chinasa 发表于:2018-11-27 08:38:53


麒麟山人 发表于:2018-11-27 09:20:05
表格格式是固定的话,用关联表(需要文件名固定,然后copy到关联时的目录下),然后编写追加表查询,每次要导入时执行一下追加表查询即可。

麒麟山人 发表于:2018-11-27 09:48:15

前面说的方法操作上简单,但需要excel表名及个数固定。

https://www.toutiao.com/a6605440064551911939/

这个可以创建一个窗体,然后在窗体建一个按钮,对按钮的单击写事件。

然后会将同一目录下的excel都导入。

http://www.accessoft.com/article-show.asp?id=10961

这个则功能更强一些。可选择导入。



huichao8785 发表于:2018-11-27 16:05:13

点击下载此附件

首先感谢解答,但是我还是不太理解。。。

我们一般需要导入的excel文件,或者csv格式文件字段都是固定的,只是文件名不同。

1、insert into我试了一下,但不知道怎么写,我看了一下帮助文档,不知是否只有已经导入access的表才能追加查询。

2、您说的窗体加按钮添加事件我试了一下,没有找到应该对应哪个事件。。我看到都是记录导航记录操作。。等,并没有找到导入文件之类的名称。

如果您不忙时是否可以帮忙做一下,我再按照您的方法学习下,学习。



西出阳关无故人 发表于:2018-11-27 17:14:55

把你的按钮的代码完成如下,

Private Sub Command0_Click()

    Dim F
    With Application.FileDialog(3)
        .AllowMultiSelect = True
        .Filters.Clear
        .Filters.Add "Excel文件", "*.xls;*.xlsx"
        If .Show Then
            For Each F In .SelectedItems
                CurrentDb.Execute "INSERT INTO SHEET1 (ID,仓库) select ID,仓库 from  [Excel 8.0;Database=" & F & "].[sheet1$]"
            Next
        End If
    End With
End Sub

运行时,点击按钮,选择某个文件夹,并指定多个文件,点击确定。ok

其中“[sheet1$]”的工作表的名称,如果每个文件的要导入的工作表名称不同,就得逐个更改为你想要的统一非名称,代码中的这个名称也得同时更改




huichao8785 发表于:2018-11-28 16:40:21
感谢,我回去试试,如果有不懂的地方再请教。

huichao8785 发表于:2018-11-28 17:26:59

点击下载此附件

您好,我试了一下,可以了,感谢。

另外我刚看了一下,我们常用的批量导入文件,每个excel表格的sheet名都不同,请问这个应该如何修改呢?我试了一下,但是不行。

我修改了sheet名,1.xlsx sheet1 2.xlsx sheet2 3.xlsx sheet3.

请您不忙时再帮忙看下,谢谢。


Private Sub Command0_Click()
    Dim F
    With Application.FileDialog(3)
        .AllowMultiSelect = True
        .Filters.Clear
        .Filters.Add "Excel文件", "*.xls;*.xlsx"
        If .Show Then
            
                CurrentDb.Execute "INSERT INTO SHEET1 (ID,仓库) select ID,仓库 from  [Excel 8.0;Database=" & F & "].[sheet1$]"
                CurrentDb.Execute "INSERT INTO SHEET1 (ID,仓库) select ID,仓库 from  [Excel 8.0;Database=" & F & "].[sheet2$]"
                CurrentDb.Execute "INSERT INTO SHEET1 (ID,仓库) select ID,仓库 from  [Excel 8.0;Database=" & F & "].[sheet3$]"
            
        End If
    End With
End Sub



西出阳关无故人 发表于:2018-11-28 21:21:23
每个excel表格的sheet名都不同,就比较麻烦了。如果sheet里面有特殊标记的话,比如你要导入的表格的某几个固定单元格具有相同的数据,也可以先用代码循环每个sheet,找到那张存有你要导入的数据的sheet,然后在确定导入。

西出阳关无故人 发表于:2018-11-28 21:52:12
Private Sub Command0_Click()
    Dim xlapp As Object, xlbook As Object, sheetName As String, i As Long, j As Long
    Dim F
    Set xlapp = CreateObject("excel.application")
    With Application.FileDialog(3)
        .AllowMultiSelect = True
        .Filters.Clear
        .Filters.Add "Excel文件", "*.xls;*.xlsx"
        If .Show Then
            For Each F In .SelectedItems
                Set xlbook = xlapp.Workbooks.Open(F, , True) '打开Excel文件
                sheetName = "" '针对每个Excel文件,初始化一下
                For i = 1 To xlbook.Sheets.Count '循环所有的sheet
                    '按照某些固有的特征判断sheet是不是要导入的数据表
                    If xlbook.Sheets(i).Cells(1, 1) = "仓库" And xlbook.Sheets(i).Cells(1, 2) = "id" Then '特征判断
                        sheetName = xlbook.Sheets(i).Name '确定为要导入的数据表的名称
                        Exit For '既然找到了就退出循环
                    End If
                Next i '没有找到,就继续,一直到循环完成
                xlbook.Close '你打开了他,就一定要关闭它.
                If sheetName = "" Then '循环完成后,也没有找到要导入的数据表.
                    Debug.Print "文件[" & F & "]中没有你要的数据!"
                Else '已经找到要导入的数据表
                    CurrentDb.Execute "INSERT INTO SHEET1 (ID,仓库) select ID,仓库 from  [Excel 8.0;Database=" & F & "].[" & sheetName & "$]"
                    j = j + 1
                End If
            Next
        End If
    End With
    MsgBox "一共导入了[" & j & "]张表的数据!"
End Sub


以上代码基于Excel的A1单元格为“仓库”,B1单元格为“id”的情况来确定就是你要导入的sheet。当然,你还可以添加更多的判断(假如还有其他字段,并且字段顺序有定数的话更好),来确认是不是你要导入的sheet




chinasa 发表于:2018-11-29 08:13:37

Dim F
    With Application.FileDialog(3)
        .AllowMultiSelect = True
        .Filters.Clear
        .Filters.Add "Excel文件", "*.xls;*.xlsx"
        If .Show Then
            For Each F In .SelectedItems
                CurrentDb.Execute "INSERT INTO SHEET1 (ID,仓库) select ID,仓库 from  [Excel 8.0;Database=" & F & "].[A1:B500]"

            Next
        End If
    End With



huichao8785 发表于:2018-11-30 17:09:46

感谢两位老师的解答,刚才试验了一下,已经可以批量导入了(每个excel里面sheet名称不同)。

最后我还有一个问题想请教一下,如果导入的不是excel格式,而是csv格式应该如何修改呢?请不忙时帮忙再看下,谢谢。


我觉得应该是修改这两行代码。

  .Filters.Add "Excel文件", "*.xls;*.xlsx"

CurrentDb.Execute "INSERT INTO SHEET1 (ID,仓库) select ID,仓库 from  [Excel 8.0;Database=" & F & "].[A1:B500]"



西出阳关无故人 发表于:2018-11-30 17:22:16

语法大约是:

SELECT *

FROM (TEXT;FMT=CSV;DELIMITED;HDR=YES;DATABASE=文件路径) 文件名.csv

其中 ,文件路径是不包含最后一个“\“的文件目录,文件名是不包含后缀名的文件名。



huichao8785 发表于:2018-11-30 19:17:01

您好,我试着修改了一下,然后添加完csv文件以后,运行会提示错误3044,还请不忙时再帮忙看一下,谢谢。




Private Sub Form_Current()
Dim F
    With Application.FileDialog(3)
        .AllowMultiSelect = True
        .Filters.Clear
        .Filters.Add "CSV文件", "*.CSV"
        If .Show Then
            For Each F In .SelectedItems
                CurrentDb.Execute "INSERT INTO SHEET1 (ID,仓库) select ID,仓库 from  [Text;FMT=CSV;DELIMITED;HDR=YES;Database=" & F & "].[A1:B500]"
            Next
        End If
    End With
End Sub




西出阳关无故人 发表于:2018-11-30 22:12:29

csv不是很熟悉,好像没有[A1:B500]这种表示的吧?




西出阳关无故人 发表于:2018-11-30 22:27:36

测试了一下,下面的可行

SELECT * FROM [TEXT;FMT=CSV;DELIMITED;HDR=YES;DATABASE=F:\我的文档\ado绑定].book1.csv

SELECT 字段1,字段2,字段3 FROM [TEXT;FMT=CSV;DELIMITED;HDR=YES;DATABASE=F:\我的文档\ado绑定].book1.csv

其中:    F:\我的文档\ado绑定   为目录

其中:    book1.csv   为csv文件的文件名



方括号在查询保存后,再次打开设计视图时,会变为如下的格式,然后会有问题:

SELECT * FROM (TEXT;FMT=CSV;DELIMITED;HDR=YES;DATABASE=F:\我的文档\ado绑定) book1.csv





西出阳关无故人 发表于:2018-11-30 22:29:54
是在不行,就把你的实例(包含多个csv文件)再次打包上传.

huichao8785 发表于:2018-12-01 10:19:00

点击下载此附件

您好,因为我们单位技术提供的很多报表都是csv格式的,部分报表很大,基本都是10个左右的CSV。所以我才需要批量导入近access。手工一个一个导入比较费时,而且经常忘记导入到第几个了。

我刚才试了一下,导入1.csv没有问题。但是当是当选择多个文件导入的时候没有成功。比如我要导入一次导入1、2、3,3个csv格式。相当于导入了3遍1.csv。

我觉得可能是后面写了1.csv,请问是否可以把这里换成变量。或者每导入一个文件写一行语句如果可以实现也行。

谢谢。



huichao8785 发表于:2018-12-01 18:03:23
您好,我刚才又试了一下用docmd可以批量导入csv格式文件了,加了一个for循环,谢谢。

总记录:19篇  页次:1/1 9 1 :