UPDATE: Add placeholders for all functions

This commit is contained in:
Nicolás Hatcher
2024-11-24 13:50:54 +01:00
committed by Nicolás Hatcher Andrés
parent 48afb45eb9
commit 8243e231ab
478 changed files with 12081 additions and 42 deletions

View File

@@ -39,4 +39,9 @@ path = "src/bin/test.rs"
[[bin]]
name = "documentation"
path = "src/bin/documentation.rs"
path = "src/bin/documentation.rs"
[[bin]]
name = "generate_docs"
path = "src/bin/generate_docs.rs"

View File

@@ -0,0 +1,7 @@
CUBEKPIMEMBER
CUBEMEMBER
CUBEMEMBERPROPERTY
CUBERANKEDMEMBER
CUBESET
CUBESETCOUNT
CUBEVALUE
1 CUBEKPIMEMBER
2 CUBEMEMBER
3 CUBEMEMBERPROPERTY
4 CUBERANKEDMEMBER
5 CUBESET
6 CUBESETCOUNT
7 CUBEVALUE

View File

@@ -0,0 +1,12 @@
DAVERAGE
DCOUNT
DCOUNTA
DGET
DMAX
DMIN
DPRODUCT
DSTDEV
DSTDEVP
DSUM
DVAR
DVARP
1 DAVERAGE
2 DCOUNT
3 DCOUNTA
4 DGET
5 DMAX
6 DMIN
7 DPRODUCT
8 DSTDEV
9 DSTDEVP
10 DSUM
11 DVAR
12 DVARP

View File

@@ -0,0 +1,25 @@
DATE
DATEDIF
DATEVALUE
DAY
DAYS
DAYS360
EDATE
EOMONTH
HOUR
ISOWEEKNUM
MINUTE
MONTH
NETWORKDAYS
NETWORKDAYS.INTL
NOW
SECOND
TIME
TIMEVALUE
TODAY
WEEKDAY
WEEKNUM
WORKDAY
WORKDAY.INTL
YEAR
YEARFRAC
1 DATE
2 DATEDIF
3 DATEVALUE
4 DAY
5 DAYS
6 DAYS360
7 EDATE
8 EOMONTH
9 HOUR
10 ISOWEEKNUM
11 MINUTE
12 MONTH
13 NETWORKDAYS
14 NETWORKDAYS.INTL
15 NOW
16 SECOND
17 TIME
18 TIMEVALUE
19 TODAY
20 WEEKDAY
21 WEEKNUM
22 WORKDAY
23 WORKDAY.INTL
24 YEAR
25 YEARFRAC

View File

@@ -0,0 +1,54 @@
BESSELI
BESSELJ
BESSELK
BESSELY
BIN2DEC
BIN2HEX
BIN2OCT
BITAND
BITLSHIFT
BITOR
BITRSHIFT
BITXOR
COMPLEX
CONVERT
DEC2BIN
DEC2HEX
DEC2OCT
DELTA
ERF
ERF.PRECISE
ERFC
ERFC.PRECISE
GESTEP
HEX2BIN
HEX2DEC
HEX2OCT
IMABS
IMAGINARY
IMARGUMENT
IMCONJUGATE
IMCOS
IMCOSH
IMCOT
IMCSC
IMCSCH
IMDIV
IMEXP
IMLN
IMLOG10
IMLOG2
IMPOWER
IMPRODUCT
IMREAL
IMSEC
IMSECH
IMSIN
IMSINH
IMSQRT
IMSUB
IMSUM
IMTAN
OCT2BIN
OCT2DEC
OCT2HEX
1 BESSELI
2 BESSELJ
3 BESSELK
4 BESSELY
5 BIN2DEC
6 BIN2HEX
7 BIN2OCT
8 BITAND
9 BITLSHIFT
10 BITOR
11 BITRSHIFT
12 BITXOR
13 COMPLEX
14 CONVERT
15 DEC2BIN
16 DEC2HEX
17 DEC2OCT
18 DELTA
19 ERF
20 ERF.PRECISE
21 ERFC
22 ERFC.PRECISE
23 GESTEP
24 HEX2BIN
25 HEX2DEC
26 HEX2OCT
27 IMABS
28 IMAGINARY
29 IMARGUMENT
30 IMCONJUGATE
31 IMCOS
32 IMCOSH
33 IMCOT
34 IMCSC
35 IMCSCH
36 IMDIV
37 IMEXP
38 IMLN
39 IMLOG10
40 IMLOG2
41 IMPOWER
42 IMPRODUCT
43 IMREAL
44 IMSEC
45 IMSECH
46 IMSIN
47 IMSINH
48 IMSQRT
49 IMSUB
50 IMSUM
51 IMTAN
52 OCT2BIN
53 OCT2DEC
54 OCT2HEX

