Foxtable(狐表)用户栏目专家坐堂 → [求助]ftp较多图片导出excel时经常连接服务器失败


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

主题:[求助]ftp较多图片导出excel时经常连接服务器失败

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


加好友 发短信
等级:二尾狐 帖子:388 积分:5098 威望:0 精华:0 注册:2013/11/2 0:01:00
[求助]ftp较多图片导出excel时经常连接服务器失败  发帖心情 Post By:2016/11/8 14:29:00 [只看该作者]

写了一个把父表和对应子表数据导出excel的方法

 

一共有3个表。父表:YBQuotationMain,子表YBQuotationDetail,他们之间通过  YBQuotationID关联。还有一个商品档案表YBItemInfo,它与子表通过YBItemID关联,Ftp图片列YBItemPicture里而在商品档案表里

 

 


此主题相关图片如下:2.jpg
按此在新窗口浏览图片


此主题相关图片如下:3.png
按此在新窗口浏览图片

此主题相关图片如下:1.jpg
按此在新窗口浏览图片

excel的样式,我在下一个回复里插入

 

 导出excel的代码:

 

If Tables("YBQuotationMain").Current IsNot Nothing Then   
    Dim cnt As Integer = 0
    cnt = DataTables("YBQuotationDetail").SQLCompute("Count(*)", "YBQuotatiYBQuotationMain").Current("YBQuotationID") )
    If cnt >300 Then
        If MessageBox.show("产品超过300个,有可能因为你的机器内存不足而导出失败,要尝试导出吗?","提示",MessageBoxButtons.YesNo) = DialogResult.no Then
            Return
        End If
    End If
    MessageBox.show("如果导出过程中提示【连接服务器失败...】,图片没下载完整,那么再导出一次即可")
   
    Dim st As Date = Date.Now
   
    '---把子表全加载,我的子表数据才用动态加载,而excel导出只导出已加载的表
    DataTables("YBQuotationDetail").LoadFilter = "YBQuotatiYBQuotationMain").Current("YBQuotationID")
    DataTables("YBQuotationDetail").LoadTop="100 percent"
    DataTables("YBQuotationDetail").LoadOver="_identify"
    DataTables("YBQuotationDetail").Load(False)
    '---把子表全加载,我的子表数据才用动态加载,而excel导出只导出已加载的表
    
    
    '------追载表达式的关联表YBItemInfo的数据
    If  DataTables("YBQuotationDetail").DataRows.Count >0 Then
        For Each  dr As DataRow In DataTables("YBQuotationDetail").DataRows
            Dim Filter As String ="YBItemID = '" & dr("YBItemID") & "'"
            If DataTables("YBItemInfo").find(Filter) Is Nothing Then    '如果对 应的订单明细没有加载过
                DataTables("YBItemInfo").AppendLoad(Filter,False) '则追载此订单 的订单明细
            End If
        Next
    End If
    '------追载表达式的关联表YBItemInfo的数据
    
    
   
    
    Dim Book As New XLS.Book(ProjectPath & "Attachments\YBQuotationOrigin.xls")    
    
    Dim now As String = Format(Date.now, "yyyyMMddHHmmss")
    Dim fl As String = ProjectPath & "Reports\Invoice原图" & now & ".xls"
   
   
    YBPicFtp.Close
    Try
        Book.Build() '生成细节区
       
        Dim Sheet As XLS.Sheet = Book.Sheets(0)
        Sheet.Rows.Frozen = 11
        Book.Save(fl) '保存工作簿
       
        '---进度条
        StatusBar.ProgressBar.Value = StatusBar.ProgressBar.Maximum
        StatusBar.Message1 ="导出成功"
        StatusBar.Message2= StatusBar.ProgressBar.Value & "/" &  StatusBar.ProgressBar.Maximum
        StatusBar.Refresh
        '---进度条
       
       
        MessageBox.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒") '计算并显示执行代码所花费的秒数
        Dim Proc As New Process '打开工作簿
        Proc.File = fl
        Proc.Start()
        Proc.File = ProjectPath & "Reports"
        Proc.Start()
       
       
       
    Catch ex As Exception
        StatusBar.Message1 ="导出失败"
        StatusBar.Refresh
        MessageBox.Show("囧...导出的图片太多或者图片太大,而你机器内存太少不足以支撑,所以导出失败!" & vbcrlf & vbcrlf &  "选压缩导出,或者少选点产品把","提示",MessageBoxButtons.OK)
    End Try
    YBPicFtp.Close
   
   
   
    '----变回动态加载----
    Dim dln As WinForm.NumericComboBox = e.Form.Controls("NumericComboBox_DetailLoadNum")
    DataTables("YBQuotationDetail").LoadTop= dln.Value
    DataTables("YBQuotationDetail").Loadpage =0
    DataTables("YBQuotationDetail").Load(False)
    '----变回动态加载----
   
   
