以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  内存溢出异常  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=189038)

--  作者:超古伯
--  发布时间:2023/11/7 1:13:00
--  内存溢出异常
图片点击可在新窗口打开查看
excel报表插入很多图片,提示内存溢出异常
如果在循环插入图片的代码里面写img.dispose,会导致最后Book.save的时候报错“参数无效”
最终img.dispose写了在代码的最后面,也写了gc.collect,但是多次运行后会提示内存溢出异常
请问下跟图片相关的及时释放内存的代码该怎么写,放在什么位置,谢谢

--  作者:有点蓝
--  发布时间:2023/11/7 8:33:00
--  
请贴出具体代码说明问题
--  作者:超古伯
--  发布时间:2023/11/7 19:46:00
--  
 
    Dim Sheet2 As XLS.Sheet = Book.Sheets(0)

    Dim img As Image
    For pg As Integer = 0 To vars("pg") - 1
        
        img = getImage(qzs(rand.Next(0, qzs.Count)))
        Dim cz As Integer = Rand.Next (1, 4)
        Select Case cz
            Case 1
                img.RotateFlip(RotateFlipType.Rotate90FlipNone)
            Case 2
                img.rotateflip(RotateFlipType.Rotate180FlipNone)
            Case 3
                img.rotateflip(RotateFlipType.Rotate270FlipNone)
        End Select
        Sheet2(pg * 21 + 13, 13).Value = New XLS.Picture(img, 0, 0, 100, img.Height / img.Width * 100)
        
    Next
    
    Book.Save(fl)
     img.Dispose
    gc.Collect

--  作者:有点蓝
--  发布时间:2023/11/7 20:17:00
--  
试试
Dim Sheet2 As XLS.Sheet = Book.Sheets(0)
    For pg As Integer = 0 To vars("pg") - 1
        Dim img As Image= getImage(qzs(rand.Next(0, qzs.Count)))
        Dim cz As Integer = Rand.Next (1, 4)
        Select Case cz
            Case 1
                img.RotateFlip(RotateFlipType.Rotate90FlipNone)
            Case 2
                img.rotateflip(RotateFlipType.Rotate180FlipNone)
            Case 3
                img.rotateflip(RotateFlipType.Rotate270FlipNone)
        End Select
        Sheet2(pg * 21 + 13, 13).Value = New XLS.Picture(img, 0, 0, 100, img.Height / img.Width * 100)
         img.Dispose
         gc.Collect
    Next
    
    Book.Save(fl)
    gc.Collect

--  作者:超古伯
--  发布时间:2023/11/7 20:37:00
--  
图片点击可在新窗口打开查看
这个方法我也测试过了,在Book.Save之前注释掉任何操作,只要出现img.Dispose这一句就保存不了,就会提示参数无效

--  作者:超古伯
--  发布时间:2023/11/7 20:41:00
--  
循环那里加img.Dispose的情况,我是在Book.Save上一行加的msgbox,可以运行到这个弹窗,也没有报内存溢出了,但是就是不能保存,也测试了Book是还存在的,可以输出Book第一个表的名称
--  作者:有点蓝
--  发布时间:2023/11/7 20:49:00
--  
换种方式,使用vba添加图片:http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=147456&replyID=61001&skin=1
--  作者:超古伯
--  发布时间:2023/11/7 20:55:00
--  
vba的方法也有问题,添加的图片多了,图片的位置越来越偏,刚开始时图片跟插入图片的那行顶对齐的,越到后面图片越往上偏,用的是一样的代码,只是循环插入
--  作者:有点蓝
--  发布时间:2023/11/7 21:03:00
--  
代码发上来看看
--  作者:超古伯
--  发布时间:2023/11/7 21:05:00
--  
另外New XLS.Book这个也有个问题,细节区引用了图片,Book.Build()后保存,再New XLS.Book这个保存的文件,保存打开就会出现很多原先细节区生成的图片都丢失了