diff --git a/samples/Calculations/Database/DAVERAGE.php b/samples/Calculations/Database/DAVERAGE.php
index 92d84014..fa388c8b 100644
--- a/samples/Calculations/Database/DAVERAGE.php
+++ b/samples/Calculations/Database/DAVERAGE.php
@@ -4,7 +4,11 @@ use PhpOffice\PhpSpreadsheet\Spreadsheet;
require __DIR__ . '/../../Header.php';
-$helper->log('Returns the average of selected database entries.');
+$category = 'Database';
+$functionName = 'DAVERAGE';
+$description = 'Returns the average of selected database entries that match criteria';
+
+$helper->titles($category, $functionName, $description);
// Create new PhpSpreadsheet object
$spreadsheet = new Spreadsheet();
@@ -36,21 +40,19 @@ $worksheet->setCellValue('B13', '=DAVERAGE(A4:E10,3,A1:A3)');
$helper->log('Database');
$databaseData = $worksheet->rangeToArray('A4:E10', null, true, true, true);
-var_dump($databaseData);
+$helper->displayGrid($databaseData);
// Test the formulae
$helper->log('Criteria');
$criteriaData = $worksheet->rangeToArray('A1:B2', null, true, true, true);
-var_dump($criteriaData);
+$helper->displayGrid($criteriaData);
-$helper->log($worksheet->getCell('A12')->getValue());
-$helper->log('DAVERAGE() Result is ' . $worksheet->getCell('B12')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B12', 'A12');
$helper->log('Criteria');
$criteriaData = $worksheet->rangeToArray('A1:A3', null, true, true, true);
-var_dump($criteriaData);
+$helper->displayGrid($criteriaData);
-$helper->log($worksheet->getCell('A13')->getValue());
-$helper->log('DAVERAGE() Result is ' . $worksheet->getCell('B13')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B13', 'A13');
diff --git a/samples/Calculations/Database/DCOUNT.php b/samples/Calculations/Database/DCOUNT.php
index d869a4bc..68d6be18 100644
--- a/samples/Calculations/Database/DCOUNT.php
+++ b/samples/Calculations/Database/DCOUNT.php
@@ -3,7 +3,12 @@
use PhpOffice\PhpSpreadsheet\Spreadsheet;
require __DIR__ . '/../../Header.php';
-$helper->log('Counts the cells that contain numbers in a database.');
+
+$category = 'Database';
+$functionName = 'DCOUNT';
+$description = 'Counts the cells that contain numbers in a set of database records that match criteria';
+
+$helper->titles($category, $functionName, $description);
// Create new PhpSpreadsheet object
$spreadsheet = new Spreadsheet();
@@ -14,9 +19,9 @@ $database = [['Tree', 'Height', 'Age', 'Yield', 'Profit'],
['Apple', 18, 20, 14, 105.00],
['Pear', 12, 12, 10, 96.00],
['Cherry', 13, 14, 9, 105.00],
- ['Apple', 14, 15, 10, 75.00],
- ['Pear', 9, 8, 8, 76.80],
- ['Apple', 8, 9, 6, 45.00],
+ ['Apple', 14, 'N/A', 10, 75.00],
+ ['Pear', 9, 8, 8, 77.00],
+ ['Apple', 12, 11, 6, 45.00],
];
$criteria = [['Tree', 'Height', 'Age', 'Yield', 'Profit', 'Height'],
['="=Apple"', '>10', null, null, null, '<16'],
@@ -26,30 +31,28 @@ $criteria = [['Tree', 'Height', 'Age', 'Yield', 'Profit', 'Height'],
$worksheet->fromArray($criteria, null, 'A1');
$worksheet->fromArray($database, null, 'A4');
-$worksheet->setCellValue('A12', 'The Number of Apple trees over 10\' in height');
-$worksheet->setCellValue('B12', '=DCOUNT(A4:E10,"Yield",A1:B2)');
+$worksheet->setCellValue('A12', 'The Number of Apple trees between 10\' and 16\' in height whose age is known');
+$worksheet->setCellValue('B12', '=DCOUNT(A4:E10,"Age",A1:F2)');
-$worksheet->setCellValue('A13', 'The Number of Apple and Pear trees in the orchard');
+$worksheet->setCellValue('A13', 'The Number of Apple and Pear trees in the orchard with a numeric value in column 3 ("Age")');
$worksheet->setCellValue('B13', '=DCOUNT(A4:E10,3,A1:A3)');
$helper->log('Database');
$databaseData = $worksheet->rangeToArray('A4:E10', null, true, true, true);
-var_dump($databaseData);
+$helper->displayGrid($databaseData);
// Test the formulae
$helper->log('Criteria');
-$criteriaData = $worksheet->rangeToArray('A1:B2', null, true, true, true);
-var_dump($criteriaData);
+$criteriaData = $worksheet->rangeToArray('A1:F2', null, true, true, true);
+$helper->displayGrid($criteriaData);
-$helper->log($worksheet->getCell('A12')->getValue());
-$helper->log('DCOUNT() Result is ' . $worksheet->getCell('B12')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B12', 'A12');
$helper->log('Criteria');
$criteriaData = $worksheet->rangeToArray('A1:A3', null, true, true, true);
-var_dump($criteriaData);
+$helper->displayGrid($criteriaData);
-$helper->log($worksheet->getCell('A13')->getValue());
-$helper->log('DCOUNT() Result is ' . $worksheet->getCell('B13')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B13', 'A13');
diff --git a/samples/Calculations/Database/DCOUNTA.php b/samples/Calculations/Database/DCOUNTA.php
new file mode 100644
index 00000000..3b4cc16e
--- /dev/null
+++ b/samples/Calculations/Database/DCOUNTA.php
@@ -0,0 +1,58 @@
+titles($category, $functionName, $description);
+
+// Create new PhpSpreadsheet object
+$spreadsheet = new Spreadsheet();
+$worksheet = $spreadsheet->getActiveSheet();
+
+// Add some data
+$database = [['Tree', 'Height', 'Age', 'Yield', 'Profit'],
+ ['Apple', 18, 20, 14, 105.00],
+ ['Pear', 12, 12, 10, 96.00],
+ ['Cherry', 13, 14, 9, 105.00],
+ ['Apple', 14, 'N/A', 10, 75.00],
+ ['Pear', 9, 8, 8, 77.00],
+ ['Apple', 12, 11, 6, 45.00],
+];
+$criteria = [['Tree', 'Height', 'Age', 'Yield', 'Profit', 'Height'],
+ ['="=Apple"', '>10', null, null, null, '<16'],
+ ['="=Pear"', null, null, null, null, null],
+];
+
+$worksheet->fromArray($criteria, null, 'A1');
+$worksheet->fromArray($database, null, 'A4');
+
+$worksheet->setCellValue('A12', 'The Number of Apple trees between 10\' and 16\' in height');
+$worksheet->setCellValue('B12', '=DCOUNTA(A4:E10,"Age",A1:F2)');
+
+$worksheet->setCellValue('A13', 'The Number of Apple and Pear trees in the orchard');
+$worksheet->setCellValue('B13', '=DCOUNTA(A4:E10,3,A1:A3)');
+
+$helper->log('Database');
+
+$databaseData = $worksheet->rangeToArray('A4:E10', null, true, true, true);
+$helper->displayGrid($databaseData);
+
+// Test the formulae
+$helper->log('Criteria');
+
+$criteriaData = $worksheet->rangeToArray('A1:F2', null, true, true, true);
+$helper->displayGrid($criteriaData);
+
+$helper->logCalculationResult($worksheet, $functionName, 'B12', 'A12');
+
+$helper->log('Criteria');
+
+$criteriaData = $worksheet->rangeToArray('A1:A3', null, true, true, true);
+$helper->displayGrid($criteriaData);
+
+$helper->logCalculationResult($worksheet, $functionName, 'B13', 'A13');
diff --git a/samples/Calculations/Database/DGET.php b/samples/Calculations/Database/DGET.php
index 9f543c91..1b41b777 100644
--- a/samples/Calculations/Database/DGET.php
+++ b/samples/Calculations/Database/DGET.php
@@ -4,7 +4,11 @@ use PhpOffice\PhpSpreadsheet\Spreadsheet;
require __DIR__ . '/../../Header.php';
-$helper->log('Extracts a single value from a column of a list or database that matches conditions that you specify.');
+$category = 'Database';
+$functionName = 'DGET';
+$description = 'Extracts a single value from a column of a list or database that matches criteria that you specify';
+
+$helper->titles($category, $functionName, $description);
// Create new PhpSpreadsheet object
$spreadsheet = new Spreadsheet();
@@ -21,7 +25,7 @@ $database = [['Tree', 'Height', 'Age', 'Yield', 'Profit'],
];
$criteria = [['Tree', 'Height', 'Age', 'Yield', 'Profit', 'Height'],
['="=Apple"', '>10', null, null, null, '<16'],
- ['="=Pear"', null, null, null, null, null],
+ ['="=Pear"', '>12', null, null, null, null],
];
$worksheet->fromArray($criteria, null, 'A1');
@@ -30,23 +34,25 @@ $worksheet->fromArray($database, null, 'A4');
$worksheet->setCellValue('A12', 'The height of the Apple tree between 10\' and 16\' tall');
$worksheet->setCellValue('B12', '=DGET(A4:E10,"Height",A1:F2)');
+$worksheet->setCellValue('A13', 'The height of the Apple tree (will return an Excel error, because there is more than one apple tree)');
+$worksheet->setCellValue('B13', '=DGET(A4:E10,"Height",A1:A2)');
+
$helper->log('Database');
$databaseData = $worksheet->rangeToArray('A4:E10', null, true, true, true);
-var_dump($databaseData);
+$helper->displayGrid($databaseData);
// Test the formulae
$helper->log('Criteria');
-$helper->log('ALL');
+$criteriaData = $worksheet->rangeToArray('A1:F2', null, true, true, true);
+$helper->displayGrid($criteriaData);
-$helper->log($worksheet->getCell('A12')->getValue());
-$helper->log('DMAX() Result is ' . $worksheet->getCell('B12')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B12', 'A12');
$helper->log('Criteria');
$criteriaData = $worksheet->rangeToArray('A1:A2', null, true, true, true);
-var_dump($criteriaData);
+$helper->displayGrid($criteriaData);
-$helper->log($worksheet->getCell('A13')->getValue());
-$helper->log('DMAX() Result is ' . $worksheet->getCell('B13')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B13', 'A13');
diff --git a/samples/Calculations/Database/DMAX.php b/samples/Calculations/Database/DMAX.php
index c48928d4..0998904b 100644
--- a/samples/Calculations/Database/DMAX.php
+++ b/samples/Calculations/Database/DMAX.php
@@ -4,7 +4,11 @@ use PhpOffice\PhpSpreadsheet\Spreadsheet;
require __DIR__ . '/../../Header.php';
-$helper->log('Returns the maximum value from selected database entries.');
+$category = 'Database';
+$functionName = 'DMAX';
+$description = 'Returns the maximum value from selected database entries';
+
+$helper->titles($category, $functionName, $description);
// Create new PhpSpreadsheet object
$spreadsheet = new Spreadsheet();
@@ -36,20 +40,18 @@ $worksheet->setCellValue('B13', '=DMAX(A4:E10,3,A1:A2)');
$helper->log('Database');
$databaseData = $worksheet->rangeToArray('A4:E10', null, true, true, true);
-var_dump($databaseData);
+$helper->displayGrid($databaseData);
// Test the formulae
$helper->log('Criteria');
$helper->log('ALL');
-$helper->log($worksheet->getCell('A12')->getValue());
-$helper->log('DMAX() Result is ' . $worksheet->getCell('B12')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B12', 'A12');
$helper->log('Criteria');
$criteriaData = $worksheet->rangeToArray('A1:A2', null, true, true, true);
-var_dump($criteriaData);
+$helper->displayGrid($criteriaData);
-$helper->log($worksheet->getCell('A13')->getValue());
-$helper->log('DMAX() Result is ' . $worksheet->getCell('B13')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B13', 'A13');
diff --git a/samples/Calculations/Database/DMIN.php b/samples/Calculations/Database/DMIN.php
index 7bcaa206..c0e0a8d8 100644
--- a/samples/Calculations/Database/DMIN.php
+++ b/samples/Calculations/Database/DMIN.php
@@ -4,7 +4,11 @@ use PhpOffice\PhpSpreadsheet\Spreadsheet;
require __DIR__ . '/../../Header.php';
-$helper->log('Returns the minimum value from selected database entries.');
+$category = 'Database';
+$functionName = 'DMIN';
+$description = 'Returns the minimum value from selected database entries';
+
+$helper->titles($category, $functionName, $description);
// Create new PhpSpreadsheet object
$spreadsheet = new Spreadsheet();
@@ -36,20 +40,18 @@ $worksheet->setCellValue('B13', '=DMIN(A4:E10,3,A1:A2)');
$helper->log('Database');
$databaseData = $worksheet->rangeToArray('A4:E10', null, true, true, true);
-var_dump($databaseData);
+$helper->displayGrid($databaseData);
// Test the formulae
$helper->log('Criteria');
$helper->log('ALL');
-$helper->log($worksheet->getCell('A12')->getValue());
-$helper->log('DMIN() Result is ' . $worksheet->getCell('B12')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B12', 'A12');
$helper->log('Criteria');
$criteriaData = $worksheet->rangeToArray('A1:A2', null, true, true, true);
-var_dump($criteriaData);
+$helper->displayGrid($criteriaData);
-$helper->log($worksheet->getCell('A13')->getValue());
-$helper->log('DMIN() Result is ' . $worksheet->getCell('B13')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B13', 'A13');
diff --git a/samples/Calculations/Database/DPRODUCT.php b/samples/Calculations/Database/DPRODUCT.php
index 7c14ded6..fa666ffe 100644
--- a/samples/Calculations/Database/DPRODUCT.php
+++ b/samples/Calculations/Database/DPRODUCT.php
@@ -4,7 +4,11 @@ use PhpOffice\PhpSpreadsheet\Spreadsheet;
require __DIR__ . '/../../Header.php';
-$helper->log('Multiplies the values in a column of a list or database that match conditions that you specify.');
+$category = 'Database';
+$functionName = 'DPRODUCT';
+$description = 'Multiplies the values in a column of a list or database that match conditions that you specify';
+
+$helper->titles($category, $functionName, $description);
// Create new PhpSpreadsheet object
$spreadsheet = new Spreadsheet();
@@ -16,7 +20,7 @@ $database = [['Tree', 'Height', 'Age', 'Yield', 'Profit'],
['Pear', 12, 12, 10, 96.00],
['Cherry', 13, 14, 9, 105.00],
['Apple', 14, 15, 10, 75.00],
- ['Pear', 9, 8, 8, 76.80],
+ ['Pear', 9, 8, 8, 77.00],
['Apple', 8, 9, 6, 45.00],
];
$criteria = [['Tree', 'Height', 'Age', 'Yield', 'Profit', 'Height'],
@@ -30,23 +34,25 @@ $worksheet->fromArray($database, null, 'A4');
$worksheet->setCellValue('A12', 'The product of the yields of all Apple trees over 10\' in the orchard');
$worksheet->setCellValue('B12', '=DPRODUCT(A4:E10,"Yield",A1:B2)');
+$worksheet->setCellValue('A13', 'The product of the yields of all Apple trees in the orchard');
+$worksheet->setCellValue('B13', '=DPRODUCT(A4:E10,"Yield",A1:A2)');
+
$helper->log('Database');
$databaseData = $worksheet->rangeToArray('A4:E10', null, true, true, true);
-var_dump($databaseData);
+$helper->displayGrid($databaseData);
// Test the formulae
$helper->log('Criteria');
-$helper->log('ALL');
+$criteriaData = $worksheet->rangeToArray('A1:B2', null, true, true, true);
+$helper->displayGrid($criteriaData);
-$helper->log($worksheet->getCell('A12')->getValue());
-$helper->log('DMAX() Result is ' . $worksheet->getCell('B12')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B12', 'A12');
$helper->log('Criteria');
$criteriaData = $worksheet->rangeToArray('A1:A2', null, true, true, true);
-var_dump($criteriaData);
+$helper->displayGrid($criteriaData);
-$helper->log($worksheet->getCell('A13')->getValue());
-$helper->log('DMAX() Result is ' . $worksheet->getCell('B13')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B13', 'A13');
diff --git a/samples/Calculations/Database/DSTDEV.php b/samples/Calculations/Database/DSTDEV.php
index 7f09fa59..b6499741 100644
--- a/samples/Calculations/Database/DSTDEV.php
+++ b/samples/Calculations/Database/DSTDEV.php
@@ -4,7 +4,11 @@ use PhpOffice\PhpSpreadsheet\Spreadsheet;
require __DIR__ . '/../../Header.php';
-$helper->log('Estimates the standard deviation based on a sample of selected database entries.');
+$category = 'Database';
+$functionName = 'DSTDEV';
+$description = 'Estimates the standard deviation based on a sample of selected database entries';
+
+$helper->titles($category, $functionName, $description);
// Create new PhpSpreadsheet object
$spreadsheet = new Spreadsheet();
@@ -36,21 +40,19 @@ $worksheet->setCellValue('B13', '=DSTDEV(A4:E10,2,A1:A3)');
$helper->log('Database');
$databaseData = $worksheet->rangeToArray('A4:E10', null, true, true, true);
-var_dump($databaseData);
+$helper->displayGrid($databaseData);
// Test the formulae
$helper->log('Criteria');
$criteriaData = $worksheet->rangeToArray('A1:A3', null, true, true, true);
-var_dump($criteriaData);
+$helper->displayGrid($criteriaData);
-$helper->log($worksheet->getCell('A12')->getValue());
-$helper->log('DSTDEV() Result is ' . $worksheet->getCell('B12')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B12', 'A12');
$helper->log('Criteria');
$criteriaData = $worksheet->rangeToArray('A1:A3', null, true, true, true);
-var_dump($criteriaData);
+$helper->displayGrid($criteriaData);
-$helper->log($worksheet->getCell('A13')->getValue());
-$helper->log('DSTDEV() Result is ' . $worksheet->getCell('B13')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B13', 'A13');
diff --git a/samples/Calculations/Database/DSTDEVP.php b/samples/Calculations/Database/DSTDEVP.php
index 9e999a80..d8bcec4b 100644
--- a/samples/Calculations/Database/DSTDEVP.php
+++ b/samples/Calculations/Database/DSTDEVP.php
@@ -3,7 +3,12 @@
use PhpOffice\PhpSpreadsheet\Spreadsheet;
require __DIR__ . '/../../Header.php';
-$helper->log('Calculates the standard deviation based on the entire population of selected database entries.');
+
+$category = 'Database';
+$functionName = 'DSTDEVP';
+$description = 'Calculates the standard deviation based on the entire population of selected database entries';
+
+$helper->titles($category, $functionName, $description);
// Create new PhpSpreadsheet object
$spreadsheet = new Spreadsheet();
@@ -35,21 +40,19 @@ $worksheet->setCellValue('B13', '=DSTDEVP(A4:E10,2,A1:A3)');
$helper->log('Database');
$databaseData = $worksheet->rangeToArray('A4:E10', null, true, true, true);
-var_dump($databaseData);
+$helper->displayGrid($databaseData);
// Test the formulae
$helper->log('Criteria');
$criteriaData = $worksheet->rangeToArray('A1:A3', null, true, true, true);
-var_dump($criteriaData);
+$helper->displayGrid($criteriaData);
-$helper->log($worksheet->getCell('A12')->getValue());
-$helper->log('DSTDEVP() Result is ' . $worksheet->getCell('B12')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B12', 'A12');
$helper->log('Criteria');
$criteriaData = $worksheet->rangeToArray('A1:A3', null, true, true, true);
-var_dump($criteriaData);
+$helper->displayGrid($criteriaData);
-$helper->log($worksheet->getCell('A13')->getValue());
-$helper->log('DSTDEVP() Result is ' . $worksheet->getCell('B13')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B13', 'A13');
diff --git a/samples/Calculations/Database/DSUM.php b/samples/Calculations/Database/DSUM.php
new file mode 100644
index 00000000..d2d773c9
--- /dev/null
+++ b/samples/Calculations/Database/DSUM.php
@@ -0,0 +1,58 @@
+titles($category, $functionName, $description);
+
+// Create new PhpSpreadsheet object
+$spreadsheet = new Spreadsheet();
+$worksheet = $spreadsheet->getActiveSheet();
+
+// Add some data
+$database = [['Tree', 'Height', 'Age', 'Yield', 'Profit'],
+ ['Apple', 18, 20, 14, 105.00],
+ ['Pear', 12, 12, 10, 96.00],
+ ['Cherry', 13, 14, 9, 105.00],
+ ['Apple', 14, 15, 10, 75.00],
+ ['Pear', 9, 8, 8, 76.80],
+ ['Apple', 8, 9, 6, 45.00],
+];
+$criteria = [['Tree', 'Height', 'Age', 'Yield', 'Profit', 'Height'],
+ ['="=Apple"', '>10', null, null, null, '<16'],
+ ['="=Pear"', null, null, null, null, null],
+];
+
+$worksheet->fromArray($criteria, null, 'A1');
+$worksheet->fromArray($database, null, 'A4');
+
+$worksheet->setCellValue('A12', 'The total profit from apple trees');
+$worksheet->setCellValue('B12', '=DSUM(A4:E10,"Profit",A1:A2)');
+
+$worksheet->setCellValue('A13', 'Total profit from apple trees with a height between 10 and 16 feet, and all pear trees');
+$worksheet->setCellValue('B13', '=DSUM(A4:E10,"Profit",A1:F3)');
+
+$helper->log('Database');
+
+$databaseData = $worksheet->rangeToArray('A4:E10', null, true, true, true);
+$helper->displayGrid($databaseData);
+
+// Test the formulae
+$helper->log('Criteria');
+
+$criteriaData = $worksheet->rangeToArray('A1:A2', null, true, true, true);
+$helper->displayGrid($criteriaData);
+
+$helper->logCalculationResult($worksheet, $functionName, 'B12', 'A12');
+
+$helper->log('Criteria');
+
+$criteriaData = $worksheet->rangeToArray('A1:F3', null, true, true, true);
+$helper->displayGrid($criteriaData);
+
+$helper->logCalculationResult($worksheet, $functionName, 'B13', 'A13');
diff --git a/samples/Calculations/Database/DVAR.php b/samples/Calculations/Database/DVAR.php
index 2a5f8749..4165d076 100644
--- a/samples/Calculations/Database/DVAR.php
+++ b/samples/Calculations/Database/DVAR.php
@@ -3,7 +3,12 @@
use PhpOffice\PhpSpreadsheet\Spreadsheet;
require __DIR__ . '/../../Header.php';
-$helper->log('Estimates variance based on a sample from selected database entries.');
+
+$category = 'Database';
+$functionName = 'DVAR';
+$description = 'Estimates variance based on a sample from selected database entries';
+
+$helper->titles($category, $functionName, $description);
// Create new PhpSpreadsheet object
$spreadsheet = new Spreadsheet();
@@ -35,21 +40,19 @@ $worksheet->setCellValue('B13', '=DVAR(A4:E10,2,A1:A3)');
$helper->log('Database');
$databaseData = $worksheet->rangeToArray('A4:E10', null, true, true, true);
-var_dump($databaseData);
+$helper->displayGrid($databaseData);
// Test the formulae
$helper->log('Criteria');
$criteriaData = $worksheet->rangeToArray('A1:A3', null, true, true, true);
-var_dump($criteriaData);
+$helper->displayGrid($criteriaData);
-$helper->log($worksheet->getCell('A12')->getValue());
-$helper->log('DVAR() Result is ' . $worksheet->getCell('B12')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B12', 'A12');
$helper->log('Criteria');
$criteriaData = $worksheet->rangeToArray('A1:A3', null, true, true, true);
-var_dump($criteriaData);
+$helper->displayGrid($criteriaData);
-$helper->log($worksheet->getCell('A13')->getValue());
-$helper->log('DVAR() Result is ' . $worksheet->getCell('B13')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B13', 'A13');
diff --git a/samples/Calculations/Database/DVARP.php b/samples/Calculations/Database/DVARP.php
index 4f57113b..5a17415e 100644
--- a/samples/Calculations/Database/DVARP.php
+++ b/samples/Calculations/Database/DVARP.php
@@ -4,7 +4,11 @@ use PhpOffice\PhpSpreadsheet\Spreadsheet;
require __DIR__ . '/../../Header.php';
-$helper->log('Calculates variance based on the entire population of selected database entries,');
+$category = 'Database';
+$functionName = 'DVARP';
+$description = 'Calculates variance based on the entire population of selected database entries';
+
+$helper->titles($category, $functionName, $description);
// Create new PhpSpreadsheet object
$spreadsheet = new Spreadsheet();
@@ -36,21 +40,19 @@ $worksheet->setCellValue('B13', '=DVARP(A4:E10,2,A1:A3)');
$helper->log('Database');
$databaseData = $worksheet->rangeToArray('A4:E10', null, true, true, true);
-var_dump($databaseData);
+$helper->displayGrid($databaseData);
// Test the formulae
$helper->log('Criteria');
$criteriaData = $worksheet->rangeToArray('A1:A3', null, true, true, true);
-var_dump($criteriaData);
+$helper->displayGrid($criteriaData);
-$helper->log($worksheet->getCell('A12')->getValue());
-$helper->log('DVARP() Result is ' . $worksheet->getCell('B12')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B12', 'A12');
$helper->log('Criteria');
$criteriaData = $worksheet->rangeToArray('A1:A3', null, true, true, true);
-var_dump($criteriaData);
+$helper->displayGrid($criteriaData);
-$helper->log($worksheet->getCell('A13')->getValue());
-$helper->log('DVARP() Result is ' . $worksheet->getCell('B13')->getCalculatedValue());
+$helper->logCalculationResult($worksheet, $functionName, 'B13', 'A13');
diff --git a/samples/Calculations/DateTime/DATE.php b/samples/Calculations/DateTime/DATE.php
index 5d758f76..d526cbdb 100644
--- a/samples/Calculations/DateTime/DATE.php
+++ b/samples/Calculations/DateTime/DATE.php
@@ -4,7 +4,11 @@ use PhpOffice\PhpSpreadsheet\Spreadsheet;
require __DIR__ . '/../../Header.php';
-$helper->log('Returns the serial number of a particular date.');
+$category = 'Date/Time';
+$functionName = 'DATE';
+$description = 'Returns the Excel serial number of a particular date';
+
+$helper->titles($category, $functionName, $description);
// Create new PhpSpreadsheet object
$spreadsheet = new Spreadsheet();
@@ -27,15 +31,15 @@ for ($row = 1; $row <= $testDateCount; ++$row) {
}
$worksheet->getStyle('E1:E' . $testDateCount)
->getNumberFormat()
- ->setFormatCode('yyyy-mmm-dd');
+ ->setFormatCode('yyyy-mm-dd');
// Test the formulae
for ($row = 1; $row <= $testDateCount; ++$row) {
- $helper->log('Year: ' . $worksheet->getCell('A' . $row)->getFormattedValue());
- $helper->log('Month: ' . $worksheet->getCell('B' . $row)->getFormattedValue());
- $helper->log('Day: ' . $worksheet->getCell('C' . $row)->getFormattedValue());
+ $helper->log("(A{$row}) Year: " . $worksheet->getCell('A' . $row)->getFormattedValue());
+ $helper->log("(B{$row}) Month: " . $worksheet->getCell('B' . $row)->getFormattedValue());
+ $helper->log("(C{$row}) Day: " . $worksheet->getCell('C' . $row)->getFormattedValue());
$helper->log('Formula: ' . $worksheet->getCell('D' . $row)->getValue());
- $helper->log('Excel DateStamp: ' . $worksheet->getCell('D' . $row)->getFormattedValue());
+ $helper->log('Excel DateStamp: ' . $worksheet->getCell('D' . $row)->getCalculatedValue());
$helper->log('Formatted DateStamp: ' . $worksheet->getCell('E' . $row)->getFormattedValue());
$helper->log('');
}
diff --git a/samples/Calculations/DateTime/DATEDIF.php b/samples/Calculations/DateTime/DATEDIF.php
new file mode 100644
index 00000000..7bc077c9
--- /dev/null
+++ b/samples/Calculations/DateTime/DATEDIF.php
@@ -0,0 +1,60 @@
+titles($category, $functionName, $description);
+
+// Create new PhpSpreadsheet object
+$spreadsheet = new Spreadsheet();
+$worksheet = $spreadsheet->getActiveSheet();
+
+// Add some data
+$testDates = [
+ [1900, 1, 1],
+ [1904, 1, 1],
+ [1936, 3, 17],
+ [1960, 12, 19],
+ [1999, 12, 31],
+ [2000, 1, 1],
+ [2019, 2, 14],
+ [2020, 7, 4],
+];
+$testDateCount = count($testDates);
+
+$worksheet->fromArray($testDates, null, 'A1', true);
+
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $worksheet->setCellValue('D' . $row, '=DATE(A' . $row . ',B' . $row . ',C' . $row . ')');
+ $worksheet->setCellValue('E' . $row, '=D' . $row);
+ $worksheet->setCellValue('F' . $row, '=TODAY()');
+ $worksheet->setCellValue('G' . $row, '=DATEDIF(D' . $row . ', F' . $row . ', "Y")');
+ $worksheet->setCellValue('H' . $row, '=DATEDIF(D' . $row . ', F' . $row . ', "M")');
+ $worksheet->setCellValue('I' . $row, '=DATEDIF(D' . $row . ', F' . $row . ', "D")');
+ $worksheet->setCellValue('J' . $row, '=DATEDIF(D' . $row . ', F' . $row . ', "MD")');
+ $worksheet->setCellValue('K' . $row, '=DATEDIF(D' . $row . ', F' . $row . ', "YM")');
+ $worksheet->setCellValue('L' . $row, '=DATEDIF(D' . $row . ', F' . $row . ', "YD")');
+}
+$worksheet->getStyle('E1:F' . $testDateCount)
+ ->getNumberFormat()
+ ->setFormatCode('yyyy-mm-dd');
+
+// Test the formulae
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $helper->log(sprintf(
+ 'Between: %s and %s',
+ $worksheet->getCell('E' . $row)->getFormattedValue(),
+ $worksheet->getCell('F' . $row)->getFormattedValue()
+ ));
+ $helper->log('In years ("Y"): ' . $worksheet->getCell('G' . $row)->getCalculatedValue());
+ $helper->log('In months ("M"): ' . $worksheet->getCell('H' . $row)->getCalculatedValue());
+ $helper->log('In days ("D"): ' . $worksheet->getCell('I' . $row)->getCalculatedValue());
+ $helper->log('In days ignoring months and years ("MD"): ' . $worksheet->getCell('J' . $row)->getCalculatedValue());
+ $helper->log('In months ignoring days and years ("YM"): ' . $worksheet->getCell('K' . $row)->getCalculatedValue());
+ $helper->log('In days ignoring years ("YD"): ' . $worksheet->getCell('L' . $row)->getCalculatedValue());
+}
diff --git a/samples/Calculations/DateTime/DATEVALUE.php b/samples/Calculations/DateTime/DATEVALUE.php
index 5cdb936d..c506c6f2 100644
--- a/samples/Calculations/DateTime/DATEVALUE.php
+++ b/samples/Calculations/DateTime/DATEVALUE.php
@@ -4,7 +4,11 @@ use PhpOffice\PhpSpreadsheet\Spreadsheet;
require __DIR__ . '/../../Header.php';
-$helper->log('Converts a date in the form of text to a serial number.');
+$category = 'Date/Time';
+$functionName = 'DATEVALUE';
+$description = 'Converts a date in the form of text to an Excel serial number';
+
+$helper->titles($category, $functionName, $description);
// Create new PhpSpreadsheet object
$spreadsheet = new Spreadsheet();
@@ -13,8 +17,8 @@ $worksheet = $spreadsheet->getActiveSheet();
// Add some data
$testDates = ['26 March 2012', '29 Feb 2012', 'April 1, 2012', '25/12/2012',
'2012-Oct-31', '5th November', 'January 1st', 'April 2012',
- '17-03', '03-2012', '29 Feb 2011', '03-05-07',
- '03-MAY-07', '03-13-07',
+ '17-03', '03-17', '03-2012', '29 Feb 2011', '03-05-07',
+ '03-MAY-07', '03-13-07', '13-03-07', '03/13/07', '13/03/07',
];
$testDateCount = count($testDates);
@@ -26,14 +30,14 @@ for ($row = 1; $row <= $testDateCount; ++$row) {
$worksheet->getStyle('C1:C' . $testDateCount)
->getNumberFormat()
- ->setFormatCode('yyyy-mmm-dd');
+ ->setFormatCode('yyyy-mm-dd');
// Test the formulae
$helper->log('Warning: The PhpSpreadsheet DATEVALUE() function accepts a wider range of date formats than MS Excel DATEFORMAT() function.');
for ($row = 1; $row <= $testDateCount; ++$row) {
- $helper->log('Date String: ' . $worksheet->getCell('A' . $row)->getFormattedValue());
+ $helper->log("(A{$row}) Date String: " . $worksheet->getCell('A' . $row)->getFormattedValue());
$helper->log('Formula: ' . $worksheet->getCell('B' . $row)->getValue());
- $helper->log('Excel DateStamp: ' . $worksheet->getCell('B' . $row)->getFormattedValue());
- $helper->log('Formatted DateStamp' . $worksheet->getCell('C' . $row)->getFormattedValue());
+ $helper->log('Excel DateStamp: ' . $worksheet->getCell('B' . $row)->getCalculatedValue());
+ $helper->log('Formatted DateStamp: ' . $worksheet->getCell('C' . $row)->getFormattedValue());
$helper->log('');
}
diff --git a/samples/Calculations/DateTime/DAY.php b/samples/Calculations/DateTime/DAY.php
new file mode 100644
index 00000000..3a4da7e6
--- /dev/null
+++ b/samples/Calculations/DateTime/DAY.php
@@ -0,0 +1,50 @@
+titles($category, $functionName, $description);
+
+// Create new PhpSpreadsheet object
+$spreadsheet = new Spreadsheet();
+$worksheet = $spreadsheet->getActiveSheet();
+
+// Add some data
+$testDates = [
+ [1900, 1, 1],
+ [1904, 2, 14],
+ [1936, 3, 17],
+ [1964, 4, 29],
+ [1999, 5, 18],
+ [2000, 6, 21],
+ [2019, 7, 4],
+ [2020, 8, 31],
+ [1956, 9, 10],
+ [2010, 10, 10],
+ [1982, 11, 30],
+ [1960, 12, 19],
+ ['=YEAR(TODAY())', '=MONTH(TODAY())', '=DAY(TODAY())'],
+];
+$testDateCount = count($testDates);
+
+$worksheet->fromArray($testDates, null, 'A1', true);
+
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $worksheet->setCellValue('D' . $row, '=DATE(A' . $row . ',B' . $row . ',C' . $row . ')');
+ $worksheet->setCellValue('E' . $row, '=D' . $row);
+ $worksheet->setCellValue('F' . $row, '=DAY(D' . $row . ')');
+}
+$worksheet->getStyle('E1:E' . $testDateCount)
+ ->getNumberFormat()
+ ->setFormatCode('yyyy-mm-dd');
+
+// Test the formulae
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $helper->log(sprintf('(E%d): %s', $row, $worksheet->getCell('E' . $row)->getFormattedValue()));
+ $helper->log('Day is: ' . $worksheet->getCell('F' . $row)->getCalculatedValue());
+}
diff --git a/samples/Calculations/DateTime/DAYS.php b/samples/Calculations/DateTime/DAYS.php
new file mode 100644
index 00000000..ddd47f37
--- /dev/null
+++ b/samples/Calculations/DateTime/DAYS.php
@@ -0,0 +1,52 @@
+titles($category, $functionName, $description);
+
+// Create new PhpSpreadsheet object
+$spreadsheet = new Spreadsheet();
+$worksheet = $spreadsheet->getActiveSheet();
+
+// Add some data
+$testDates = [
+ [1900, 1, 1],
+ [1904, 1, 1],
+ [1936, 3, 17],
+ [1960, 12, 19],
+ [1999, 12, 31],
+ [2000, 1, 1],
+ [2019, 2, 14],
+ [2020, 7, 4],
+ [2029, 12, 31],
+ [2525, 1, 1],
+];
+$testDateCount = count($testDates);
+
+$worksheet->fromArray($testDates, null, 'A1', true);
+
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $worksheet->setCellValue('D' . $row, '=DATE(A' . $row . ',B' . $row . ',C' . $row . ')');
+ $worksheet->setCellValue('E' . $row, '=D' . $row);
+ $worksheet->setCellValue('F' . $row, '=TODAY()');
+ $worksheet->setCellValue('G' . $row, '=DAYS(D' . $row . ', F' . $row . ')');
+}
+$worksheet->getStyle('E1:F' . $testDateCount)
+ ->getNumberFormat()
+ ->setFormatCode('yyyy-mm-dd');
+
+// Test the formulae
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $helper->log(sprintf(
+ 'Between: %s and %s',
+ $worksheet->getCell('E' . $row)->getFormattedValue(),
+ $worksheet->getCell('F' . $row)->getFormattedValue()
+ ));
+ $helper->log('Days: ' . $worksheet->getCell('G' . $row)->getCalculatedValue());
+}
diff --git a/samples/Calculations/DateTime/DAYS360.php b/samples/Calculations/DateTime/DAYS360.php
new file mode 100644
index 00000000..b0e2fdbb
--- /dev/null
+++ b/samples/Calculations/DateTime/DAYS360.php
@@ -0,0 +1,57 @@
+titles($category, $functionName, $description);
+
+// Create new PhpSpreadsheet object
+$spreadsheet = new Spreadsheet();
+$worksheet = $spreadsheet->getActiveSheet();
+
+// Add some data
+$testDates = [
+ [1900, 1, 1],
+ [1904, 1, 1],
+ [1936, 3, 17],
+ [1960, 12, 19],
+ [1999, 12, 31],
+ [2000, 1, 1],
+ [2019, 2, 14],
+ [2020, 7, 4],
+ [2029, 12, 31],
+ [2525, 1, 1],
+];
+$testDateCount = count($testDates);
+
+$worksheet->fromArray($testDates, null, 'A1', true);
+
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $worksheet->setCellValue('D' . $row, '=DATE(A' . $row . ',B' . $row . ',C' . $row . ')');
+ $worksheet->setCellValue('E' . $row, '=D' . $row);
+ $worksheet->setCellValue('F' . $row, '=DATE(2022,12,31)');
+ $worksheet->setCellValue('G' . $row, '=DAYS360(D' . $row . ', F' . $row . ', FALSE)');
+ $worksheet->setCellValue('H' . $row, '=DAYS360(D' . $row . ', F' . $row . ', TRUE)');
+}
+$worksheet->getStyle('E1:F' . $testDateCount)
+ ->getNumberFormat()
+ ->setFormatCode('yyyy-mm-dd');
+
+// Test the formulae
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $helper->log(sprintf(
+ 'Between: %s and %s',
+ $worksheet->getCell('E' . $row)->getFormattedValue(),
+ $worksheet->getCell('F' . $row)->getFormattedValue()
+ ));
+ $helper->log(sprintf(
+ 'Days: %d (US) %d (European)',
+ $worksheet->getCell('G' . $row)->getCalculatedValue(),
+ $worksheet->getCell('H' . $row)->getCalculatedValue()
+ ));
+}
diff --git a/samples/Calculations/DateTime/EDATE.php b/samples/Calculations/DateTime/EDATE.php
new file mode 100644
index 00000000..be6e4d19
--- /dev/null
+++ b/samples/Calculations/DateTime/EDATE.php
@@ -0,0 +1,43 @@
+titles($category, $functionName, $description);
+
+// Create new PhpSpreadsheet object
+$spreadsheet = new Spreadsheet();
+$worksheet = $spreadsheet->getActiveSheet();
+
+$months = range(-12, 12);
+$testDateCount = count($months);
+
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $worksheet->setCellValue('A' . $row, '=DATE(2020,12,31)');
+ $worksheet->setCellValue('B' . $row, '=A' . $row);
+ $worksheet->setCellValue('C' . $row, $months[$row - 1]);
+ $worksheet->setCellValue('D' . $row, '=EDATE(B' . $row . ', C' . $row . ')');
+}
+$worksheet->getStyle('B1:B' . $testDateCount)
+ ->getNumberFormat()
+ ->setFormatCode('yyyy-mm-dd');
+
+$worksheet->getStyle('D1:D' . $testDateCount)
+ ->getNumberFormat()
+ ->setFormatCode('yyyy-mm-dd');
+
+// Test the formulae
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $helper->log(sprintf(
+ '%s and %d months is %d (%s)',
+ $worksheet->getCell('B' . $row)->getFormattedValue(),
+ $worksheet->getCell('C' . $row)->getFormattedValue(),
+ $worksheet->getCell('D' . $row)->getCalculatedValue(),
+ $worksheet->getCell('D' . $row)->getFormattedValue()
+ ));
+}
diff --git a/samples/Calculations/DateTime/EOMONTH.php b/samples/Calculations/DateTime/EOMONTH.php
new file mode 100644
index 00000000..e0b7568a
--- /dev/null
+++ b/samples/Calculations/DateTime/EOMONTH.php
@@ -0,0 +1,43 @@
+titles($category, $functionName, $description);
+
+// Create new PhpSpreadsheet object
+$spreadsheet = new Spreadsheet();
+$worksheet = $spreadsheet->getActiveSheet();
+
+$months = range(-12, 12);
+$testDateCount = count($months);
+
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $worksheet->setCellValue('A' . $row, '=DATE(2020,1,1)');
+ $worksheet->setCellValue('B' . $row, '=A' . $row);
+ $worksheet->setCellValue('C' . $row, $months[$row - 1]);
+ $worksheet->setCellValue('D' . $row, '=EOMONTH(B' . $row . ', C' . $row . ')');
+}
+$worksheet->getStyle('B1:B' . $testDateCount)
+ ->getNumberFormat()
+ ->setFormatCode('yyyy-mm-dd');
+
+$worksheet->getStyle('D1:D' . $testDateCount)
+ ->getNumberFormat()
+ ->setFormatCode('yyyy-mm-dd');
+
+// Test the formulae
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $helper->log(sprintf(
+ '%s and %d months is %d (%s)',
+ $worksheet->getCell('B' . $row)->getFormattedValue(),
+ $worksheet->getCell('C' . $row)->getFormattedValue(),
+ $worksheet->getCell('D' . $row)->getCalculatedValue(),
+ $worksheet->getCell('D' . $row)->getFormattedValue()
+ ));
+}
diff --git a/samples/Calculations/DateTime/HOUR.php b/samples/Calculations/DateTime/HOUR.php
new file mode 100644
index 00000000..53c21644
--- /dev/null
+++ b/samples/Calculations/DateTime/HOUR.php
@@ -0,0 +1,48 @@
+titles($category, $functionName, $description);
+
+// Create new PhpSpreadsheet object
+$spreadsheet = new Spreadsheet();
+$worksheet = $spreadsheet->getActiveSheet();
+
+// Add some data
+$testTimes = [
+ [0, 6, 0],
+ [1, 12, 15],
+ [3, 30, 12],
+ [5, 17, 31],
+ [8, 15, 45],
+ [12, 45, 11],
+ [14, 0, 30],
+ [17, 55, 50],
+ [19, 21, 8],
+ [21, 10, 10],
+ [23, 59, 59],
+];
+$testTimeCount = count($testTimes);
+
+$worksheet->fromArray($testTimes, null, 'A1', true);
+
+for ($row = 1; $row <= $testTimeCount; ++$row) {
+ $worksheet->setCellValue('D' . $row, '=TIME(A' . $row . ',B' . $row . ',C' . $row . ')');
+ $worksheet->setCellValue('E' . $row, '=D' . $row);
+ $worksheet->setCellValue('F' . $row, '=HOUR(D' . $row . ')');
+}
+$worksheet->getStyle('E1:E' . $testTimeCount)
+ ->getNumberFormat()
+ ->setFormatCode('hh:mm:ss');
+
+// Test the formulae
+for ($row = 1; $row <= $testTimeCount; ++$row) {
+ $helper->log(sprintf('(E%d): %s', $row, $worksheet->getCell('E' . $row)->getFormattedValue()));
+ $helper->log('Hour is: ' . $worksheet->getCell('F' . $row)->getCalculatedValue());
+}
diff --git a/samples/Calculations/DateTime/ISOWEEKNUM.php b/samples/Calculations/DateTime/ISOWEEKNUM.php
new file mode 100644
index 00000000..4a989fbd
--- /dev/null
+++ b/samples/Calculations/DateTime/ISOWEEKNUM.php
@@ -0,0 +1,50 @@
+titles($category, $functionName, $description);
+
+// Create new PhpSpreadsheet object
+$spreadsheet = new Spreadsheet();
+$worksheet = $spreadsheet->getActiveSheet();
+
+// Add some data
+$testDates = [
+ [1900, 1, 1],
+ [1904, 2, 14],
+ [1936, 3, 17],
+ [1964, 4, 29],
+ [1999, 5, 18],
+ [2000, 6, 21],
+ [2019, 7, 4],
+ [2020, 8, 31],
+ [1956, 9, 10],
+ [2010, 10, 10],
+ [1982, 11, 30],
+ [1960, 12, 19],
+ ['=YEAR(TODAY())', '=MONTH(TODAY())', '=DAY(TODAY())'],
+];
+$testDateCount = count($testDates);
+
+$worksheet->fromArray($testDates, null, 'A1', true);
+
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $worksheet->setCellValue('D' . $row, '=DATE(A' . $row . ',B' . $row . ',C' . $row . ')');
+ $worksheet->setCellValue('E' . $row, '=D' . $row);
+ $worksheet->setCellValue('F' . $row, '=ISOWEEKNUM(D' . $row . ')');
+}
+$worksheet->getStyle('E1:E' . $testDateCount)
+ ->getNumberFormat()
+ ->setFormatCode('yyyy-mm-dd');
+
+// Test the formulae
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $helper->log(sprintf('(E%d): %s', $row, $worksheet->getCell('E' . $row)->getFormattedValue()));
+ $helper->log('ISO Week number is: ' . $worksheet->getCell('F' . $row)->getCalculatedValue());
+}
diff --git a/samples/Calculations/DateTime/MINUTE.php b/samples/Calculations/DateTime/MINUTE.php
new file mode 100644
index 00000000..11e90e13
--- /dev/null
+++ b/samples/Calculations/DateTime/MINUTE.php
@@ -0,0 +1,48 @@
+titles($category, $functionName, $description);
+
+// Create new PhpSpreadsheet object
+$spreadsheet = new Spreadsheet();
+$worksheet = $spreadsheet->getActiveSheet();
+
+// Add some data
+$testTimes = [
+ [0, 6, 0],
+ [1, 12, 15],
+ [3, 30, 12],
+ [5, 17, 31],
+ [8, 15, 45],
+ [12, 45, 11],
+ [14, 0, 30],
+ [17, 55, 50],
+ [19, 21, 8],
+ [21, 10, 10],
+ [23, 59, 59],
+];
+$testTimeCount = count($testTimes);
+
+$worksheet->fromArray($testTimes, null, 'A1', true);
+
+for ($row = 1; $row <= $testTimeCount; ++$row) {
+ $worksheet->setCellValue('D' . $row, '=TIME(A' . $row . ',B' . $row . ',C' . $row . ')');
+ $worksheet->setCellValue('E' . $row, '=D' . $row);
+ $worksheet->setCellValue('F' . $row, '=MINUTE(D' . $row . ')');
+}
+$worksheet->getStyle('E1:E' . $testTimeCount)
+ ->getNumberFormat()
+ ->setFormatCode('hh:mm:ss');
+
+// Test the formulae
+for ($row = 1; $row <= $testTimeCount; ++$row) {
+ $helper->log(sprintf('(E%d): %s', $row, $worksheet->getCell('E' . $row)->getFormattedValue()));
+ $helper->log('Minute is: ' . $worksheet->getCell('F' . $row)->getCalculatedValue());
+}
diff --git a/samples/Calculations/DateTime/MONTH.php b/samples/Calculations/DateTime/MONTH.php
new file mode 100644
index 00000000..8cceaf4c
--- /dev/null
+++ b/samples/Calculations/DateTime/MONTH.php
@@ -0,0 +1,50 @@
+titles($category, $functionName, $description);
+
+// Create new PhpSpreadsheet object
+$spreadsheet = new Spreadsheet();
+$worksheet = $spreadsheet->getActiveSheet();
+
+// Add some data
+$testDates = [
+ [1900, 1, 1],
+ [1904, 2, 14],
+ [1936, 3, 17],
+ [1964, 4, 29],
+ [1999, 5, 18],
+ [2000, 6, 21],
+ [2019, 7, 4],
+ [2020, 8, 31],
+ [1956, 9, 10],
+ [2010, 10, 10],
+ [1982, 11, 30],
+ [1960, 12, 19],
+ ['=YEAR(TODAY())', '=MONTH(TODAY())', '=DAY(TODAY())'],
+];
+$testDateCount = count($testDates);
+
+$worksheet->fromArray($testDates, null, 'A1', true);
+
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $worksheet->setCellValue('D' . $row, '=DATE(A' . $row . ',B' . $row . ',C' . $row . ')');
+ $worksheet->setCellValue('E' . $row, '=D' . $row);
+ $worksheet->setCellValue('F' . $row, '=MONTH(D' . $row . ')');
+}
+$worksheet->getStyle('E1:E' . $testDateCount)
+ ->getNumberFormat()
+ ->setFormatCode('yyyy-mm-dd');
+
+// Test the formulae
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $helper->log(sprintf('(E%d): %s', $row, $worksheet->getCell('E' . $row)->getFormattedValue()));
+ $helper->log('Month is: ' . $worksheet->getCell('F' . $row)->getCalculatedValue());
+}
diff --git a/samples/Calculations/DateTime/NOW.php b/samples/Calculations/DateTime/NOW.php
new file mode 100644
index 00000000..858a3162
--- /dev/null
+++ b/samples/Calculations/DateTime/NOW.php
@@ -0,0 +1,27 @@
+titles($category, $functionName, $description);
+
+// Create new PhpSpreadsheet object
+$spreadsheet = new Spreadsheet();
+$worksheet = $spreadsheet->getActiveSheet();
+
+$worksheet->setCellValue('A1', '=NOW()');
+$worksheet->getStyle('A1')
+ ->getNumberFormat()
+ ->setFormatCode('yyyy-mm-dd hh:mm:ss');
+
+// Test the formulae
+$helper->log(sprintf(
+ 'Today is %f (%s)',
+ $worksheet->getCell('A1')->getCalculatedValue(),
+ $worksheet->getCell('A1')->getFormattedValue()
+));
diff --git a/samples/Calculations/DateTime/SECOND.php b/samples/Calculations/DateTime/SECOND.php
new file mode 100644
index 00000000..33806fd5
--- /dev/null
+++ b/samples/Calculations/DateTime/SECOND.php
@@ -0,0 +1,48 @@
+titles($category, $functionName, $description);
+
+// Create new PhpSpreadsheet object
+$spreadsheet = new Spreadsheet();
+$worksheet = $spreadsheet->getActiveSheet();
+
+// Add some data
+$testTimes = [
+ [0, 6, 0],
+ [1, 12, 15],
+ [3, 30, 12],
+ [5, 17, 31],
+ [8, 15, 45],
+ [12, 45, 11],
+ [14, 0, 30],
+ [17, 55, 50],
+ [19, 21, 8],
+ [21, 10, 10],
+ [23, 59, 59],
+];
+$testTimeCount = count($testTimes);
+
+$worksheet->fromArray($testTimes, null, 'A1', true);
+
+for ($row = 1; $row <= $testTimeCount; ++$row) {
+ $worksheet->setCellValue('D' . $row, '=TIME(A' . $row . ',B' . $row . ',C' . $row . ')');
+ $worksheet->setCellValue('E' . $row, '=D' . $row);
+ $worksheet->setCellValue('F' . $row, '=SECOND(D' . $row . ')');
+}
+$worksheet->getStyle('E1:E' . $testTimeCount)
+ ->getNumberFormat()
+ ->setFormatCode('hh:mm:ss');
+
+// Test the formulae
+for ($row = 1; $row <= $testTimeCount; ++$row) {
+ $helper->log(sprintf('(E%d): %s', $row, $worksheet->getCell('E' . $row)->getFormattedValue()));
+ $helper->log('Second is: ' . $worksheet->getCell('F' . $row)->getCalculatedValue());
+}
diff --git a/samples/Calculations/DateTime/TIME.php b/samples/Calculations/DateTime/TIME.php
index 3d4208ad..42c45488 100644
--- a/samples/Calculations/DateTime/TIME.php
+++ b/samples/Calculations/DateTime/TIME.php
@@ -4,7 +4,11 @@ use PhpOffice\PhpSpreadsheet\Spreadsheet;
require __DIR__ . '/../../Header.php';
-$helper->log('Returns the serial number of a particular time.');
+$category = 'Date/Time';
+$functionName = 'TIME';
+$description = 'Returns the Excel serial number of a particular time';
+
+$helper->titles($category, $functionName, $description);
// Create new PhpSpreadsheet object
$spreadsheet = new Spreadsheet();
@@ -29,11 +33,11 @@ $worksheet->getStyle('E1:E' . $testDateCount)
// Test the formulae
for ($row = 1; $row <= $testDateCount; ++$row) {
- $helper->log('Hour: ' . $worksheet->getCell('A' . $row)->getFormattedValue());
- $helper->log('Minute: ' . $worksheet->getCell('B' . $row)->getFormattedValue());
- $helper->log('Second: ' . $worksheet->getCell('C' . $row)->getFormattedValue());
+ $helper->log("(A{$row}) Hour: " . $worksheet->getCell('A' . $row)->getFormattedValue());
+ $helper->log("(B{$row}) Minute: " . $worksheet->getCell('B' . $row)->getFormattedValue());
+ $helper->log("(C{$row}) Second: " . $worksheet->getCell('C' . $row)->getFormattedValue());
$helper->log('Formula: ' . $worksheet->getCell('D' . $row)->getValue());
- $helper->log('Excel TimeStamp: ' . $worksheet->getCell('D' . $row)->getFormattedValue());
+ $helper->log('Excel TimeStamp: ' . $worksheet->getCell('D' . $row)->getCalculatedValue());
$helper->log('Formatted TimeStamp: ' . $worksheet->getCell('E' . $row)->getFormattedValue());
$helper->log('');
}
diff --git a/samples/Calculations/DateTime/TIMEVALUE.php b/samples/Calculations/DateTime/TIMEVALUE.php
index f75393cd..15ea8cd9 100644
--- a/samples/Calculations/DateTime/TIMEVALUE.php
+++ b/samples/Calculations/DateTime/TIMEVALUE.php
@@ -4,7 +4,11 @@ use PhpOffice\PhpSpreadsheet\Spreadsheet;
require __DIR__ . '/../../Header.php';
-$helper->log('Converts a time in the form of text to a serial number.');
+$category = 'Date/Time';
+$functionName = 'DATEVALUE';
+$description = 'Converts a time in the form of text to an Excel serial number';
+
+$helper->titles($category, $functionName, $description);
// Create new PhpSpreadsheet object
$spreadsheet = new Spreadsheet();
@@ -27,7 +31,7 @@ $worksheet->getStyle('C1:C' . $testDateCount)
// Test the formulae
for ($row = 1; $row <= $testDateCount; ++$row) {
- $helper->log('Time String: ' . $worksheet->getCell('A' . $row)->getFormattedValue());
+ $helper->log("(A{$row}) Time String: " . $worksheet->getCell('A' . $row)->getFormattedValue());
$helper->log('Formula: ' . $worksheet->getCell('B' . $row)->getValue());
$helper->log('Excel TimeStamp: ' . $worksheet->getCell('B' . $row)->getFormattedValue());
$helper->log('Formatted TimeStamp: ' . $worksheet->getCell('C' . $row)->getFormattedValue());
diff --git a/samples/Calculations/DateTime/TODAY.php b/samples/Calculations/DateTime/TODAY.php
new file mode 100644
index 00000000..031149d5
--- /dev/null
+++ b/samples/Calculations/DateTime/TODAY.php
@@ -0,0 +1,27 @@
+titles($category, $functionName, $description);
+
+// Create new PhpSpreadsheet object
+$spreadsheet = new Spreadsheet();
+$worksheet = $spreadsheet->getActiveSheet();
+
+$worksheet->setCellValue('A1', '=TODAY()');
+$worksheet->getStyle('A1')
+ ->getNumberFormat()
+ ->setFormatCode('yyyy-mm-dd');
+
+// Test the formulae
+$helper->log(sprintf(
+ 'Today is %d (%s)',
+ $worksheet->getCell('A1')->getCalculatedValue(),
+ $worksheet->getCell('A1')->getFormattedValue()
+));
diff --git a/samples/Calculations/DateTime/WEEKDAY.php b/samples/Calculations/DateTime/WEEKDAY.php
new file mode 100644
index 00000000..7d4b4288
--- /dev/null
+++ b/samples/Calculations/DateTime/WEEKDAY.php
@@ -0,0 +1,58 @@
+titles($category, $functionName, $description);
+
+// Create new PhpSpreadsheet object
+$spreadsheet = new Spreadsheet();
+$worksheet = $spreadsheet->getActiveSheet();
+
+// Add some data
+$testDates = [
+ [1900, 1, 1],
+ [1904, 2, 14],
+ [1936, 3, 17],
+ [1964, 4, 29],
+ [1999, 5, 18],
+ [2000, 6, 21],
+ [2019, 7, 4],
+ [2020, 8, 31],
+ [1956, 9, 10],
+ [2010, 10, 10],
+ [1982, 11, 30],
+ [1960, 12, 19],
+ ['=YEAR(TODAY())', '=MONTH(TODAY())', '=DAY(TODAY())'],
+];
+$testDateCount = count($testDates);
+
+$worksheet->fromArray($testDates, null, 'A1', true);
+
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $worksheet->setCellValue('D' . $row, '=DATE(A' . $row . ',B' . $row . ',C' . $row . ')');
+ $worksheet->setCellValue('E' . $row, '=D' . $row);
+ $worksheet->setCellValue('F' . $row, '=WEEKDAY(D' . $row . ')');
+ $worksheet->setCellValue('G' . $row, '=WEEKDAY(D' . $row . ', 2)');
+}
+$worksheet->getStyle('E1:E' . $testDateCount)
+ ->getNumberFormat()
+ ->setFormatCode('yyyy-mm-dd');
+
+// Test the formulae
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $helper->log(sprintf('(E%d): %s', $row, $worksheet->getCell('E' . $row)->getFormattedValue()));
+ $helper->log(sprintf(
+ 'Weekday is: %d (1-7 = Sun-Sat)',
+ $worksheet->getCell('F' . $row)->getCalculatedValue()
+ ));
+ $helper->log(sprintf(
+ 'Weekday is: %d (1-7 = Mon-Sun)',
+ $worksheet->getCell('G' . $row)->getCalculatedValue()
+ ));
+}
diff --git a/samples/Calculations/DateTime/WEEKNUM.php b/samples/Calculations/DateTime/WEEKNUM.php
new file mode 100644
index 00000000..1d4c4a12
--- /dev/null
+++ b/samples/Calculations/DateTime/WEEKNUM.php
@@ -0,0 +1,52 @@
+titles($category, $functionName, $description);
+
+// Create new PhpSpreadsheet object
+$spreadsheet = new Spreadsheet();
+$worksheet = $spreadsheet->getActiveSheet();
+
+// Add some data
+$testDates = [
+ [1900, 1, 1],
+ [1904, 2, 14],
+ [1936, 3, 17],
+ [1964, 4, 29],
+ [1999, 5, 18],
+ [2000, 6, 21],
+ [2019, 7, 4],
+ [2020, 8, 31],
+ [1956, 9, 10],
+ [2010, 10, 10],
+ [1982, 11, 30],
+ [1960, 12, 19],
+ ['=YEAR(TODAY())', '=MONTH(TODAY())', '=DAY(TODAY())'],
+];
+$testDateCount = count($testDates);
+
+$worksheet->fromArray($testDates, null, 'A1', true);
+
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $worksheet->setCellValue('D' . $row, '=DATE(A' . $row . ',B' . $row . ',C' . $row . ')');
+ $worksheet->setCellValue('E' . $row, '=D' . $row);
+ $worksheet->setCellValue('F' . $row, '=WEEKNUM(D' . $row . ')');
+ $worksheet->setCellValue('G' . $row, '=WEEKNUM(D' . $row . ', 21)');
+}
+$worksheet->getStyle('E1:E' . $testDateCount)
+ ->getNumberFormat()
+ ->setFormatCode('yyyy-mm-dd');
+
+// Test the formulae
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $helper->log(sprintf('(E%d): %s', $row, $worksheet->getCell('E' . $row)->getFormattedValue()));
+ $helper->log('System 1 Week number is: ' . $worksheet->getCell('F' . $row)->getCalculatedValue());
+ $helper->log('System 2 (ISO-8601) Week number is: ' . $worksheet->getCell('G' . $row)->getCalculatedValue());
+}
diff --git a/samples/Calculations/DateTime/YEAR.php b/samples/Calculations/DateTime/YEAR.php
new file mode 100644
index 00000000..f7bfa6ea
--- /dev/null
+++ b/samples/Calculations/DateTime/YEAR.php
@@ -0,0 +1,50 @@
+titles($category, $functionName, $description);
+
+// Create new PhpSpreadsheet object
+$spreadsheet = new Spreadsheet();
+$worksheet = $spreadsheet->getActiveSheet();
+
+// Add some data
+$testDates = [
+ [1900, 1, 1],
+ [1904, 2, 14],
+ [1936, 3, 17],
+ [1964, 4, 29],
+ [1999, 5, 18],
+ [2000, 6, 21],
+ [2019, 7, 4],
+ [2020, 8, 31],
+ [1956, 9, 10],
+ [2010, 10, 10],
+ [1982, 11, 30],
+ [1960, 12, 19],
+ ['=YEAR(TODAY())', '=MONTH(TODAY())', '=DAY(TODAY())'],
+];
+$testDateCount = count($testDates);
+
+$worksheet->fromArray($testDates, null, 'A1', true);
+
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $worksheet->setCellValue('D' . $row, '=DATE(A' . $row . ',B' . $row . ',C' . $row . ')');
+ $worksheet->setCellValue('E' . $row, '=D' . $row);
+ $worksheet->setCellValue('F' . $row, '=YEAR(D' . $row . ')');
+}
+$worksheet->getStyle('E1:E' . $testDateCount)
+ ->getNumberFormat()
+ ->setFormatCode('yyyy-mm-dd');
+
+// Test the formulae
+for ($row = 1; $row <= $testDateCount; ++$row) {
+ $helper->log(sprintf('(E%d): %s', $row, $worksheet->getCell('E' . $row)->getFormattedValue()));
+ $helper->log('Year is: ' . $worksheet->getCell('F' . $row)->getCalculatedValue());
+}
diff --git a/src/PhpSpreadsheet/Helper/Sample.php b/src/PhpSpreadsheet/Helper/Sample.php
index 8ce37003..9f7563d6 100644
--- a/src/PhpSpreadsheet/Helper/Sample.php
+++ b/src/PhpSpreadsheet/Helper/Sample.php
@@ -4,6 +4,7 @@ namespace PhpOffice\PhpSpreadsheet\Helper;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
+use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use PhpOffice\PhpSpreadsheet\Writer\IWriter;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
@@ -182,6 +183,33 @@ class Sample
echo date('H:i:s ') . $message . $eol;
}
+ public function titles(string $category, string $functionName, ?string $description = null): void
+ {
+ $this->log(sprintf('%s Functions:', $category));
+ $description === null
+ ? $this->log(sprintf('Function: %s()', rtrim($functionName, '()')))
+ : $this->log(sprintf('Function: %s() - %s.', rtrim($functionName, '()'), rtrim($description, '.')));
+ }
+
+ public function displayGrid(array $matrix): void
+ {
+ $renderer = new TextGrid($matrix, $this->isCli());
+ echo $renderer->render();
+ }
+
+ public function logCalculationResult(
+ Worksheet $worksheet,
+ string $functionName,
+ string $formulaCell,
+ ?string $descriptionCell = null
+ ): void {
+ if ($descriptionCell !== null) {
+ $this->log($worksheet->getCell($descriptionCell)->getValue());
+ }
+ $this->log($worksheet->getCell($formulaCell)->getValue());
+ $this->log(sprintf('%s() Result is ', $functionName) . $worksheet->getCell($formulaCell)->getCalculatedValue());
+ }
+
/**
* Log ending notes.
*/
diff --git a/src/PhpSpreadsheet/Helper/TextGrid.php b/src/PhpSpreadsheet/Helper/TextGrid.php
new file mode 100644
index 00000000..acb9ae60
--- /dev/null
+++ b/src/PhpSpreadsheet/Helper/TextGrid.php
@@ -0,0 +1,139 @@
+rows = array_keys($matrix);
+ $this->columns = array_keys($matrix[$this->rows[0]]);
+
+ $matrix = array_values($matrix);
+ array_walk(
+ $matrix,
+ function (&$row): void {
+ $row = array_values($row);
+ }
+ );
+
+ $this->matrix = $matrix;
+ $this->isCli = $isCli;
+ }
+
+ public function render(): string
+ {
+ $this->gridDisplay = $this->isCli ? '' : '';
+
+ $maxRow = max($this->rows);
+ $maxRowLength = strlen((string) $maxRow) + 1;
+ $columnWidths = $this->getColumnWidths($this->matrix);
+
+ $this->renderColumnHeader($maxRowLength, $columnWidths);
+ $this->renderRows($maxRowLength, $columnWidths);
+ $this->renderFooter($maxRowLength, $columnWidths);
+
+ $this->gridDisplay .= $this->isCli ? '' : '';
+
+ return $this->gridDisplay;
+ }
+
+ private function renderRows(int $maxRowLength, array $columnWidths): void
+ {
+ foreach ($this->matrix as $row => $rowData) {
+ $this->gridDisplay .= '|' . str_pad((string) $this->rows[$row], $maxRowLength, ' ', STR_PAD_LEFT) . ' ';
+ $this->renderCells($rowData, $columnWidths);
+ $this->gridDisplay .= '|' . PHP_EOL;
+ }
+ }
+
+ private function renderCells(array $rowData, array $columnWidths): void
+ {
+ foreach ($rowData as $column => $cell) {
+ $cell = ($this->isCli) ? (string) $cell : htmlentities((string) $cell);
+ $this->gridDisplay .= '| ';
+ $this->gridDisplay .= str_pad($cell, $columnWidths[$column] + 1, ' ');
+ }
+ }
+
+ private function renderColumnHeader(int $maxRowLength, array $columnWidths): void
+ {
+ $this->gridDisplay .= str_repeat(' ', $maxRowLength + 2);
+ foreach ($this->columns as $column => $reference) {
+ $this->gridDisplay .= '+-' . str_repeat('-', $columnWidths[$column] + 1);
+ }
+ $this->gridDisplay .= '+' . PHP_EOL;
+
+ $this->gridDisplay .= str_repeat(' ', $maxRowLength + 2);
+ foreach ($this->columns as $column => $reference) {
+ $this->gridDisplay .= '| ' . str_pad((string) $reference, $columnWidths[$column] + 1, ' ');
+ }
+ $this->gridDisplay .= '|' . PHP_EOL;
+
+ $this->renderFooter($maxRowLength, $columnWidths);
+ }
+
+ private function renderFooter(int $maxRowLength, array $columnWidths): void
+ {
+ $this->gridDisplay .= '+' . str_repeat('-', $maxRowLength + 1);
+ foreach ($this->columns as $column => $reference) {
+ $this->gridDisplay .= '+-';
+ $this->gridDisplay .= str_pad((string) '', $columnWidths[$column] + 1, '-');
+ }
+ $this->gridDisplay .= '+' . PHP_EOL;
+ }
+
+ private function getColumnWidths(array $matrix): array
+ {
+ $columnCount = count($this->matrix, COUNT_RECURSIVE) / count($this->matrix);
+ $columnWidths = [];
+ for ($column = 0; $column < $columnCount; ++$column) {
+ $columnWidths[] = $this->getColumnWidth(array_column($this->matrix, $column));
+ }
+
+ return $columnWidths;
+ }
+
+ private function getColumnWidth(array $columnData): int
+ {
+ $columnWidth = 0;
+ $columnData = array_values($columnData);
+
+ foreach ($columnData as $columnValue) {
+ if (is_string($columnValue)) {
+ $columnWidth = max($columnWidth, strlen($columnValue));
+ } elseif (is_bool($columnValue)) {
+ $columnWidth = max($columnWidth, strlen($columnValue ? 'TRUE' : 'FALSE'));
+ }
+
+ $columnWidth = max($columnWidth, strlen((string) $columnWidth));
+ }
+
+ return $columnWidth;
+ }
+}