Else MessageBox.show("请先选择订单")
End If

 

 

有时候50张图片,就会有2张下载不了,有这个提示,有时候重新再导出能解决,有时候就算重启狐表,还是下载不了,只能子表一行行点击,把它的图片都对应加载过,那导出时就不需要下载,就直接成功。请问有好的解决方法吗?

 

我的服务器是阿里云的,双核4G内存 I/O优化 固态硬盘的,用的是FileZilla Server Interface

[此贴子已经被作者于2016/11/8 14:35:28编辑过]

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


加好友 发短信
等级:二尾狐 帖子:388 积分:5098 威望:0 精华:0 注册:2013/11/2 0:01:00
  发帖心情 Post By:2016/11/8 14:33:00 [只看该作者]

 


图片点击可在新窗口打开查看此主题相关图片如下:5.jpg
图片点击可在新窗口打开查看
[此贴子已经被作者于2016/11/8 14:38:36编辑过]

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


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

可以先下载所有图片到本地,再通过本地图片打印

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


加好友 发短信
等级:二尾狐 帖子:388 积分:5098 威望:0 精华:0 注册:2013/11/2 0:01:00
回复:(有点蓝)可以先下载所有图片到本地,再通过本...  发帖心情 Post By:2016/11/8 14:52:00 [只看该作者]

是下载这个子表里所有的图片吗?

 

有些图片列里有几个图片的,我不知道怎么下载,好像帮助里的ftp下载都是填某个图片的路径,然后实际有多个图片时,不知道怎么下载

[此贴子已经被作者于2016/11/8 15:00:42编辑过]

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


加好友 发短信
等级:超级版主 帖子:110567 积分:562725 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/11/8 15:03:00 [只看该作者]


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


加好友 发短信
等级:二尾狐 帖子:388 积分:5098 威望:0 精华:0 注册:2013/11/2 0:01:00
回复:(有点蓝)参考:http://www.foxtable.com/webh...  发帖心情 Post By:2016/11/8 18:06:00 [只看该作者]

提前遍历下载,也一样会出现连接服务器失败,因为它本质也是ftp的大量下载

我把代码加在导出里

 

-----------

 

If Tables("YBQuotationMain").Current IsNot Nothing Then
    Dim cnt As Integer = 0
    Dim dt As DataTable = DataTables("YBQuotationDetail")
    cnt = dt.SQLCompute("Count(*)", "YBQuotatiYBQuotationMain").Current("YBQuotationID") )
    If cnt >300 Then
        If MessageBox.show("产品超过300个,有可能因为你的机器内存不足而导出失败,要尝试导出吗?","提示",MessageBoxButtons.YesNo) = DialogResult.no Then
            Return
        End If
    End If
    MessageBox.show("如果导出过程中提示【连接服务器失败...】,图片没下载完整,那么再导出一次即可")
   
    Dim st As Date = Date.Now
   
    '---把明细全加载,因为它只导出已加载的表
    dt.LoadFilter = "YBQuotatiYBQuotationMain").Current("YBQuotationID")
    dt.LoadTop="100 percent"
    dt.LoadOver="_identify"
    dt.Load(False)
    '---把明细全加载,因为它只导出已加载的表
   
   
    '------追载表达式的父表YBItemInfo
    If  dt.DataRows.Count >0 Then
        For Each  dr As DataRow In dt.DataRows
            Dim Filter As String ="YBItemID = '" & dr("YBItemID") & "'"
            If DataTables("YBItemInfo").find(Filter) Is Nothing Then    '如果对 应的订单明细没有加载过
                DataTables("YBItemInfo").AppendLoad(Filter,False) '则追载此订单 的订单明细
            End If
        Next
    End If
    '------追载表达式的父表YBItemInfo
   
    '----下载子表所有图片,再引用
    For Each pdr As DataRow In dt.DataRows
        Dim lst As New List(of String)
        lst = pdr.Lines("YBItemPicture")
        If lst.Count > 0 Then
            Dim LoadFile As String = lst(0)
            Dim DownFile As String = ProjectPath & "RemoteFiles" & LoadFile
            If FileSys.FileExists(DownFile) = False Then
                YBPicFtp.Download(Loadfile,DownFile,False) '不存在,重新下载
            End If
        End If
    Next
    '----下载子表所有图片,再引用
   
   
   
    '---进度条
    StatusBar.ProgressBar.Minimum =0
    StatusBar.ProgressBar.Maximum = dt.DataRows.Count
    StatusBar.ProgressBar.Value= 0
    StatusBar.Message1 ="正在导出"
    StatusBar.Message2= StatusBar.ProgressBar.Value & "/" &  StatusBar.ProgressBar.Maximum
    StatusBar.Refresh
    '---进度条
   
   
    Dim Book As New XLS.Book(ProjectPath & "Attachments\YBQuotationOrigin.xls")
   
   
    Dim now As String = Format(Date.now, "yyyyMMddHHmmss")
    Dim fl As String = ProjectPath & "Reports\Invoice原图" & now & ".xls"
   
   
    YBPicFtp.Close
    Try
        Book.Build() '生成细节区
       
        Dim Sheet As XLS.Sheet = Book.Sheets(0)
        Sheet.Rows.Frozen = 11
        Book.Save(fl) '保存工作簿
       
        '---进度条
        StatusBar.ProgressBar.Value = StatusBar.ProgressBar.Maximum
        StatusBar.Message1 ="导出成功"
        StatusBar.Message2= StatusBar.ProgressBar.Value & "/" &  StatusBar.ProgressBar.Maximum
        StatusBar.Refresh
        '---进度条
       
       
        MessageBox.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒") '计算并显示执行代码所花费的秒数
        Dim Proc As New Process '打开工作簿
        Proc.File = fl
        Proc.Start()
        Proc.File = ProjectPath & "Reports"
        Proc.Start()
       
       
       
    Catch ex As Exception
        StatusBar.Message1 ="导出失败"
        StatusBar.Refresh
        MessageBox.Show("囧...导出的图片太多或者图片太大,而你机器内存太少不足以支撑,所以导出失败!" & vbcrlf & vbcrlf &  "选压缩导出,或者少选点产品把","提示",MessageBoxButtons.OK)
    End Try
    YBPicFtp.Close
   
   
   
    '----变回动态加载----
    Dim dln As WinForm.NumericComboBox = e.Form.Controls("NumericComboBox_DetailLoadNum")
    dt.LoadTop= dln.Value
    dt.Loadpage =0
    dt.Load(False)
    '----变回动态加载----
   
   
