以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  导出excel模板的报表速度过慢  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=130699)

--  作者:lur320
--  发布时间:2019/1/29 14:16:00
--  导出excel模板的报表速度过慢
导出excel模板的速度过慢。
测试过赋值各个var的变量速度很快,就是到下面这段代码前都很快。慢在启动excel很慢。
请问如何优化下面这段代码。或者在打开窗体的时候,事前在后台启动好模板而不是在最后  Book.Build()?

Dim Book As New XLS.Book(ProjectPath & "。。。。。.xlsx")
 Dim Sheet As XLS.Sheet = Book.Sheets(0) \'引用工作簿的第一个工作表
                With Sheet.PrintSetting
                    .PaperKind = 9 \'设为A4纸
                    .LandScape = True \'横向打印
                    .MarginTop=12
                    .MarginBottom=16
                    .AutoScale = True \'自动缩放
                    .FitPagesAcross = 1 \'垂直方向缩为1页
                    .FitPagesDown=1
                End With
                Book.Build() \'生成细节区
                Book.SaveToPDF(fls) \'保存为PDF文件


--  作者:有点甜
--  发布时间:2019/1/29 14:45:00
--  

1、是build慢,还是savetopdf慢?

 

2、是不是你excel报表要生成的数据过多?

 

3、做个例子发上来测试。


--  作者:lur320
--  发布时间:2019/1/29 15:22:00
--  

是build慢


--  作者:有点甜
--  发布时间:2019/1/29 15:37:00
--  
以下是引用lur320在2019/1/29 15:22:00的发言:

是build慢

 

那就是你build的数据过多的原因。做个例子测试。看是否有优化空间。


--  作者:lur320
--  发布时间:2019/1/30 13:22:00
--  
也还不算多,大约使用了25个var的变量,每个var都来自于数据库的25个行。这些行都有一个索引编号。
例如编号为1的有25行。由于单元格都是加密的,只能解密后赋值给var。

但是这些动作都很快,25个var赋值完毕后,就开始慢了。

--  作者:有点甜
--  发布时间:2019/1/30 13:26:00
--  
具体实例,发上来测试。
--  作者:lur320
--  发布时间:2019/1/30 13:33:00
--  
实例太复杂了。要从系统里面剥离很多东西。
我把代码分为2段,1段给25个var赋值。耗时0.017秒
第二段代码在下面,第二段代码耗时3.35秒。

Dim st22 As Date = Date.Now

            If filterstring1="findpo1" Then
               
                Dim Book As New XLS.Book(ProjectPath & "Attachments\\ApprovalPR.xlsx")
                Dim fls As String = SpecialFolder.DesktopDirectory & "\\PR文件夹\\" &  Vars("customername") & "-" & Vars("POname") & "(PR).pdf"
                
                If FileSys.DirectoryExists( SpecialFolder.DesktopDirectory & "\\PR文件夹")=False Then
                    FileSys.CreateDirectory( SpecialFolder.DesktopDirectory & "\\PR文件夹")
                End If
                Dim newfname As String
                newfname=Vars("customername") & "-" & Vars("POname") & "(PR).pdf"
                ShowAppWindow(newfname,5)
                
                Dim Sheet As XLS.Sheet = Book.Sheets(0) \'引用工作簿的第一个工作表
                With Sheet.PrintSetting
                    .PaperKind = 9 \'设为A4纸
                    .LandScape = True \'横向打印
                    .MarginTop=12
                    .MarginBottom=16
                    .AutoScale = True \'自动缩放
                    .FitPagesAcross = 1 \'垂直方向缩为1页
                    .FitPagesDown=1
                End With
                Book.Build() \'生成细节区
                Book.SaveToPDF(fls) \'保存为PDF文件
              

                If podr IsNot Nothing And podr.Isnull("fileinfo")=False Then
                    Dim ex As String
                    ex=podr("fileinfo")
                    fl =  SpecialFolder.DesktopDirectory & "\\PR文件夹\\" & Vars("customername") & "-" & Vars("POname") & "(手工PO).zip"
                    podr.SQLLoadFile("poattachment",fl)
                End If
                
MessageBox.Show("耗时: " & (Date.Now - st22).TotalSeconds & "秒") 


--  作者:lur320
--  发布时间:2019/1/30 13:36:00
--  
更新了下代码。
 Dim st1 As Date = Date.Now

                Dim Sheet As XLS.Sheet = Book.Sheets(0) \'引用工作簿的第一个工作表
                With Sheet.PrintSetting
                    .PaperKind = 9 \'设为A4纸
                    .LandScape = True \'横向打印
                    .MarginTop=12
                    .MarginBottom=16
                    .AutoScale = True \'自动缩放
                    .FitPagesAcross = 1 \'垂直方向缩为1页
                    .FitPagesDown=1
                End With
                Book.Build() \'生成细节区
                Book.SaveToPDF(fls) \'保存为PDF文件
                Dim st2 As Date = Date.Now

                \'
                If podr IsNot Nothing And podr.Isnull("fileinfo")=False Then
                    Dim ex As String
                    ex=podr("fileinfo")
                    fl =  SpecialFolder.DesktopDirectory & "\\PR文件夹\\" & Vars("customername") & "-" & Vars("POname") & "(手工PO).zip"
                    podr.SQLLoadFile("poattachment",fl)
                End If
                th2.Start()
                
MessageBox.Show("耗时: " & (Date.Now - st2).TotalSeconds & "秒")   0.01秒
MessageBox.Show("耗时: " & (st2 - st1).TotalSeconds & "秒")   黄字部分3.6秒


--  作者:lur320
--  发布时间:2019/1/30 13:40:00
--  
Dim st2 As Date = Date.Now

                Book.Build() \'生成细节区  0.15秒
Dim st1 As Date = Date.Now
                Book.SaveToPDF(fls) \'保存为PDF文件  3.2秒
               MessageBox.Show("耗时: " & (Date.Now - st1).TotalSeconds & "秒")
MessageBox.Show("耗时: " & (st2 - st1).TotalSeconds & "秒")

终于查明了,但是为何?

--  作者:有点甜
--  发布时间:2019/1/30 13:41:00
--  

 

[此贴子已经被作者于2019/1/30 13:41:35编辑过]