fpspreadsheet: Fix reading/writing of ods files with quoted sheetnames (https://forum.lazarus.freepascal.org/index.php/topic,42396.msg295937.html#msg295937)

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6629 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2018-08-30 17:43:42 +00:00
parent 0ef3a22138
commit 72b96f5788

View File

@@ -961,6 +961,7 @@ var
prevC: Char; prevC: Char;
state: TScannerStateODS; state: TScannerStateODS;
val: Integer; val: Integer;
isQuotedSheetName: Boolean;
begin begin
FSheet1 := ''; FSheet1 := '';
FSheet2 := ''; FSheet2 := '';
@@ -970,6 +971,7 @@ begin
FCellRange.Col2 := Cardinal(-1); FCellRange.Col2 := Cardinal(-1);
FFlags := rfAllRel; FFlags := rfAllRel;
isQuotedSheetName := false;
state := ssInSheet1; state := ssInSheet1;
FToken := ''; FToken := '';
C := NextPos; C := NextPos;
@@ -999,10 +1001,22 @@ begin
FToken := ''; FToken := '';
end else end else
ScanError(rsIllegalODSCellRange); ScanError(rsIllegalODSCellRange);
'$': case state of '$': if (prevC in [#0, ':']) then
isQuotedSheetName := true
else
case state of
ssInCol1: if prevC = '.' then Exclude(FFlags, rfRelCol) else Exclude(FFlags, rfRelRow); ssInCol1: if prevC = '.' then Exclude(FFlags, rfRelCol) else Exclude(FFlags, rfRelRow);
ssInCol2: if prevC = '.' then Exclude(FFlags, rfRelCol2) else Exclude(FFlags, rfRelRow2); ssInCol2: if prevC = '.' then Exclude(FFlags, rfRelCol2) else Exclude(FFlags, rfRelRow2);
end; end;
'''': if isQuotedSheetName or (prevC in [#0, ':']) then begin
C := NextPos;
FToken := '';
while C <> '''' do begin
FToken := FToken + C;
C := NextPos;
end;
isQuotedSheetName := false;
end;
else else
if (state in [ssInSheet1, ssInSheet2]) then if (state in [ssInSheet1, ssInSheet2]) then
FToken := FToken + C FToken := FToken + C
@@ -3937,6 +3951,7 @@ end;
function TsCellExprNode.AsString: string; function TsCellExprNode.AsString: string;
var var
r, c: Cardinal; r, c: Cardinal;
s: String;
begin begin
if FError <> errOK then begin if FError <> errOK then begin
Result := GetErrorValueStr(FError); Result := GetErrorValueStr(FError);
@@ -3953,7 +3968,11 @@ begin
Result := Format('%s!%s', [GetQuotedSheetName, Result := Format('%s!%s', [GetQuotedSheetName,
GetCellString_R1C1(r, c, FFlags, FParser.FSourceCell^.Row, FParser.FSourceCell^.Col)]); GetCellString_R1C1(r, c, FFlags, FParser.FSourceCell^.Row, FParser.FSourceCell^.Col)]);
fdOpenDocument: fdOpenDocument:
Result := Format('[%s.%s]', [GetQuotedSheetName, GetCellString(r, c, FFlags)]); begin
s := GetQuotedSheetName;
if s[1] = '''' then s := '$' + s;
Result := Format('[%s.%s]', [s, GetCellString(r, c, FFlags)]);
end;
end end
end else end else
case FParser.Dialect of case FParser.Dialect of
@@ -4218,7 +4237,11 @@ begin
Result := GetCellRangeString_R1C1(s1, s2, r1, c1, r2, c2, FFlags, Result := GetCellRangeString_R1C1(s1, s2, r1, c1, r2, c2, FFlags,
FParser.FSourceCell^.Row, FParser.FSourceCell^.Col); FParser.FSourceCell^.Row, FParser.FSourceCell^.Col);
fdOpenDocument: fdOpenDocument:
begin
if (s1[1] = '''') then s1 := '$' + s1;
if (s2[1] = '''') then s2 := '$' + s2;
Result := GetCellRangeString_ODS(s1, s2, r1, c1, r2, c2, FFlags); Result := GetCellRangeString_ODS(s1, s2, r1, c1, r2, c2, FFlags);
end;
end end
else else
case FParser.Dialect of case FParser.Dialect of