fpspreadsheet: Refactor internal DoIF procedure for calculation of COUNTIF, SUMIF, AVERAGEIF. Prepared from COUNTIFS, SUMIFS, AVERAGEIFS, but not yet working correctly. Add unit test cases for COUNTIF and SUMIF.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9363 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz 2024-06-03 21:31:47 +00:00
parent ff870471ce
commit 8ff431d05e
5 changed files with 772 additions and 232 deletions

File diff suppressed because it is too large Load Diff

View File

@ -2410,7 +2410,7 @@ end;
@param ACompareOp Identifier for the comparing operation extracted - see TsCompareOperation
@returns Input string with the comparing characters stripped.
-------------------------------------------------------------------------------}
function AnalyzeComparestr(AString: String; out ACompareOp: TsCompareOperation): String;
function AnalyzeCompareStr(AString: String; out ACompareOp: TsCompareOperation): String;
procedure RemoveChars(ACount: Integer; ACompare: TsCompareOperation);
begin

View File

@ -20,10 +20,11 @@ type
protected
function Decrypt(AStream: TStream; ADecryptionInfo: TsOpenDocManifestFileEntry;
APassword: String; ADestStream: TStream; out AErrorMsg: String): Boolean; override;
function SupportsDecryption: Boolean; override;
{$IFDEF UNZIP_ABBREVIA}
function UnzipToStream(AStream: TStream; AZippedFile: String; ADestStream: TStream): Boolean; override;
{$ENDIF}
public
function SupportsDecryption: Boolean; override;
end;
var

View File

@ -12,13 +12,12 @@ type
TsSpreadOOXMLReaderCrypto = class(TsSpreadOOXMLReader)
private
FNeedsPassword: Boolean;
protected
function NeedsPassword(AStream: TStream): Boolean; override;
function SupportsDecryption: Boolean; override;
public
class function CheckFileFormat(AStream: TStream): boolean; override;
function NeedsPassword(AStream: TStream): Boolean; override;
procedure ReadFromStream(AStream: TStream; APassword: String = '';
AParams: TsStreamParams = []); override;
function SupportsDecryption: Boolean; override;
end;
var

View File

@ -2403,8 +2403,6 @@
end;
// COUNTIF
{ currently no support for COUNTIF
if AFormat <> sfExcel2 then begin
inc(Row);
formula := 'COUNTIF(M1:N3,1)';
@ -2472,11 +2470,11 @@
RPNFunc('COUNTIF', nil)))))
else
Myworksheet.WriteFormula(Row, 1, formula);
MyWorksheet.WriteNubmer(Row, 2, 2);
MyWorksheet.WriteNumber(Row, 2, 2);
SetLength(sollValues, Row+1);
sollValues[Row] := IntegerResult(2);
end;
}
// MAX
inc(Row);
formula := 'MAX(1,1.1,1.2,0.9,0.8)';
@ -2660,10 +2658,10 @@
SetLength(sollValues, Row+1);
sollValues[Row] := FloatResult(SumOfSquares(STATS_NUMBERS));
{ ---- SUMIF currently not supported
// { ---- SUMIF currently not supported
// SUMIF
inc(Row);
formula = 'SUMIF(M1:N3,1)';
formula := 'SUMIF(M1:N3,1)';
MyWorksheet.WriteText(Row, 0, formula);
if UseRPNFormula then
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
@ -2671,21 +2669,21 @@
RPNNumber(1, // "1" is in M2
RPNFunc('SUMIF', 2, nil)))))
else
MyWorksheet.WriteRPNFormula(Row, 1, formula);
MyWorksheet.WriteFormula(Row, 1, formula);
Myworksheet.WriteNumber(Row, 2, 1);
SetLength(sollValues, Row+1);
sollValues[Row] := FloatResult(1);
inc(Row);
formula := 'SUMIF(M1:N3,">=1")';
MyWorksheet.WriteText(Row, 0, formul);
MyWorksheet.WriteText(Row, 0, formula);
if UseRPNFormula then
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellRange('M1:N3',
RPNString('>=1', // M2=1, N2=2 --> 2
RPNFunc('SUMIF', 2, nil)))))
else
MyWorksheet.WriteFormula(Row, 1 formula);
MyWorksheet.WriteFormula(Row, 1, formula);
MyWorksheet.WriteNumber(Row, 2, 1.0+2.0);
SetLength(sollValues, Row+1);
sollValues[Row] := FloatResult(1.0 + 2.0);
@ -2700,7 +2698,7 @@
RPNFunc('SUMIF', 2, nil)))))
else
Myworksheet.WriteFormula(Row, 1, formula);
MyWorksheet.WriteFormula(Row, 2, 1);
MyWorksheet.WriteNumber(Row, 2, 1);
SetLength(sollValues, Row+1);
sollValues[Row] := FloatResult(1);
@ -2745,7 +2743,7 @@
MyWorksheet.WriteNumber(Row, 2, 1);
SetLength(sollValues, Row+1);
sollValues[Row] := FloatResult(1);
}
end;
// VAR