📄 xlsmapparser3.pas
字号:
then MapRange.Direction := rdDown
else MapRange.Direction := rdUp;
RangeType := rtCol;
end;
State := 3;
end
else raise Exception.CreateFmt(sUnexpectedKeyword,
[COLSTART + ', ' + COLFINISH + ', ' +
ROWSTART + ' or ' + ROWFINISH, Buf]);
end
else begin
if Assigned(MapRange) then
MapRange.Col1 := T;
State := 6;
end;
end;
else
raise Exception.CreateFmt(sUnexpectedSymbol, [Ch, i]);
end;
2: case SymbolType of
stNumber: State := 2;
stRange: begin // Buf contains row number (single cell)
T := Number2Row(Buf);
CheckRowNumber(T);
SheetFlag := false;
if Assigned(MapRange) then
begin
MapRange.Row1 := T;
MapRange.Col2 := MapRange.Col1;
MapRange.Row2 := MapRange.Row1;
end;
State := 0;
end;
stArray: begin // Buf contains row number of the first cell of range.
T := Number2Row(Buf);
CheckRowNumber(T);
if Assigned(MapRange) then
MapRange.Row1 := T;
State := 3;
end;
else
raise Exception.CreateFmt(sUnexpectedSymbol, [Ch, i]);
end;
3: begin
Buf := EmptyStr;
case SymbolType of
stLetter: State := 4;
else begin
if IsRange(Ch)
then raise Exception.CreateFmt(sLetterExpected, ['end of range', i])
else raise Exception.CreateFmt(sLetterExpected, [Ch, i]);
end;
end;
end;
4: case SymbolType of
stLetter: State := 4;
stNumber: begin // Buf contains col name of the second cell in the range
T := Letter2Col(Buf);
CheckColNumber(T);
if Assigned(MapRange) then MapRange.Col2 := T;
Buf := EmptyStr;
State := 5;
end;
stRange: begin
if IsKeyword(Buf) then // Buf contains keyword
begin
SheetFlag := false;
if Assigned(MapRange) then
if IsRowKeyword(Buf) then
begin
MapRange.Row2 := MapRange.Row1;
if IsRowStart(Buf)
then MapRange.Direction := rdUp
else MapRange.Direction := rdDown;
end
else begin
MapRange.Col2 := MapRange.Col1;
if IsColStart(Buf)
then MapRange.Direction := rdUp
else MapRange.Direction := rdDown;
end;
State := 0;
end
else raise Exception.CreateFmt(sUnexpectedKeyword,
[COLSTART + ', ' + COLFINISH + ', ' +
ROWSTART + ' or ' + ROWFINISH, Buf]);
end;
else raise Exception.CreateFmt(sUnexpectedSymbol, [Ch, i]);
end;
5: case SymbolType of
stNumber: State := 5;
stRange: begin // Buf contains row number of the second cell in the range
T := Number2Row(Buf);
CheckRowNumber(T);
if Assigned(MapRange) then
begin
MapRange.Row2 := T;
if RangeType = rtCol then
MapRange.Col1 := MapRange.Col2
else if RangeType = rtRow then
MapRange.Row1 := MapRange.Row2
else if RangeType = rtUnknown then
begin
if (MapRange.Col1 = MapRange.Col2) or
(MapRange.Row1 = MapRange.Row2) then
begin
if (MapRange.Col1 < MapRange.Col2) or
(MapRange.Row1 < MapRange.Row2) then
MapRange.Direction := rdDown
else if (MapRange.Col1 > MapRange.Col2) or
(MapRange.Row1 > MapRange.Row2) then
MapRange.Direction := rdUp;
end
else
raise Exception.CreateFmt(sRangeFail,
[Col2Letter(MapRange.Col1) + Row2Number(MapRange.Row1) + '-' +
Col2Letter(MapRange.Col2) + Row2Number(MapRange.Row2)]);
end;
RangeType := rtUnknown;
end;
SheetFlag := false;
State := 0;
end;
else raise Exception.CreateFmt(sUnexpectedSymbol, [Ch, i]);
end;
6: case SymbolType of
stLetter: begin
Buf := EmptyStr;
State := 7;
end
else begin
if IsRange(Ch)
then raise Exception.CreateFmt(sLetterExpected, ['end of range', i])
else raise Exception.CreateFmt(sLetterExpected, [Ch, i]);
end;
end;
7: case SymbolType of
stLetter: State := 7;
stRange: begin
if IsColKeyword(Buf) then // Buf contains col keyword
begin
if Assigned(MapRange) then
begin
MapRange.Col2 := MapRange.Col1;
if IsColStart(Buf)
then MapRange.Direction := rdUp
else MapRange.Direction := rdDown;
end;
SheetFlag := false;
State := 0;
end
else
raise Exception.CreateFmt(sUnexpectedKeyword,
[COLSTART + ' or ' + COLFINISH, Buf]);
end;
else raise Exception.CreateFmt(sUnexpectedSymbol, [Ch, i]);
end;
8: case SymbolType of
stNumber: State := 8;
stArray: begin // Buf contains row number
T := Number2Row(Buf);
CheckRowNumber(T);
if Assigned(MapRange) then
MapRange.Row1 := T;
State := 9;
end;
else
raise Exception.CreateFmt(sUnexpectedSymbol, [Ch, i]);
end;
9: begin
Buf := EmptyStr;
case SymbolType of
stLetter: State := 10;
else begin
if IsRange(Ch)
then raise Exception.CreateFmt(sLetterExpected, ['end of range', i])
else raise Exception.CreateFmt(sLetterExpected, [Ch, i]);
end;
end;
end;
10: case SymbolType of
stLetter: State := 10;
stRange: begin
if IsRowKeyword(Buf) then // Buf contains row keyword
begin
if Assigned(MapRange) then
begin
MapRange.Row2 := MapRange.Row1;
if IsRowStart(Buf)
then MapRange.Direction := rdUp
else MapRange.Direction := rdDown;
end;
SheetFlag := false;
State := 0;
end
else
raise Exception.CreateFmt(sUnexpectedKeyword,
[ROWSTART + ' or ' + ROWFINISH, Buf]);
end;
else
raise Exception.CreateFmt(sUnexpectedSymbol, [Ch, i]);
end;
11: begin
Buf := EmptyStr;
if not IsIllegalInSheet(Ch) then
State := 12
else if IsSheetNumber(Ch) then
State := 13
else
raise Exception.CreateFmt(sIllegalSheetChar, [Ch, i]);
{case SymbolType of
stLetter: State := 12;
stNumber: State := 12;
stSheetNumber: State := 13;
else begin
if IsRange(Ch)
then raise Exception.CreateFmt(sLetterOrNumberExpected, ['end of range', i])
else raise Exception.CreateFmt(sLetterOrNumberExpected, [Ch, i]);
end;
end;}
end;
12: begin
if not IsIllegalInSheet(Ch) then
State := 12
else if IsSheetFinish(Ch) then
begin
if Assigned(MapRange) then
begin
MapRange.SheetIDType := sitName;
MapRange.SheetName := Buf;
end;
SheetFlag := true;
State := 0;
end
else
raise Exception.CreateFmt(sIllegalSheetChar, [Ch, i]);
{ case SymbolType of
stLetter: State := 12;
stNumber: State := 12;
stSheetFinish: begin // buff contains sheet name
if Assigned(MapRange) then begin
MapRange.SheetIDType := sitName;
MapRange.SheetName := Buf;
end;
SheetFlag := true;
State := 0;
end;
else begin
if IsIllegalInSheet(Ch)
then raise Exception.CreateFmt(sIllegalSheetChar, [Ch, i]);
end;
end;}
end;
13: case SymbolType of
stNumber: begin
Buf := EmptyStr;
State := 14;
end;
else raise Exception.CreateFmt(sUnexpectedSymbol, [Ch, i]);
end;
14: case SymbolType of
stNumber: State := 14;
stSheetFinish: begin // buff contains sheet name
if Assigned(MapRange) then
begin
MapRange.SheetIDType := sitNumber;
MapRange.SheetNumber := StrToInt(Buf);
end;
SheetFlag := true;
State := 0;
end;
else
raise Exception.CreateFmt(sUnexpectedSymbol, [Ch, i]);
end;
end;
except
if Assigned(MapRange) then
MapRange.Free;
raise;
end;
Buf := Buf + Ch;
end;
if Assigned(MapRow) and Assigned(MapRange) then
MapRow.Add(MapRange);
end;
procedure ParseCellString(const CellString: string; var Col, Row: integer);
type
TState = 0..2;
var
i: integer;
Str: string;
State: TState;
Ch: char;
SymbolType: TSymbolType;
Buf: string;
T: integer;
begin
Str := CellString;
if Str = EmptyStr then
raise Exception.Create(sCellIsEmpty);
Str := AnsiUpperCase(Trim(Str));
if Str[Length(Str)] <> RANGE_DELIMITER then
Str := Str + RANGE_DELIMITER;
State := 0;
Buf := EmptyStr;
for i := 1 to Length(Str) do begin
Ch := Str[i];
SymbolType := GetSymbolType(Ch);
if SymbolType = stUnknown then
raise Exception.CreateFmt(sUnknownSymbol, [Ch, i]);
case State of
0: case SymbolType of
stLetter: State := 1;
else raise Exception.CreateFmt(sUnexpectedSymbol, [Ch, i]);
end;
1: case SymbolType of
stLetter: State := 1;
stNumber: begin
T := Letter2Col(Buf);
CheckColNumber(T);
Buf := EmptyStr;
Col := T;
State := 2;
end;
else begin
if IsRange(Ch)
then raise Exception.CreateFmt(sNumberExpected, ['end of range', i])
else raise Exception.CreateFmt(sNumberExpected, [Ch, i]);
end;
end;
2: case SymbolType of
stNumber: State := 2;
stRange: begin
T := Number2Row(Buf);
CheckRowNumber(T);
if i <> Length(Str) then
raise Exception.Create(sSoLongCellDefinition);
Row := T;
end;
else raise Exception.CreateFmt(sUnexpectedSymbol, [Ch, i]);
end;
end;
Buf := Buf + Ch;
end;
end;
procedure ParseColString(const ColString: string; var Col: integer);
type
TState = 0..1;
var
i: integer;
Str: string;
State: TState;
Ch: char;
SymbolType: TSymbolType;
Buf: string;
T: integer;
begin
Str := ColString;
if Str = EmptyStr then
raise Exception.Create(sColIsEmpty);
Str := AnsiUpperCase(Trim(Str));
if Str[Length(Str)] <> RANGE_DELIMITER then
Str := Str + RANGE_DELIMITER;
State := 0;
Buf := EmptyStr;
for i := 1 to Length(Str) do begin
Ch := Str[i];
SymbolType := GetSymbolType(Ch);
if SymbolType = stUnknown then
raise Exception.CreateFmt(sUnknownSymbol, [Ch, i]);
case State of
0: case SymbolType of
stLetter: State := 1;
else raise Exception.CreateFmt(sLetterExpected, [Ch, i]);
end;
1: case SymbolType of
stLetter: State := 1;
stRange: begin
T := Letter2Col(Buf);
CheckColNumber(T);
if i <> Length(Str) then
raise Exception.Create(sSoLongColDefinition);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -