⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qimport3odt.pas

📁 EMS Advanced.Import.Component.v3
💻 PAS
📖 第 1 页 / 共 2 页
字号:
          IsSpanning := true;
        end;
        if not Nodes[I].HasChildNodes then
          if (NumbOfRepRows > 0) or (NumbOfRepColumns > 0) then
          begin
              Table.X := Table.X + NumbOfRepColumns;
              Table.Y := Table.Y + NumbOfRepRows;
              if Table.X + 1 > Table.ColCount then
                Table.ColCount := Table.X + 1;
              if Table.RowCount - 1 > Table.Y then
               Table.Y := Table.RowCount;
              NumbOfRepColumns := 0;
              NumbOfRepRows := 0;
          end;
      end;
      if (Nodes[I].NodeName = 'table:table') then
        if Assigned(Nodes[I].attributes.getNamedItem('table:is-sub-table')) then
        begin
          Table.IsComplexTable := true;
          Table.IsAfterSubTable := true;
          TempSpreadSheet := TODTSpreadSheet.Create(nil);
          ParseTable(TempSpreadSheet, Nodes[I].childNodes, 0, 0, false);
          for J := 0 to TempSpreadSheet.Cells.Count - 1 do
          begin
            TempCell := Table.Cells.Add;
            TempCell.Row  := Table.Y + TempSpreadSheet.Cells[J].Row;
            TempCell.Col := Table.X + TempSpreadSheet.Cells[J].Col;
            TempCell.Value := TempSpreadSheet.Cells[J].Value;
          end;
          if Table.Y + TempSpreadSheet.FRowCount > Table.RowCount then
            Table.RowCount := Table.Y + TempSpreadSheet.RowCount;
          if Table.X + TempSpreadSheet.ColCount > Table.ColCount then
            Table.ColCount := Table.X + TempSpreadSheet.ColCount;
          Table.X := Table.X + TempSpreadSheet.ColCount - 1;
          TempSpreadSheet.Free;
          NumbOfRepRows := 0;
          NumbOfRepColumns := 0;
        end
        else
          continue;
      if (Nodes[I].HasChildNodes) and not (Table.IsAfterSubTable) then
        ParseTable(Table, Nodes[I].ChildNodes, NumbOfRepColumns,
           NumbOfRepRows, IsSpanning);
    end
    else
    begin
      if (NumbOfRepRows > 0) or (NumbOfRepColumns > 0) then
      begin
        ExpandRowsNCols(Table, Nodes[I].NodeValue,
          NumbOfRepRows, NumbOfRepColumns, IsSpanning);
        if not IsSpanning then
        begin
          Table.X := Table.X + NumbOfRepColumns;
          Table.Y := Table.Y + NumbOfRepRows;
        end;
      end
      else
      begin
        if assigned(Table.Cells.GetItemByCoords(Table.X, Table.Y)) then
          Table.Cells.GetItemByCoords(Table.X, Table.Y).Value :=
            Table.Cells.GetItemByCoords(Table.X, Table.Y).Value + #13#10 + Nodes[I].nodeValue
        else
        begin
          TempCell := Table.Cells.Add;
          TempCell.Row := Table.Y;
          TempCell.Col := Table.X;
          TempCell.Value := Nodes[I].nodeValue;
        end;
      end;
    end;
  end;
end;

procedure TODTWorkBook.ExpandRowsNCols(Table: TODTSpreadSheet;
  ExpandValue: qiString;
  NumbOfRepRows, NumbOfRepColumns: Integer; IsSpanning: Boolean);
var
  I: Integer;
  TempCell: TODTCell;