View File

@@ -0,0 +1,55 @@
ACCRINT
ACCRINTM
AMORDEGRC
AMORLINC
COUPDAYBS
COUPDAYS
COUPDAYSNC
COUPNCD
COUPNUM
COUPPCD
CUMIPMT
CUMPRINC
DB
DDB
DISC
DOLLARDE
DOLLARFR
DURATION
EFFECT
FV
FVSCHEDULE
INTRATE
IPMT
IRR
ISPMT
MDURATION
MIRR
NOMINAL
NPER
NPV
ODDFPRICE
ODDFYIELD
ODDLPRICE
ODDLYIELD
PDURATION
PMT
PPMT
PRICE
PRICEDISC
PRICEMAT
PV
RATE
RECEIVED
RRI
SLN
SYD
TBILLEQ
TBILLPRICE
TBILLYIELD
VDB
XIRR
XNPV
YIELD
YIELDDISC
YIELDMAT
1 ACCRINT
2 ACCRINTM
3 AMORDEGRC
4 AMORLINC
5 COUPDAYBS
6 COUPDAYS
7 COUPDAYSNC
8 COUPNCD
9 COUPNUM
10 COUPPCD
11 CUMIPMT
12 CUMPRINC
13 DB
14 DDB
15 DISC
16 DOLLARDE
17 DOLLARFR
18 DURATION
19 EFFECT
20 FV
21 FVSCHEDULE
22 INTRATE
23 IPMT
24 IRR
25 ISPMT
26 MDURATION
27 MIRR
28 NOMINAL
29 NPER
30 NPV
31 ODDFPRICE
32 ODDFYIELD
33 ODDLPRICE
34 ODDLYIELD
35 PDURATION
36 PMT
37 PPMT
38 PRICE
39 PRICEDISC
40 PRICEMAT
41 PV
42 RATE
43 RECEIVED
44 RRI
45 SLN
46 SYD
47 TBILLEQ
48 TBILLPRICE
49 TBILLYIELD
50 VDB
51 XIRR
52 XNPV
53 YIELD
54 YIELDDISC
55 YIELDMAT

View File

@@ -0,0 +1,21 @@
CELL
ERROR.TYPE
INFO
ISBLANK
ISERR
ISERROR
ISEVEN
ISFORMULA
ISLOGICAL
ISNA
ISNONTEXT
ISNUMBER
ISODD
ISOMITTED
ISREF
ISTEXT
N
NA
SHEET
SHEETS
TYPE
1 CELL
2 ERROR.TYPE
3 INFO
4 ISBLANK
5 ISERR
6 ISERROR
7 ISEVEN
8 ISFORMULA
9 ISLOGICAL
10 ISNA
11 ISNONTEXT
12 ISNUMBER
13 ISODD
14 ISOMITTED
15 ISREF
16 ISTEXT
17 N
18 NA
19 SHEET
20 SHEETS
21 TYPE

View File

@@ -0,0 +1,19 @@
AND
BYCOL
BYROW
FALSE
IF
IFERROR
IFNA
IFS
LAMBDA
LET
MAKEARRAY
MAP
NOT
OR
REDUCE
SCAN
SWITCH
TRUE
XOR
1 AND
2 BYCOL
3 BYROW
4 FALSE
5 IF
6 IFERROR
7 IFNA
8 IFS
9 LAMBDA
10 LET
11 MAKEARRAY
12 MAP
13 NOT
14 OR
15 REDUCE
16 SCAN
17 SWITCH
18 TRUE
19 XOR

View File

@@ -0,0 +1,37 @@
ADDRESS
AREAS
CHOOSE
CHOOSECOLS
CHOOSEROWS
COLUMN
COLUMNS
DROP
EXPAND
FILTER
FORMULATEXT
GETPIVOTDATA
HLOOKUP
HSTACK
HYPERLINK
IMAGE
INDEX
INDIRECT
LOOKUP
MATCH
OFFSET
ROW
ROWS
RTD
SORT
SORTBY
TAKE
TOCOL
TOROW
TRANSPOSE
UNIQUE
VLOOKUP
VSTACK
WRAPCOLS
WRAPROWS
XLOOKUP
XMATCH
1 ADDRESS
2 AREAS
3 CHOOSE
4 CHOOSECOLS
5 CHOOSEROWS
6 COLUMN
7 COLUMNS
8 DROP
9 EXPAND
10 FILTER
11 FORMULATEXT
12 GETPIVOTDATA
13 HLOOKUP
14 HSTACK
15 HYPERLINK
16 IMAGE
17 INDEX
18 INDIRECT
19 LOOKUP
20 MATCH
21 OFFSET
22 ROW
23 ROWS
24 RTD
25 SORT
26 SORTBY
27 TAKE
28 TOCOL
29 TOROW
30 TRANSPOSE
31 UNIQUE
32 VLOOKUP
33 VSTACK
34 WRAPCOLS
35 WRAPROWS
36 XLOOKUP
37 XMATCH

View File

@@ -0,0 +1,82 @@
ABS
ACOS
ACOSH
ACOT
ACOTH
AGGREGATE
ARABIC
ASIN
ASINH
ATAN
ATAN2
ATANH
BASE
CEILING
CEILING.MATH
CEILING.PRECISE
COMBIN
COMBINA
COS
COSH
COT
COTH
CSC
CSCH
DECIMAL
DEGREES
EVEN
EXP
FACT
FACTDOUBLE
FLOOR
FLOOR.MATH
FLOOR.PRECISE
GCD
INT
ISO.CEILING
LCM
LET
LN
LOG
LOG10
MDETERM
MINVERSE
MMULT
MOD
MROUND
MULTINOMIAL
MUNIT
ODD
PI
POWER
PRODUCT
QUOTIENT
RADIANS
RAND
RANDARRAY
RANDBETWEEN
ROMAN
ROUND
ROUNDDOWN
ROUNDUP
SEC
SECH
SERIESSUM
SEQUENCE
SIGN
SIN
SINH
SQRT
SQRTPI
SUBTOTAL
SUM
SUMIF
SUMIFS
SUMPRODUCT
SUMSQ
SUMX2MY2
SUMX2PY2
SUMXMY2
TAN
TANH
TRUNC
1 ABS
2 ACOS
3 ACOSH
4 ACOT
5 ACOTH
6 AGGREGATE
7 ARABIC
8 ASIN
9 ASINH
10 ATAN
11 ATAN2
12 ATANH
13 BASE
14 CEILING
15 CEILING.MATH
16 CEILING.PRECISE
17 COMBIN
18 COMBINA
19 COS
20 COSH
21 COT
22 COTH
23 CSC
24 CSCH
25 DECIMAL
26 DEGREES
27 EVEN
28 EXP
29 FACT
30 FACTDOUBLE
31 FLOOR
32 FLOOR.MATH
33 FLOOR.PRECISE
34 GCD
35 INT
36 ISO.CEILING
37 LCM
38 LET
39 LN
40 LOG
41 LOG10
42 MDETERM
43 MINVERSE
44 MMULT
45 MOD
46 MROUND
47 MULTINOMIAL
48 MUNIT
49 ODD
50 PI
51 POWER
52 PRODUCT
53 QUOTIENT
54 RADIANS
55 RAND
56 RANDARRAY
57 RANDBETWEEN
58 ROMAN
59 ROUND
60 ROUNDDOWN
61 ROUNDUP
62 SEC
63 SECH
64 SERIESSUM
65 SEQUENCE
66 SIGN
67 SIN
68 SINH
69 SQRT
70 SQRTPI
71 SUBTOTAL
72 SUM
73 SUMIF
74 SUMIFS
75 SUMPRODUCT
76 SUMSQ
77 SUMX2MY2
78 SUMX2PY2
79 SUMXMY2
80 TAN
81 TANH
82 TRUNC

View File

@@ -0,0 +1,111 @@
AVEDEV
AVERAGE
AVERAGEA
AVERAGEIF
AVERAGEIFS
BETA.DIST
BETA.INV
BINOM.DIST
BINOM.DIST.RANGE
BINOM.INV
CHISQ.DIST
CHISQ.DIST.RT
CHISQ.INV
CHISQ.INV.RT
CHISQ.TEST
CONFIDENCE.NORM
CONFIDENCE.T
CORREL
COUNT
COUNTA
COUNTBLANK
COUNTIF
COUNTIFS
COVARIANCE.P
COVARIANCE.S
DEVSQ
EXPON.DIST
F.DIST
F.DIST.RT
F.INV
F.INV.RT
F.TEST
FISHER
FISHERINV
FORECAST
FORECAST.ETS
FORECAST.ETS.CONFINT
FORECAST.ETS.SEASONALITY
FORECAST.ETS.STAT
FORECAST.LINEAR
FREQUENCY
GAMMA
GAMMA.DIST
GAMMA.INV
GAMMALN
GAMMALN.PRECISE
GAUSS
GEOMEAN
GROWTH
HARMEAN
HYPGEOM.DIST
INTERCEPT
KURT
LARGE
LINEST
LOGEST
LOGNORM.DIST
LOGNORM.INV
MAX
MAXA
MAXIFS
MEDIAN
MIN
MINA
MINIFS
MODE.MULT
MODE.SNGL
NEGBINOM.DIST
NORM.DIST
NORM.INV
NORM.S.DIST
NORM.S.INV
PEARSON
PERCENTILE.EXC
PERCENTILE.INC
PERCENTRANK.EXC
PERCENTRANK.INC
PERMUT
PERMUTATIONA
PHI
POISSON.DIST
PROB
QUARTILE.EXC
QUARTILE.INC
RANK.AVG
RANK.EQ
RSQ
SKEW
SKEW.P
SLOPE
SMALL
STANDARDIZE
STDEV.P
STDEV.S
STDEVA
STDEVPA
STEYX
T.DIST
T.DIST.2T
T.DIST.RT
T.INV
T.INV.2T
T.TEST
TREND
TRIMMEAN
VAR.P
VAR.S
VARA
VARPA
WEIBULL.DIST
Z.TEST
1 AVEDEV
2 AVERAGE
3 AVERAGEA
4 AVERAGEIF
5 AVERAGEIFS
6 BETA.DIST
7 BETA.INV
8 BINOM.DIST
9 BINOM.DIST.RANGE
10 BINOM.INV
11 CHISQ.DIST
12 CHISQ.DIST.RT
13 CHISQ.INV
14 CHISQ.INV.RT
15 CHISQ.TEST
16 CONFIDENCE.NORM
17 CONFIDENCE.T
18 CORREL
19 COUNT
20 COUNTA
21 COUNTBLANK
22 COUNTIF
23 COUNTIFS
24 COVARIANCE.P
25 COVARIANCE.S
26 DEVSQ
27 EXPON.DIST
28 F.DIST
29 F.DIST.RT
30 F.INV
31 F.INV.RT
32 F.TEST
33 FISHER
34 FISHERINV
35 FORECAST
36 FORECAST.ETS
37 FORECAST.ETS.CONFINT
38 FORECAST.ETS.SEASONALITY
39 FORECAST.ETS.STAT
40 FORECAST.LINEAR
41 FREQUENCY
42 GAMMA
43 GAMMA.DIST
44 GAMMA.INV
45 GAMMALN
46 GAMMALN.PRECISE
47 GAUSS
48 GEOMEAN
49 GROWTH
50 HARMEAN
51 HYPGEOM.DIST
52 INTERCEPT
53 KURT
54 LARGE
55 LINEST
56 LOGEST
57 LOGNORM.DIST
58 LOGNORM.INV
59 MAX
60 MAXA
61 MAXIFS
62 MEDIAN
63 MIN
64 MINA
65 MINIFS
66 MODE.MULT
67 MODE.SNGL
68 NEGBINOM.DIST
69 NORM.DIST
70 NORM.INV
71 NORM.S.DIST
72 NORM.S.INV
73 PEARSON
74 PERCENTILE.EXC
75 PERCENTILE.INC
76 PERCENTRANK.EXC
77 PERCENTRANK.INC
78 PERMUT
79 PERMUTATIONA
80 PHI
81 POISSON.DIST
82 PROB
83 QUARTILE.EXC
84 QUARTILE.INC
85 RANK.AVG
86 RANK.EQ
87 RSQ
88 SKEW
89 SKEW.P
90 SLOPE
91 SMALL
92 STANDARDIZE
93 STDEV.P
94 STDEV.S
95 STDEVA
96 STDEVPA
97 STEYX
98 T.DIST
99 T.DIST.2T
100 T.DIST.RT
101 T.INV
102 T.INV.2T
103 T.TEST
104 TREND
105 TRIMMEAN
106 VAR.P
107 VAR.S
108 VARA
109 VARPA
110 WEIBULL.DIST
111 Z.TEST

