📄 qimport3odt.pas
字号:
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 + -