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名称与前面不同时就会报错 |