以文本方式查看主题
- Foxtable(狐表) (http://foxtable.net/bbs/index.asp)
-- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2)
---- [求助]ftp较多图片导出excel时经常连接服务器失败 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=92614)
|
-- 作者:chen3728060
-- 发布时间:2016/11/8 14:29:00
-- [求助]ftp较多图片导出excel时经常连接服务器失败
写了一个把父表和对应子表数据导出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
-- 发布时间:2016/11/8 14:33:00
--
此主题相关图片如下:5.jpg
[此贴子已经被作者于2016/11/8 14:38:36编辑过]
|
-- 作者:有点蓝
-- 发布时间:2016/11/8 14:37:00
--
可以先下载所有图片到本地,再通过本地图片打印
|
-- 作者:chen3728060
-- 发布时间:2016/11/8 14:52:00
-- 回复:(有点蓝)可以先下载所有图片到本地,再通过本...
是下载这个子表里所有的图片吗?
有些图片列里有几个图片的,我不知道怎么下载,好像帮助里的ftp下载都是填某个图片的路径,然后实际有多个图片时,不知道怎么下载
[此贴子已经被作者于2016/11/8 15:00:42编辑过]
|
-- 作者:有点蓝
-- 发布时间:2016/11/8 15:03:00
--
参考:http://www.foxtable.com/webhelp/scr/2717.htm
|
-- 作者:chen3728060
-- 发布时间:2016/11/8 18:06:00
-- 回复:(有点蓝)参考:http://www.foxtable.com/webh...
提前遍历下载,也一样会出现连接服务器失败,因为它本质也是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
-- 发布时间:2016/11/8 18:08:00
--
可以说问题应该是出在ftp批量下载时,无法连续下载照片,ftp不够稳定,不知道是哪里出的问题,你们有时候ftp大量下载文件或照片吗?如果我用 FlashFtp这样的传统ftp工具,连接上我阿里云去ftp下载,无论多少文件都可以稳定传输,是不是狐表的ftp稳定性问题?
|
-- 作者:有点色
-- 发布时间: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
|
-- 作者:有点蓝
-- 发布时间:2016/11/8 20:11:00
--
试试用IIS做ftp服务,这个和Foxtable的兼容性好点
|
-- 作者:chen3728060
-- 发布时间:2016/11/8 20:13:00
-- 回复:(有点色)以下是引用chen3728060在2016/11/8 1...
\'----下载子表所有图片,再引用 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不够稳定
|