Else MessageBox.show("请先选择订单")
End If


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


加好友 发短信
等级:二尾狐 帖子:388 积分:5098 威望:0 精华:0 注册:2013/11/2 0:01:00
  发帖心情 Post By:2016/11/8 18:08:00 [只看该作者]

可以说问题应该是出在ftp批量下载时,无法连续下载照片,ftp不够稳定,不知道是哪里出的问题,你们有时候ftp大量下载文件或照片吗?如果我用 FlashFtp这样的传统ftp工具,连接上我阿里云去ftp下载,无论多少文件都可以稳定传输,是不是狐表的ftp稳定性问题?

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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2016/11/8 18:40:00 [只看该作者]

以下是引用chen3728060在2016/11/8 18:08:00的发言:
可以说问题应该是出在ftp批量下载时,无法连续下载照片,ftp不够稳定,不知道是哪里出的问题,你们有时候ftp大量下载文件或照片吗?如果我用 FlashFtp这样的传统ftp工具,连接上我阿里云去ftp下载,无论多少文件都可以稳定传输,是不是狐表的ftp稳定性问题?

 

你直接用ftpclient的download方法批量下载文件是否稳定?速度是否正常?先下载到本地,模板直接调用本地的图片。

 

如果ftp的你觉得不好用,那就改写ftp吧。  http://foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=78301&skin=0

 


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


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

试试用IIS做ftp服务,这个和Foxtable的兼容性好点

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


加好友 发短信
等级:二尾狐 帖子:388 积分:5098 威望:0 精华:0 注册:2013/11/2 0:01:00
回复:(有点色)以下是引用chen3728060在2016/11/8 1...  发帖心情 Post By:2016/11/8 20:13:00 [只看该作者]

    '----下载子表所有图片,再引用
    For Each pdr As DataRow In dt.DataRows
        Dim lst As New List(of String)
        lst = pdr.Lines("YBItemPicture")
        If lst.Count > 0 Then
            Dim LoadFile As String = lst(0)
            Dim DownFile As String = ProjectPath & "RemoteFiles" & LoadFile
            If FileSys.FileExists(DownFile) = False Then
                YBPicFtp.Download(Loadfile,DownFile,False) '不存在,重新下载
            End If
        End If
    Next
    '----下载子表所有图片,再引用

 

我单独使用 这段代码去下载,也是不稳定的,数量多就会偶尔出现缺了的,或者是提示服务器连接失败,这段代码就是用download方法,大量的ftp下载就会偶发连接不上服务器。应该是狐表的ftp不够稳定



 回到顶部
总数 12 1 2 下一页