begin
  I := NumbOfRepRows;
  if Table.X + NumbOfRepColumns + 1 > Table.ColCount then
    Table.ColCount := Table.X + NumbOfRepColumns + 1;
  if Table.Y + NumbOfRepRows + 1 > Table.RowCount then
    Table.RowCount := Table.Y + NumbOfRepRows + 1;
  if NumbOfRepColumns >= 0 then
  begin
    repeat
      if not IsSpanning
      then
        if assigned(Table.Cells.GetItemByCoords(Table.X + NumbOfRepColumns, Table.Y + I)) then
          Table.Cells.GetItemByCoords(Table.X + NumbOfRepColumns, Table.Y + I).Value :=
            Table.Cells.GetItemByCoords(Table.X + NumbOfRepColumns, Table.Y + I).Value + ' ' + ExpandValue
        else
        begin
          TempCell := Table.Cells.Add;
          TempCell.Row := Table.Y + I;
          TempCell.Col := Table.X + NumbOfRepColumns;
          TempCell.Value := ExpandValue;
        end
      else
        if (NumbOfRepColumns = 0) and (I = 0) then
        begin
          if assigned(Table.Cells.GetItemByCoords(Table.X, Table.Y)) then
            Table.Cells.GetItemByCoords(Table.X, Table.Y).Value :=
              Table.Cells.GetItemByCoords(Table.X, Table.Y).Value + ' ' + ExpandValue
          else
          begin
            TempCell := Table.Cells.Add;
            TempCell.Row := Table.Y;
            TempCell.Col := Table.X;
            TempCell.Value := ExpandValue;
          end;
        end;
      I := I - 1;
    until (I < 0);
    ExpandRowsNCols(Table, ExpandValue, NumbOfRepRows,
      NumbOfRepColumns - 1, IsSpanning);
  end;
end;

procedure TODTWorkbook.SetSpreadSheets;
var
  SRec: TSearchRec;
begin
  try
    if FindFirst(FWorkDir + 'content.xml', faDirectory, SRec) = 0 then
    begin
      FindTables(FWorkDir + 'content.xml');
    end
    else
      FindTables(FWorkDir + FileName);
  finally
    FindClose(SRec);
  end;
end;

constructor TODTWorkbook.Create;
begin
  FXMLDoc := CoDOMDocument.Create;
  FSpreadSheets := TODTSpreadSheetList.Create(TODTSpreadSheet);
  FWorkDir := '';
  FileName := '';
end;

destructor TODTWorkbook.Destroy;
begin
  FXMLDoc := nil;
  if Assigned(FSpreadSheets) then
    FSpreadSheets.Free;
  inherited;
end;

procedure TODTWorkbook.Load;
begin
  if FWorkDir <> '' then
  begin
    SetSpreadSheets;
  end;
end;

{ TODTFile }

procedure TODTFile.LoadXML(WorkDir: string);
begin
  FWorkbook.WorkDir := WorkDir;
  FWorkbook.Load;
end;

constructor TODTFile.Create;
begin
  inherited;
  FWorkbook := TODTWorkbook.Create;
end;

destructor TODTFile.Destroy;
begin
  if Assigned(FWorkbook) then
    FWorkbook.Free;
  inherited;
end;

{TQImport3ODT}

procedure TQImport3ODT.AfterImport;
begin
  FODTFile.Free;
  inherited;
end;

procedure TQImport3ODT.BeforeImport;
begin
  inherited;
  FODTFile := TODTFile.Create;
  FODTFile.FileName := FileName;
  FODTFile.Load;
  if Assigned(FODTFile.Workbook.SpreadSheets.GetSheetByName(FSheetName)) then
    FTotalRecCount := FODTFile.Workbook.SpreadSheets.GetSheetByName(FSheetName).RowCount;
end;

procedure TQImport3ODT.ChangeCondition;
begin
 inc(FCounter);
end;

function TQImport3ODT.CheckCondition: Boolean;
begin
  Result := FCounter < FTotalRecCount;
end;

constructor TQImport3ODT.Create(AOwner: TComponent);
begin
  inherited;
  SkipFirstRows := 0;
  FUseHeader := false;
  FUseComplexTables := true;
end;

