以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  导入带图片的excel bom表提示超出数组界限  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=184576)

--  作者:elfing
--  发布时间:2022/12/14 12:21:00
--  导入带图片的excel bom表提示超出数组界限
如代码所示,学习论坛帖子里面的经验后编写这段代码用来导入带图片的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

--  作者:有点蓝
--  发布时间:2022/12/14 13:41:00
--  
代码没有问题。应该是图片位置有问题
--  作者:elfing
--  发布时间:2022/12/14 13:55:00
--  [求助]
bom如附件,表格昨天也导入过,都是正常的,到了昨天半夜突然出的问题
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:kx11 phev bom1.xlsx


--  作者:有点蓝
--  发布时间:2022/12/14 14:11:00
--  
重新把代码发一下,去掉行号
--  作者:elfing
--  发布时间: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

--  作者:有点蓝
--  发布时间: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
--  发布时间:2022/12/14 14:43:00
--  
多谢提醒,是列的问题,我在foxtable里面加了两列,excel里面没有,导入的时候就出错了
请问如何编码可以只导入table里面有的列呢?

--  作者:有点蓝
--  发布时间:2022/12/14 15:00:00
--  
先把execl第一行的列名和索引记录下来使用,参考:http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=102185&skin=0,看3楼的用法