起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 347|回复: 5

【结贴】exceltotable控件问题**

[复制链接]
发表于 2008-7-31 16:22:39 | 显示全部楼层 |阅读模式
采用导入前创建com对象读取sheet名称的方式,通过代码创建fieldmap,这样就可以达到不论sheet名称是什么,都能正确导入的效果。但是如果多次导入时,后面导入的excel的sheet名称与前面导入的excel的sheet名称不同,就会报错,现在不得已只能每次导入动态创建一个新的exceltotable实例,导入后销毁的方式,版主给看看是不是控件的bug,如果不是请给找下原因
回复

使用道具 举报

发表于 2008-7-31 16:42:05 | 显示全部楼层
贴出你的代码看下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-8-1 10:00:13 | 显示全部楼层
procedure TMainForm.ImportExcel();
var
    i:integer;
    strErr:string;
    strFileName,strSheetName:string;
    workbooks, sourceworkbook, sourceworksheets, sourceworksheet,workbook, worksheets, worksheet: DispatchHelper;
    ExcelToTablePlan: TExcelToTable;
begin
    try
        InDataSetBroker.DataSet.Open;
        InDataSetBroker.DataSet.EmptyDataSet;
        if dlgOpen.Execute then
        begin
            docMoldPlanList.DataGrid.Cursor:=Business.Forms.Controls.crAppStart;
            strFileName:=dlgOpen.FileName;
            //读Excel的工作簿名称,多次导入使用同一进程
            if oExcel=nil then
                oExcel := ComObj.CreateOleObject('Excel.Application');
            if appExcel=nil then
                appExcel := DispatchHelper.Create(oExcel);
            if oWorkbooks=nil then
                oWorkbooks := appExcel.PropertyGet('WorkBooks',[]);
            try
                workbooks := System.DispatchHelper.Create(oWorkbooks);
                sourceworkbook := DispatchHelper.Create(workbooks.InvokeMethod('Open',[strFileName]));//打开文件
                sourceworksheets := System.DispatchHelper.Create(sourceworkbook.PropertyGet('Sheets',[]));
                sourceworksheet := System.DispatchHelper.Create(sourceworksheets.PropertyGet('Item',[1]));
                strSheetName:=ObjectHelper.ToString(sourceworksheet.PropertyGet('Name',[]));
            finally
                //关闭工作簿
                workbooks.InvokeMethod('Close', []);
            end;
            try
                //为解决多次导入sheet名称不同的excel时导入控件报错的问题,每次导入创建新控件
                ExcelToTablePlan:=TExcelToTable.Create(self);
                ExcelToTablePlan.FileName:=strFileName;
                ExcelToTablePlan.DataSource:=InDataSetBroker;
                ExcelToTablePlan.StartRow:=1;
                ExcelToTablePlan.EndRow:=1000;
                 //设置EXCEL的映射关系
                ExcelToTablePlan.FieldMap.Clear;
                for i:=1 to 100 do
                begin
                    ExcelToTablePlan.FieldMap.Add('DataSetInDataSet.YHZD'+SysUtils.IntToStr(i)+'='+strSheetName+'['+SysUtils.IntToStr(i)+',0]');
                end;

                ExcelToTablePlan.Execute(strErr);
                if strErr<>'' then
                    jsdialogs.ShowMsg(strErr,'');
            finally
                ExcelToTablePlan.Free;
            end;
            TrimDataSet(InDataSetBroker.DataSet);
        {TransData(InDataSetBroker.DataSet);
        SetUpMakeAddress(UserDataSet);
        docMoldPlanList.DataGrid.Cursor:=Business.Forms.Controls.crDefault;
        if ExamMoldID='1' then
        begin
        if not ValidateData(ProjectID,true) then
           PageGant.ActivePage:=TabSheet3;
        end
        else
        begin
            if not ValidateData(ProjectID,false) then
               PageGant.ActivePage:=TabSheet3;
        end;    }
    end;
    Except
        dialogs.ShowMessage('导入格式不正确');
        //UserDataSet.EmptyDataSet;
        InDataSetBroker.DataSet.EmptyDataSet;
    end;
end;

这是每次导入创建控件实例的代码,不会报错,如果把创建控件改成预先在窗体上画个控件,每次导入都使用它,当第二次导入的sheet名称与前面不同时就会报错
回复 支持 反对

使用道具 举报

发表于 2008-8-1 10:37:53 | 显示全部楼层
经过确认,应该是平台缺陷。
目前就只能通过动态创建的方式来做吧。
回复 支持 反对

使用道具 举报

发表于 2008-8-4 16:50:34 | 显示全部楼层
楼主,还有什么问题吗?
回复 支持 反对

使用道具 举报

发表于 2008-9-2 09:48:50 | 显示全部楼层
由于长期未反馈,揭帖。
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-21 15:49 , Processed in 0.040212 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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