procedure TQImport3ODT.DoLoadConfiguration(IniFile: TIniFile);
begin
  inherited;
  with IniFile do
  begin
    SkipFirstRows := ReadInteger(ODT_OPTIONS, ODT_SKIP_LINES, SkipFirstRows);
    SheetName := ReadString(ODT_OPTIONS, ODT_SHEET_NAME, SheetName);
    UseHeader := ReadBool(ODT_OPTIONS, ODT_USE_HEADER, UseHeader);
    UseComplexTables := ReadBool(ODT_OPTIONS, ODT_COMPLEX_TABLE, UseComplexTables);
  end;
end;

procedure TQImport3ODT.DoSaveConfiguration(IniFile: TIniFile);
begin
  inherited;
  with IniFile do
  begin
    WriteInteger(ODT_OPTIONS, ODT_SKIP_LINES, SkipFirstRows);
    WriteString(ODT_OPTIONS, ODT_SHEET_NAME, SheetName);
    WriteBool(ODT_OPTIONS, ODT_USE_HEADER, UseHeader);
    WriteBool(ODT_OPTIONS, ODT_COMPLEX_TABLE, UseComplexTables);
  end;
end;

procedure TQImport3ODT.FillImportRow;
var
  i, k: Integer;
  strValue: qiString;
  p: Pointer;
  mapValue: string;
begin
  FImportRow.ClearValues;
  for i := 0 to FImportRow.Count - 1 do
  begin
    if FImportRow.MapNameIdxHash.Search(FImportRow[i].Name, p) then
    begin
      k := Integer(p);
{$IFDEF VCL7}
      mapValue := Map.ValueFromIndex[k];
{$ELSE}
      mapValue := Map.Values[FImportRow[i].Name];
{$ENDIF}      
      strValue := FODTFile.Workbook.SpreadSheets.GetSheetByName(FSheetName).DataCells.Cells[GetColIdFromColIndex(mapValue) - 1, FCounter];
      FImportRow.SetValue(Map.Names[k], strValue, False);
    end;
    DoUserDataFormat(FImportRow[i]);
  end;
end;

procedure TQImport3ODT.FinishImport;
begin
  if not Canceled and not IsCSV then
  begin
    if CommitAfterDone then
      DoNeedCommit
    else if (CommitRecCount > 0) and ((ImportedRecs + ErrorRecs) mod CommitRecCount > 0) then
      DoNeedCommit;
  end;
end;

function TQImport3ODT.ImportData: TQImportResult;
begin
  Result := qirOk;
  try
    try
      if Canceled  and not CanContinue then
      begin
        Result := qirBreak;
        Exit;
      end;
      DataManipulation;
    except
      on E:Exception do
      begin
        try
          DestinationCancel;
        except
        end;
        DoImportError(E);
        Result := qirContinue;
        Exit;
      end;
    end;
  finally
    if (not IsCSV) and (CommitRecCount > 0) and not CommitAfterDone and
       ((ImportedRecs + ErrorRecs) mod CommitRecCount = 0) then
      DoNeedCommit;
    if (ImportRecCount > 0) and
       ((ImportedRecs + ErrorRecs) mod ImportRecCount = 0) then
      Result := qirBreak;
  end;
end;

procedure TQImport3ODT.SetSheetName(const Value: string);
begin
  if (FSheetName <> Value) then
    FSheetName := Value;
end;


function TQImport3ODT.Skip: Boolean;
begin
  if not (UseHeader) then
    Result := (SkipFirstRows > 0) and (FCounter < SkipFirstRows)
  else
    Result := ((SkipFirstRows + 1) > 0) and (FCounter < (SkipFirstRows + 1));
end;

procedure TQImport3ODT.StartImport;
begin
  inherited;
  if (FODTFile.Workbook.SpreadSheets.GetSheetByName(FSheetName).IsComplexTable)
    and not (UseComplexTables) then
    raise EQImportError.Create('Trying to convert complex tables');
  FCounter := 0;
end;

{$ENDIF}
{$ENDIF}

end.






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -