起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1016|回复: 24

【结】关于ExcelToTable控件吃内存的问题

[复制链接]
发表于 2009-11-21 17:43:41 | 显示全部楼层 |阅读模式
请问ExcelToTable控件在执行导入后,为何有没释放的内存呢,
我用程序执行导入一个100列,10多行的表格到数据集内,每次bussiness.exe内存都增加20m左右,那个数据集我每次导入之前都会先EmptyDataSet,而且关闭当前窗口也不会释放,只有关闭客户端才会释放
回复

使用道具 举报

发表于 2009-11-22 13:35:10 | 显示全部楼层
把你的代码贴出来看看呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-11-23 11:43:12 | 显示全部楼层
procedure TMainForm.ImportExcel();
var
    i:integer;
    strErr:string;
    strFileName,strSheetName:string;
    excelHande:TExcelHandling;
    startRow,endRow,startColumn:Integer;
    ExcelToTablePlan: TExcelToTable;
begin
    try
        if dlgOpen.Execute then
        begin
            InDataSetBroker.DataSet.Open;
            InDataSetBroker.DataSet.EmptyDataSet;
            docMoldPlanList.DataGrid.Cursor:=Business.Forms.Controls.crAppStart;
            dlgOpen.Filter := 'Excel 97-2003 工作簿(*.xls)|*.xls|Excel 2007 工作薄(*.xlsx)|*.xlsx';
            dlgOpen.Title := '请选择要导入的计划数据文件';
            strFileName:=dlgOpen.FileName;
            //读Excel的工作簿名称
            try
                excelHande:=TExcelHandling.Create(strFileName);
                strSheetName := excelHande.ActiveSheetName;
                excelHande.AvailableRowsCount(strSheetName);
                startRow := excelhande.AvailableStartRow;
                endRow := startRow + excelHande.AvailableRowCount -1;
                startColumn:=excelHande.AvailableStartColumn;
            finally
                excelHande.Free;
            end;
            try
                //为解决多次导入sheet名称不同的excel时导入控件报错的问题,每次导入创建新控件
                ExcelToTablePlan:=TExcelToTable.Create(self);
                ExcelToTablePlan.FileName:=strFileName;
                ExcelToTablePlan.DataSource:=InDataSetBroker;
                ExcelToTablePlan.StartRow:=startRow;
                ExcelToTablePlan.EndRow:=endRow;
                 //设置EXCEL的映射关系
                ExcelToTablePlan.FieldMap.Clear;
                for i:=1 to 100 do
                begin
                    ExcelToTablePlan.FieldMap.Add('DataSetInDataSet.YHZD'+SysUtils.IntToStr(i)+'='+strSheetName+'['+SysUtils.IntToStr(startColumn-1+i)+',0]');
                end;

                ExcelToTablePlan.Execute(strErr);
                if strErr<>'' then
                    jsdialogs.ShowMsg(strErr,'');
            finally
                ExcelToTablePlan.Free;
            end;
            SetUpMakeAddress(InDataSetBroker.DataSet);
            docMoldPlanList.ImportToUserDS(InDataSetBroker.DataSet);
            docMoldPlanList.DataGrid.Cursor:=Business.Forms.Controls.crDefault;
            docMoldPlanList.ValidateData(lvwError);
        end;
    Except
        dialogs.ShowMessage('导入格式不正确');
        InDataSetBroker.DataSet.EmptyDataSet;
    end;
end;
回复 支持 反对

使用道具 举报

发表于 2009-11-23 12:04:19 | 显示全部楼层
呵呵,楼主 用 “ExcelToTable*内存”在 bbs 上搜索一下吧,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-11-23 13:43:36 | 显示全部楼层
只有两个相关帖子,貌似说缺陷已经解决,但我的版本是3002 ,吃内存问题依然存在
回复 支持 反对

使用道具 举报

发表于 2009-11-23 14:39:10 | 显示全部楼层
楼主,我没有你这个版本,你这样尝试一下,就是http://bbs.justep.com/forum.php?mod=viewthread&tid=21567  这个4楼说用代码来创建一下 ExcelToTable  ,然后释放。

另外,你的代码写的有点不规范,try应该写在create后面,而不是前面。例如
...
try
   excelHande:=TExcelHandling.Create(strFileName);
...
应该写成
...
excelHande:=TExcelHandling.Create(strFileName);
try
...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-11-23 15:47:52 | 显示全部楼层
摆脱你仔细看一下好不好,我就是代码创建的exceltotable,然后释放的
回复 支持 反对

使用道具 举报

发表于 2009-11-23 16:07:59 | 显示全部楼层
请稍等,我们这边测试下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-11-24 11:40:44 | 显示全部楼层
?????
回复 支持 反对

使用道具 举报

发表于 2009-11-24 13:01:44 | 显示全部楼层
还请楼主等等,我这边还没有结果。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-12 06:17 , Processed in 0.041052 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表