View File

@@ -0,0 +1,25 @@
MID
MIDB
NUMBERVALUE
PHONETIC
PROPER
REPLACE
REPLACEBs
REPT
RIGHT
RIGHTB
SEARCH
SEARCHB
SUBSTITUTE
T
TEXT
TEXTAFTER
TEXTBEFORE
TEXTJOIN
TEXTSPLIT
TRIM
UNICHAR
UNICODE
UPPER
VALUE
VALUETOTEXT
1 MID
2 MIDB
3 NUMBERVALUE
4 PHONETIC
5 PROPER
6 REPLACE
7 REPLACEBs
8 REPT
9 RIGHT
10 RIGHTB
11 SEARCH
12 SEARCHB
13 SUBSTITUTE
14 T
15 TEXT
16 TEXTAFTER
17 TEXTBEFORE
18 TEXTJOIN
19 TEXTSPLIT
20 TRIM
21 UNICHAR
22 UNICODE
23 UPPER
24 VALUE
25 VALUETOTEXT

View File

@@ -0,0 +1,4 @@
REGEXTEST
REGEXEXTRACT
REGEXREPLACE:
TRIMRANGE
1 REGEXTEST
2 REGEXEXTRACT
3 REGEXREPLACE:
4 TRIMRANGE

View File

@@ -0,0 +1,134 @@
#![allow(clippy::panic)]
#![allow(clippy::expect_used)]
//! Produces documentation of all the implemented IronCalc functions
//! and saves the result to functions.md
//!
//! Usage: documentation
use std::fs;
use serde::Serialize;
use std::io::{self, BufRead};
#[derive(Serialize)]
struct FunctionItem {
text: String,
link: String,
}
#[derive(Serialize)]
struct CategoryItem {
text: String,
collapsed: bool,
link: String,
items: Vec<FunctionItem>,
}
#[derive(Serialize)]
struct Item {
text: String,
collapsed: bool,
items: Vec<CategoryItem>,
}
fn main() -> io::Result<()> {
// Step 1: Create "docs" directory in the working directory
let docs_dir = "docs";
fs::create_dir_all(docs_dir)?;
// Step 2: Read files from the "functions" directory
let functions_dir = "functions";
let mut category_items = Vec::new();
for entry in fs::read_dir(functions_dir)? {
let entry = entry?;
let path = entry.path();
// Only process files (skip directories)
if path.is_file() {
// Get the file name without extension
if let Some(category) = path.file_stem().and_then(|s| s.to_str()) {
// Create a directory in "docs" with the name of the file
let target_dir = format!("{}/{}", docs_dir, category);
fs::create_dir_all(&target_dir)?;
// Open the file and read lines
let file = fs::File::open(&path)?;
let reader = io::BufReader::new(file);
let mut file_items = Vec::new();
for line in reader.lines() {
let line = line?;
let function_name = line.trim().to_lowercase();
let function_name_upper_case = function_name.to_uppercase();
if function_name.is_empty() {
continue;
}
// Create a file with the name from the line, ending with .md
let file_name = format!("{}/{}.md", target_dir, function_name);
// Write "Hello World" into the file
fs::write(
&file_name,
format!(
r#"
---
layout: doc
outline: deep
lang: en-US
---
::: warning
**Note:** This page is under construction 🚧
:::
# {function_name_upper_case}
## Parameters
## Overview
## Examples
[See this example in IronCalc](https://app.ironcalc.com/?filename={function_name})
## Links
"#
)
.trim(),
)?;
// Add the item to file_items
let item = FunctionItem {
text: function_name_upper_case,
link: format!("/functions/{}/{}", category, function_name),
};
file_items.push(item);
}
category_items.push(CategoryItem {
text: category.to_string(),
collapsed: true,
link: format!("/functions/{}", category),
items: file_items,
});
}
}
}
let root_item = Item {
text: "Functions".to_string(),
collapsed: true,
items: category_items,
};
// Serialize root_item to JSON and write to functions.json
let json_string = serde_json::to_string_pretty(&root_item)?;
fs::write("functions.json", json_string)?;
Ok(())
}

BIN
xlsx/tests/docs/DATE.xlsx Normal file

Binary file not shown.

BIN
xlsx/tests/docs/DAY.xlsx Normal file

Binary file not shown.

BIN
xlsx/tests/docs/FV.xlsx Normal file

Binary file not shown.

BIN
xlsx/tests/docs/MONTH.xlsx Normal file

Binary file not shown.

BIN
xlsx/tests/docs/PV.xlsx Normal file

Binary file not shown.

BIN
xlsx/tests/docs/SIN.xlsx Normal file

Binary file not shown.

BIN
xlsx/tests/docs/YEAR.xlsx Normal file

Binary file not shown.

View File

@@ -392,7 +392,7 @@ fn no_export() {
}
// This test verifies whether exporting the merged cells functionality is happening properly or not.
// It first loads the excell having the merged cell and exports it to another xlsx and verifies whether merged
// It first loads the Excel having the merged cell and exports it to another xlsx and verifies whether merged
// cell node is same in both of the xlsx file or not.
#[test]
fn test_exporting_merged_cells() {
@@ -455,3 +455,42 @@ fn test_exporting_merged_cells() {
fs::remove_file(temp_file_name).unwrap();
}
#[test]
fn test_documentation_xlsx() {
let mut entries = fs::read_dir("tests/docs/")
.unwrap()
.map(|res| res.map(|e| e.path()))
.collect::<Result<Vec<_>, io::Error>>()
.unwrap();
entries.sort();
// We can't test volatiles
let skip = ["DATE.xlsx", "DAY.xlsx", "MONTH.xlsx", "YEAR.xlsx"];
let skip = skip.map(|s| format!("tests/docs/{s}"));
println!("{:?}", skip);
// dumb counter to make sure we are actually testing the files
assert_eq!(entries.len(), 7);
let temp_folder = env::temp_dir();
let path = format!("{}", Uuid::new_v4());
let dir = temp_folder.join(path);
fs::create_dir(&dir).unwrap();
for file_path in entries {
let file_name_str = file_path.file_name().unwrap().to_str().unwrap();
let file_path_str = file_path.to_str().unwrap();
if skip.contains(&file_path_str.to_string()) {
println!("Skipping file: {}", file_path_str);
continue;
}
println!("Testing file: {}", file_path_str);
if file_name_str.ends_with(".xlsx") && !file_name_str.starts_with('~') {
if let Err(message) = test_file(file_path_str) {
println!("{}", message);
panic!("Model was evaluated inconsistently with XLSX data.")
}
assert!(test_load_and_saving(file_path_str, &dir).is_ok());
} else {
println!("skipping");
}
}
fs::remove_dir_all(&dir).unwrap();
}