Foxtable(狐表)用户栏目专家坐堂 → 导入带图片的excel bom表提示超出数组界限


  共有4089人关注过本帖树形打印复制链接

主题:导入带图片的excel bom表提示超出数组界限

帅哥哟,离线,有人找我吗?
elfing
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:90 积分:1202 威望:0 精华:0 注册:2015/4/25 9:42:00
导入带图片的excel bom表提示超出数组界限  发帖心情 Post By:2022/12/14 12:21:00 [只看该作者]

如代码所示,学习论坛帖子里面的经验后编写这段代码用来导入带图片的bom清单,然后把图片上传到ftp,上传了几次没问题,后来调整了一下表格的格式,测试中突然出现无法导入的情况,图片列无法命名,结束后提示重新保存导入的表格,请教一下代码有什么问题
以下内容为程序代码:

1 Dim dlg As New OpenFileDialog
2 dlg.Filter = "Excel文件|*.xls;*.xlsx"
3 If dlg.ShowDialog = DialogResult.OK Then
4 Dim App As New MSExcel.Application
5 Try
6 Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open(dlg.FileName)
7 Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(1)
8 Dim Rg As MSExcel.Range = Ws.UsedRange
9 Dim ary = rg.value
10 Dim dic As New Dictionary(Of Integer, List(Of Object))
11 Dim ftp1 As New FtpClient
12 ftp1.Host = "***.**.**.*"
13 ftp1.Account = "elf***"
14 ftp1.Password = "********"
15 For Each s As Object In ws.Shapes
16 Dim rng = s.TopLeftCell
17 If dic.ContainsKey(rng.Row) = False Then
18 Dim ls As New List(Of Object)
19 ls.add(s)
20 dic.Add(rng.Row, ls)
21 Else
22 dic(rng.Row).add(s)
23 End If
24 Next
25 For n As Integer = 2 To rg.Rows.Count
26 Dim ro As Row = Tables("BOM").AddNew
27 For i As Integer = 0 To Tables("BOM").Cols.Count - 1
28 ro(i) = ary(n, i + 1)
29 Next
30 If dic.ContainsKey(n) Then
31 Dim ls = dic(n)
32 Dim line As New List(Of String)
33 For j As Integer = 0 To ls.count - 1
34 Dim name = ary(n, 5) & "_" & j & ".jpg"
35 Dim khxm = "/产品图片/" & ary(n, 3)
36 ls(j).copy
37 ClipBoard.GetImage.save(projectPath & "Images/产品图片/" & name)
38 If ftp1.DirExists(khxm) Then
39 Else
40 ftp1.MakeDir(khxm)
41 End If
42 ftp1.Upload(projectPath & "Images/产品图片/" & name, khxm & "/" & name)
43 line.add(khxm & "/" & name)
44 Next
45 ro.DataRow.lines("零件图片") = line
46 End If
47 Next
48 MessageBox.Show("导入成功!", "恭喜!")
49 Catch ex As exception
50 msgbox(ex.message)
51 MessageBox.Show("导入失败!", "恭喜!")
52 Finally
53 app.quit
54 End Try
55 End If

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107740 积分:548039 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/12/14 13:41:00 [只看该作者]

代码没有问题。应该是图片位置有问题

 回到顶部
帅哥哟,离线,有人找我吗?
elfing
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:90 积分:1202 威望:0 精华:0 注册:2015/4/25 9:42:00
[求助]  发帖心情 Post By:2022/12/14 13:55:00 [只看该作者]

bom如附件,表格昨天也导入过,都是正常的,到了昨天半夜突然出的问题
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:kx11 phev bom1.xlsx


 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107740 积分:548039 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/12/14 14:11:00 [只看该作者]

重新把代码发一下,去掉行号

 回到顶部
帅哥哟,离线,有人找我吗?
elfing
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:90 积分:1202 威望:0 精华:0 注册:2015/4/25 9:42:00
[求助]  发帖心情 Post By:2022/12/14 14:15:00 [只看该作者]

        Dim dlg As New OpenFileDialog
        dlg.Filter = "Excel文件|*.xls;*.xlsx"
        If dlg.ShowDialog = DialogResult.OK Then
            Dim App As New MSExcel.Application
            Try
                Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open(dlg.FileName)
                Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(1)
                Dim Rg As MSExcel.Range = Ws.UsedRange
                Dim ary = rg.value
                Dim dic As New Dictionary(Of Integer, List(Of Object))
                Dim ftp1 As New FtpClient
                ftp1.Host = "120.27.45.3"
                ftp1.Account = "elfing"
                ftp1.Password = "12345678"
                For Each s As Object In ws.Shapes
                    Dim rng = s.TopLeftCell
                    If dic.ContainsKey(rng.Row) = False Then
                        Dim ls As New List(Of Object)
                        ls.add(s)
                        dic.Add(rng.Row, ls)
                    Else
                        dic(rng.Row).add(s)
                    End If
                Next
                For n As Integer = 2 To rg.Rows.Count
                    Dim ro As Row = Tables("BOM").AddNew
                    For i As Integer = 0 To Tables("BOM").Cols.Count - 1
                        ro(i) = ary(n, i + 1)
                    Next
                    If dic.ContainsKey(n) Then
                        Dim ls = dic(n)
                        Dim line As New List(Of String)
                        For j As Integer = 0 To ls.count - 1
                            Dim name = ary(n, 5) & "_" & j & ".jpg"
                            Dim khxm = "/产品图片/" & ary(n, 3)
                            ls(j).copy
                            ClipBoard.GetImage.save(projectPath & "Images/产品图片/" & name)
                            If ftp1.DirExists(khxm) Then
                            Else
                                ftp1.MakeDir(khxm)
                            End If
                            ftp1.Upload(projectPath & "Images/产品图片/" & name, khxm & "/" & name)
                            line.add(khxm & "/" & name)
                        Next
                        ro.DataRow.lines("零件图片") = line
                    End If
                Next
                MessageBox.Show("导入成功!", "恭喜!")
            Catch ex As exception
                msgbox(ex.message)
                MessageBox.Show("导入失败!", "恭喜!")
            Finally
                app.quit
            End Try
        End If

 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107740 积分:548039 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/12/14 14:36:00 [只看该作者]

文件本身应该有问题,具体什么问题不清楚。加上这么一句我测试了可以

        Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open(dlg.FileName)
        Output.Show(1)
        Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(1)

另外索引问题应该是下面代码的原因,可能execl里面的列数量和表格的列数不一致

                    For i As Integer = 0 To Tables("BOM").Cols.Count - 1
                        ro(i) = ary(n, i + 1)
                    Next

 回到顶部
帅哥哟,离线,有人找我吗?
elfing
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:90 积分:1202 威望:0 精华:0 注册:2015/4/25 9:42:00
  发帖心情 Post By:2022/12/14 14:43:00 [只看该作者]

多谢提醒,是列的问题,我在foxtable里面加了两列,excel里面没有,导入的时候就出错了
请问如何编码可以只导入table里面有的列呢?

 回到顶部
帅哥,在线噢!
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107740 积分:548039 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/12/14 15:00:00 [只看该作者]

先把execl第一行的列名和索引记录下来使用,参考:http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=102185&skin=0,看3楼的用法

 回到顶部