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

📄 xlsmapparser3.pas

📁 Advanced Data Import Component Suite for Borland Delphi and C++ Builder allows you to import your da
💻 PAS
📖 第 1 页 / 共 5 页
字号:
                       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 + -