From 2098df746712bd6ffd2f24eb429a2ef9d72eca12 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Mon, 8 Dec 2025 14:04:24 +0100 Subject: [PATCH 01/88] broken javadoc --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d9fa9a21e1..be4cf151ef 100644 --- a/build.gradle +++ b/build.gradle @@ -210,7 +210,7 @@ subprojects { links 'https://poi.apache.org/apidocs/dev/' if (jdkVersion >= 23) links 'https://docs.oracle.com/en/java/javase/23/docs/api/' else links 'https://docs.oracle.com/en/java/javase/11/docs/api/' links 'https://xmlbeans.apache.org/docs/5.0.0/' - links 'https://commons.apache.org/proper/commons-compress/apidocs/' + links 'https://javadoc.io/doc/org.apache.commons/commons-compress/1.27.1/' use = true splitIndex = true source = "11" From 027927bfade4e099156a9f98648476716d6c530e Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Mon, 8 Dec 2025 15:47:50 +0100 Subject: [PATCH 02/88] [bz-69897] Fix null check for LineDash properties (#964) --- .../java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java index 4d3c78b933..6a1c6bb4ce 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java @@ -535,7 +535,7 @@ public abstract class XSLFSimpleShape extends XSLFShape @Override public boolean fetch(XSLFShape shape) { CTLineProperties ln = getLn(shape, false); - if (ln == null || !ln.isSetPrstDash()) { + if (ln == null || !ln.isSetPrstDash() || ln.getPrstDash().getVal() == null) { return false; } @@ -548,7 +548,7 @@ public abstract class XSLFSimpleShape extends XSLFShape LineDash dash = fetcher.getValue(); if (dash == null) { CTLineProperties defaultLn = getDefaultLineProperties(); - if (defaultLn != null && defaultLn.isSetPrstDash()) { + if (defaultLn != null && defaultLn.isSetPrstDash() && defaultLn.getPrstDash().getVal() != null) { dash = LineDash.fromOoxmlId(defaultLn.getPrstDash().getVal().intValue()); } } From e4e45826891aac6314058366189cfec14000cbe7 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Mon, 8 Dec 2025 20:56:38 +0100 Subject: [PATCH 03/88] add cell tests (#965) --- .../poi/xssf/usermodel/TestXSSFCell.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFCell.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFCell.java index 742b29af49..30363faf06 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFCell.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFCell.java @@ -61,6 +61,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellFormula; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst; import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellFormulaType; import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellType; @@ -762,4 +763,48 @@ public final class TestXSSFCell extends BaseTestXCell { Cell cell = new XSSFWorkbook().createSheet().createRow(0).createCell(0); assertThrows(IllegalStateException.class, cell::getErrorCellValue); } + + @Test + void setStringToBlank() throws IOException { + try (XSSFWorkbook wb = new XSSFWorkbook()) { + XSSFSheet sheet = wb.createSheet(); + XSSFCell cell = sheet.createRow(0).createCell(0); + cell.setCellValue("test123"); + cell.setCellType(CellType.BLANK); + assertEquals("", cell.getStringCellValue()); + } + } + + @Test + void setInlineStringToBlank() throws IOException { + try (XSSFWorkbook wb = new XSSFWorkbook()) { + XSSFSheet sheet = wb.createSheet(); + XSSFCell cell = sheet.createRow(0).createCell(0); + cell.setCellType(CellType.STRING); + CTRst rst = CTRst.Factory.newInstance(); + rst.setT("text123"); + cell.getCTCell().setT(STCellType.INLINE_STR); + cell.getCTCell().setIs(rst); + assertEquals("text123", cell.getStringCellValue()); + cell.setCellType(CellType.BLANK); + assertEquals("", cell.getStringCellValue()); + assertFalse(cell.getCTCell().isSetIs(), "cell has InlineString XML struct still?"); + } + } + + @Test + void setFormulaToBlank() throws IOException { + try (XSSFWorkbook wb = new XSSFWorkbook()) { + XSSFSheet sheet = wb.createSheet(); + XSSFCell cell = sheet.createRow(0).createCell(0); + cell.setCellFormula("ISODD(1)"); + cell.setCellValue("3.14"); + assertTrue(cell.getCTCell().isSetF(), "cell has formula XML struct?"); + assertEquals("ISODD(1)", cell.getCellFormula()); + assertEquals("3.14", cell.getStringCellValue()); + cell.setCellType(CellType.BLANK); + assertEquals("", cell.getStringCellValue()); + assertFalse(cell.getCTCell().isSetF(), "cell has formula XML struct still?"); + } + } } From 4b3c688d51d03b8706d97d0589cc8985d661dd94 Mon Sep 17 00:00:00 2001 From: hyun1024 <133631600+hyun1024@users.noreply.github.com> Date: Sat, 13 Dec 2025 21:06:04 +0900 Subject: [PATCH 04/88] Add methods to manage first slide number(firstSlideNum) (#968) * Add methods to manage first slide number(firstSlideNum) Adds methods to manage the custom starting slide number in XSLF (PowerPoint) presentations. This property is stored as the 'firstSlideNum' attribute in ppt/presentation.xml. The following methods are added to XMLSlideShow: - getFirstSlideNumber(): Retrieves the current starting slide number (default is 1). - setFirstSlideNumber(int num): Sets the custom starting slide number. - unsetFirstSlideNumber(): Removes the 'firstSlideNum' attribute, reverting to the default (1). Constraints: The 'set' method enforces the bounds [0, 9999] as defined by Microsoft's implementation specifications (MS-OI29500, Part 1, Section 19.2.1.26) to ensure the creation of valid PowerPoint files. Also includes TestXSLFSlideShow updates to cover the new functionality, persistence, and validation checks. * Review: Apply review feedback to firstSlideNumber feature - Add @since 6.0.0 Javadoc tag to getFirstSlideNumber(), setFirstSlideNumber(), and unsetFirstSlideNumber() methods in XMLSlideShow. - Refactor TestXSLFSlideShow to use explicit static JUnit imports (e.g., assertEquals, assertThrows) instead of wildcard imports, adhering to project coding style guidelines. * whitespace --------- Co-authored-by: PJ Fanning --- .../poi/xslf/usermodel/XMLSlideShow.java | 47 ++++++++ .../poi/xslf/usermodel/TestXSLFSlideShow.java | 102 +++++++++++++++++- 2 files changed, 145 insertions(+), 4 deletions(-) diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java index 63cea1a76c..44585f8b77 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java @@ -748,4 +748,51 @@ public class XMLSlideShow extends POIXMLDocument RelationPart rp = target.addRelation(null, XSLFRelation.IMAGES, pictureData); return rp.getRelationship().getId(); } + + /** + * Returns the number that shall be displayed on the first slide of the presentation. + * Subsequent slides will be numbered sequentially from this number. + * The default value is 1 if the property is not set in the presentation file. + * + * @return The starting number for the first slide (default is 1). + * @since 6.0.0 + */ + public int getFirstSlideNumber() { + // CTPresentation.getFirstSlideNum() returns the default value of 1 + // if the 'firstSlideNum' attribute is not set, as per OOXML standard. + return getCTPresentation().getFirstSlideNum(); + } + + /** + * Sets the custom number that shall be displayed on the first slide of the presentation. + * Subsequent slides will be numbered sequentially from this number. + * + * The value is restricted to the range [0, 9999] as defined in the Microsoft Office + * Implementation Information for ISO/IEC 29500 (MS-OI29500), specifically in + * Part 1, Section 19.2.1.26, presentation (Presentation), which restricts the + * XML Schema int datatype. + * + * @param num The starting number for the first slide (must be between 0 and 9999). + * @throws IllegalArgumentException if the provided number is outside the allowed range [0, 9999]. + * @since 6.0.0 + */ + public void setFirstSlideNumber(int num) { + // We enforce the PowerPoint application constraint (0 <= num <= 9999) + // to ensure that a valid file, as rendered by PowerPoint, is created. + if (num < 0 || num > 9999) { + throw new IllegalArgumentException( + "First slide number must be between 0 and 9999 (inclusive), as required by MS-OI29500 (Part 1, Section 19.2.1.26)."); + } + // Sets the attribute on the underlying CTPresentation object. + getCTPresentation().setFirstSlideNum(num); + } + + /** + * Unsets the custom first slide number, reverting the numbering to the default (1). + * This removes the 'firstSlideNum' attribute from presentation.xml. + * @since 6.0.0 + */ + public void unsetFirstSlideNumber() { + getCTPresentation().unsetFirstSlideNum(); + } } diff --git a/poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFSlideShow.java b/poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFSlideShow.java index 45e2aa31c2..312c804a3f 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFSlideShow.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFSlideShow.java @@ -16,10 +16,6 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertSame; - import java.awt.Dimension; import java.awt.Rectangle; import java.io.ByteArrayInputStream; @@ -34,6 +30,12 @@ import org.apache.poi.sl.usermodel.Placeholder; import org.apache.poi.xslf.XSLFTestDataSamples; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; + class TestXSLFSlideShow { @Test void testCreateSlide() throws IOException { @@ -327,4 +329,96 @@ class TestXSLFSlideShow { } } } + + /** + * Test getting the first slide number, which defaults to 1. + * The first slide number is stored in the presentation.xml part. + */ + @Test + void testGetFirstSlideNumberDefault() throws IOException { + try (XMLSlideShow ppt = new XMLSlideShow()) { + // Default value when attribute is not present should be 1 (as per OOXML standard and CTPresentation logic) + assertEquals(1, ppt.getFirstSlideNumber()); + } + } + + /** + * Test setting, getting, and persisting the custom first slide number. + */ + @Test + void testSetAndPersistFirstSlideNumber() throws IOException { + final int customStartNum = 5; + final int zeroStartNum = 0; + final int maxStartNum = 9999; + + try (XMLSlideShow ppt = new XMLSlideShow()) { + // 1. Set to a custom positive number (e.g., 5) + ppt.setFirstSlideNumber(customStartNum); + assertEquals(customStartNum, ppt.getFirstSlideNumber()); + + // Check persistence by writing out and reading back + try (XMLSlideShow ppt2 = XSLFTestDataSamples.writeOutAndReadBack(ppt)) { + assertEquals(customStartNum, ppt2.getFirstSlideNumber(), + "The custom first slide number should persist after save/load."); + } + + // 2. Set to minimum valid number (0) + ppt.setFirstSlideNumber(zeroStartNum); + assertEquals(zeroStartNum, ppt.getFirstSlideNumber()); + + // 3. Set to maximum valid number (9999) + ppt.setFirstSlideNumber(maxStartNum); + assertEquals(maxStartNum, ppt.getFirstSlideNumber()); + } + } + + /** + * Test unsetting the first slide number, which should revert it to the default (1). + */ + @Test + void testUnsetFirstSlideNumber() throws IOException { + try (XMLSlideShow ppt = new XMLSlideShow()) { + // 1. Set a custom number + ppt.setFirstSlideNumber(50); + assertEquals(50, ppt.getFirstSlideNumber()); + + // 2. Unset it + ppt.unsetFirstSlideNumber(); + + // It should return the default value (1) after unsetting + assertEquals(1, ppt.getFirstSlideNumber(), + "Unsetting the first slide number should revert it to the default of 1."); + + // Check persistence after unsetting + try (XMLSlideShow ppt2 = XSLFTestDataSamples.writeOutAndReadBack(ppt)) { + assertEquals(1, ppt2.getFirstSlideNumber(), + "The first slide number should remain the default (1) after unset and save/load."); + // Ensure the attribute is actually removed from the CTPresentation object + // Note: We access the internal object to confirm removal, which is acceptable in test code. + assertFalse(ppt2.getCTPresentation().isSetFirstSlideNum(), + "The 'firstSlideNum' attribute should be unset (removed) in the XML."); + } + } + } + + /** + * Test that setting an invalid first slide number (outside [0, 9999]) throws an exception. + */ + @Test + void testSetFirstSlideNumberValidation() throws IOException { + try (XMLSlideShow ppt = new XMLSlideShow()) { + // Test case: Negative number + assertThrows(IllegalArgumentException.class, () -> + ppt.setFirstSlideNumber(-1), + "Negative number should throw IllegalArgumentException."); + + // Test case: Number greater than 9999 + assertThrows(IllegalArgumentException.class, () -> + ppt.setFirstSlideNumber(10000), + "Number greater than 9999 should throw IllegalArgumentException."); + + // Ensure the value hasn't changed from the default after failed attempts + assertEquals(1, ppt.getFirstSlideNumber()); + } + } } From 0eb7135f2b02aae0c8cb37cb9806c8ad62480dc8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 13 Dec 2025 13:06:56 +0100 Subject: [PATCH 05/88] Bump org.sonarqube from 7.1.0.6387 to 7.2.0.6526 (#960) Bumps org.sonarqube from 7.1.0.6387 to 7.2.0.6526. --- updated-dependencies: - dependency-name: org.sonarqube dependency-version: 7.2.0.6526 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index be4cf151ef..7467733838 100644 --- a/build.gradle +++ b/build.gradle @@ -36,7 +36,7 @@ plugins { id 'distribution' id 'com.github.spotbugs' version '6.4.7' // 6.2.0+ requires JDK 11 id 'de.thetaphi.forbiddenapis' version '3.10' - id 'org.sonarqube' version '7.1.0.6387' + id 'org.sonarqube' version '7.2.0.6526' id 'org.cyclonedx.bom' version '2.4.1' id 'com.adarshr.test-logger' version '4.0.0' } From a9bc28a4bbda6adeb0ae0751c2ad242b9ccaf869 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 20:43:46 +0100 Subject: [PATCH 06/88] Bump org.mockito:mockito-core from 5.20.0 to 5.21.0 (#970) Bumps [org.mockito:mockito-core](https://github.com/mockito/mockito) from 5.20.0 to 5.21.0. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v5.20.0...v5.21.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-version: 5.21.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7467733838..0fc3d90383 100644 --- a/build.gradle +++ b/build.gradle @@ -114,7 +114,7 @@ subprojects { commonsMathVersion = '3.6.1' junitVersion = '5.13.4' log4jVersion = '2.24.3' - mockitoVersion = '5.20.0' + mockitoVersion = '5.21.0' hamcrestVersion = '3.0' xmlbeansVersion = '5.3.0' batikVersion = '1.19' From f476c64179749cb3e657c2b8bc8e5c9818146bdd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Dec 2025 15:44:28 +0100 Subject: [PATCH 07/88] Bump com.github.spotbugs from 6.4.7 to 6.4.8 (#972) Bumps com.github.spotbugs from 6.4.7 to 6.4.8. --- updated-dependencies: - dependency-name: com.github.spotbugs dependency-version: 6.4.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 0fc3d90383..6a0eac77da 100644 --- a/build.gradle +++ b/build.gradle @@ -34,7 +34,7 @@ plugins { id 'com.dorongold.task-tree' version '4.0.1' id 'org.nosphere.apache.rat' version '0.8.1' id 'distribution' - id 'com.github.spotbugs' version '6.4.7' // 6.2.0+ requires JDK 11 + id 'com.github.spotbugs' version '6.4.8' // 6.2.0+ requires JDK 11 id 'de.thetaphi.forbiddenapis' version '3.10' id 'org.sonarqube' version '7.2.0.6526' id 'org.cyclonedx.bom' version '2.4.1' From 4fb34ebeae0d200cd36c4fbf3b2496aef9988298 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Aragunde=20P=C3=A9rez?= Date: Tue, 16 Dec 2025 18:03:45 +0100 Subject: [PATCH 08/88] Fix rules for table style application in XSLFTables. (#969) * Fix rules for table style application in XSLFTables. Table styles contain rules for first and last rows/columns, even and odd rows/columns... When one of these rules is empty, we are supposed to fall back to the "whole table" rules. The fallback must also be applied for the format that's not explicitly specified in the specific rules. when the corresponding specific rule is missing some info. Fallback must also be applied when the corresponding specific rule is missing some info. A couple of examples from the reproducer/test file included: The included reproducer/test file contained a few problems related to table style application: * The second style for horizontal/vertical banding (band2H, band2V) was never applied. * In the table with horizontal banding enabled, the style band1H did not set a font color, POI returned a null font color instead of the color from wholeTable. * In the table with horizontal banding enabled, the style band2H did not set a background color, POI returned null instead of the color specified in wholeTable. This patches fixes the behaviors mentioned above, making POI behavior match the one from MS Office and LibreOffice. * Replace uses of java.util.list.getFirst(). --- .../poi/xslf/usermodel/XSLFTableCell.java | 40 ++++++++-- .../poi/xslf/usermodel/TestXSLFTable.java | 74 ++++++++++++++++-- .../table-with-different-font-colors.pptx | Bin 0 -> 36562 bytes 3 files changed, 102 insertions(+), 12 deletions(-) create mode 100644 test-data/slideshow/table-with-different-font-colors.pptx diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java index 019679f9bf..c43483912a 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java @@ -438,7 +438,8 @@ public class XSLFTableCell extends XSLFTextShape implements TableCell shapes = ppt.getSlides().get(0).getShapes(); + assertEquals(1, shapes.size()); + assertTrue(shapes.get(0) instanceof XSLFTable); + XSLFTable tbl = (XSLFTable)shapes.get(0); + assertEquals(4, tbl.getNumberOfColumns()); + assertEquals(4, tbl.getNumberOfRows()); + assertNotNull(tbl.getCTTable()); + + // Yellow font color due to "first row" table style + verifyTableCellStyleColors(tbl.getRows().get(0).getCells().get(0), "Text 1", + new Color(255, 255, 0), new Color(21, 96, 130)); + // Dark green font color due to direct format + verifyTableCellStyleColors(tbl.getRows().get(0).getCells().get(2), "Text 3", + new Color(0, 176, 80), new Color(21, 96, 130)); + // Grey font color due to "even row" table style + fallback + verifyTableCellStyleColors(tbl.getRows().get(1).getCells().get(0), "Text 5", + new Color(119, 119, 119), new Color(204, 210, 216)); + // Light blue font color due to "odd row" table style + verifyTableCellStyleColors(tbl.getRows().get(2).getCells().get(0), "Text 9", + new Color(0, 255, 255), new Color(231, 234, 237)); + // Red font color due to direct format + verifyTableCellStyleColors(tbl.getRows().get(2).getCells().get(2), "Text 11", + new Color(255, 0, 0), new Color(231, 234, 237)); + // Blue font color due to "last row" table style + verifyTableCellStyleColors(tbl.getRows().get(3).getCells().get(0), "Text 13", + new Color(0, 0, 255), new Color(21, 96, 130)); + + // Second slide: test column-related table styles + + shapes = ppt.getSlides().get(1).getShapes(); + assertEquals(1, shapes.size()); + assertTrue(shapes.get(0) instanceof XSLFTable); + tbl = (XSLFTable)shapes.get(0); + assertEquals(4, tbl.getNumberOfColumns()); + assertEquals(4, tbl.getNumberOfRows()); + assertNotNull(tbl.getCTTable()); + + // Green font color due to "first column" table style + verifyTableCellStyleColors(tbl.getRows().get(0).getCells().get(0), "Text 1", + new Color(0, 255, 0), new Color(21, 96, 130)); + // Grey font color due to "even column" table style + fallback + verifyTableCellStyleColors(tbl.getRows().get(0).getCells().get(1), "Text 2", + new Color(119, 119, 119), new Color(204, 210, 216)); + // Light blue font color due to "odd column" table style + verifyTableCellStyleColors(tbl.getRows().get(0).getCells().get(2), "Text 3", + new Color(0, 255, 255), new Color(231, 234, 237)); + // Red font color due to "last column" table style + verifyTableCellStyleColors(tbl.getRows().get(0).getCells().get(3), "Text 4", + new Color(255, 0, 0), new Color(21, 96, 130)); + + ppt.close(); + } +} diff --git a/test-data/slideshow/table-with-different-font-colors.pptx b/test-data/slideshow/table-with-different-font-colors.pptx new file mode 100644 index 0000000000000000000000000000000000000000..6272f055eb15a39f27efea8b7e9b468fec4b8538 GIT binary patch literal 36562 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 Kph(~E@BTmSAZY3U literal 0 HcmV?d00001 From 08e9bb00d4b6dad5cea75ba9169dbebfb1bf11db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Dec 2025 21:24:32 +0100 Subject: [PATCH 09/88] Bump org.sonarqube from 7.2.0.6526 to 7.2.1.6560 (#976) Bumps org.sonarqube from 7.2.0.6526 to 7.2.1.6560. --- updated-dependencies: - dependency-name: org.sonarqube dependency-version: 7.2.1.6560 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 6a0eac77da..d913acac7a 100644 --- a/build.gradle +++ b/build.gradle @@ -36,7 +36,7 @@ plugins { id 'distribution' id 'com.github.spotbugs' version '6.4.8' // 6.2.0+ requires JDK 11 id 'de.thetaphi.forbiddenapis' version '3.10' - id 'org.sonarqube' version '7.2.0.6526' + id 'org.sonarqube' version '7.2.1.6560' id 'org.cyclonedx.bom' version '2.4.1' id 'com.adarshr.test-logger' version '4.0.0' } From 3a69605f4cce80865895f73e15f1d0a1ac72a153 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Wed, 17 Dec 2025 21:29:03 +0100 Subject: [PATCH 10/88] [bz-69905] check cell before recursing (#978) --- .../src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java index d23375fda5..a9062ff7bf 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java @@ -410,7 +410,9 @@ public final class XSSFCell extends CellBase { /* In an excel generated array formula, the formula property might be set, but the string is empty in related cells */ if (f == null || f.getStringValue().isEmpty()) { XSSFCell cell = getSheet().getFirstCellInArrayFormula(this); - return cell.getCellFormula(fpb); + if (cell != this) { + return cell.getCellFormula(fpb); + } } } if (f == null) { From 037a001719d3beb8f31cb4022dd34cd28a318c61 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Wed, 17 Dec 2025 21:31:06 +0100 Subject: [PATCH 11/88] Update XSSFCell.java --- .../src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java index a9062ff7bf..0c355a0934 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java @@ -410,7 +410,7 @@ public final class XSSFCell extends CellBase { /* In an excel generated array formula, the formula property might be set, but the string is empty in related cells */ if (f == null || f.getStringValue().isEmpty()) { XSSFCell cell = getSheet().getFirstCellInArrayFormula(this); - if (cell != this) { + if (equals(cell)) { return cell.getCellFormula(fpb); } } From 6762b5a9fb7cf72853807dffb327b3b61296c3a3 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Wed, 17 Dec 2025 21:49:08 +0100 Subject: [PATCH 12/88] Revert "Update XSSFCell.java" This reverts commit 037a001719d3beb8f31cb4022dd34cd28a318c61. --- .../src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java index 0c355a0934..a9062ff7bf 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java @@ -410,7 +410,7 @@ public final class XSSFCell extends CellBase { /* In an excel generated array formula, the formula property might be set, but the string is empty in related cells */ if (f == null || f.getStringValue().isEmpty()) { XSSFCell cell = getSheet().getFirstCellInArrayFormula(this); - if (equals(cell)) { + if (cell != this) { return cell.getCellFormula(fpb); } } From fe3359bd79e6f9bafdfb34367d6fd84e597427ef Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Wed, 17 Dec 2025 22:08:23 +0100 Subject: [PATCH 13/88] refactor recurse check (#979) --- .../src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java index a9062ff7bf..af4c9d57a8 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFCell.java @@ -410,7 +410,7 @@ public final class XSSFCell extends CellBase { /* In an excel generated array formula, the formula property might be set, but the string is empty in related cells */ if (f == null || f.getStringValue().isEmpty()) { XSSFCell cell = getSheet().getFirstCellInArrayFormula(this); - if (cell != this) { + if (!equals(cell)) { return cell.getCellFormula(fpb); } } From 2dd124eb426e37e7f53f37c36275fa99616cbde3 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Tue, 2 Dec 2025 22:10:10 +0100 Subject: [PATCH 14/88] Fix some Gradle deprecation warnings A number of warnings still remain, they seem a bit more complicated to fix. --- build.gradle | 4 ++-- poi-integration/build.gradle | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index d913acac7a..b103292d1a 100644 --- a/build.gradle +++ b/build.gradle @@ -503,8 +503,8 @@ subprojects { publishing { publications { POI(MavenPublication) { - groupId 'org.apache.poi' - artifactId project.archivesBaseName + groupId = 'org.apache.poi' + artifactId = project.archivesBaseName from components.java diff --git a/poi-integration/build.gradle b/poi-integration/build.gradle index 0834fa5b3b..a6e02af472 100644 --- a/poi-integration/build.gradle +++ b/poi-integration/build.gradle @@ -156,9 +156,13 @@ test { } } -javadoc { enabled(false) } +javadoc { + enabled = false +} -sourcesJar { enabled(false) } +sourcesJar { + enabled = false +} generateMetadataFileForPOIPublication.enabled = false publishPOIPublicationToMavenLocal.enabled = false From 338882ac8898df5c13a7d15f533204c5dd8607d6 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Wed, 17 Dec 2025 21:40:12 +0100 Subject: [PATCH 15/88] Convert some files to unix newlines Otherwise these can cause issues when checking out sources on Windows --- gradlew.bat | 188 ++-- .../poi/examples/xslf/AddVideoToPptx.java.txt | 502 +++++----- .../poi/examples/xslf/bar-chart-data.txt | 24 +- .../poi/examples/xslf/pie-chart-data.txt | 6 +- .../xwpf/usermodel/bar-chart-data.txt | 24 +- .../poi/poifs/crypt/encryptionCertificate.xsd | 78 +- .../crypt/encryptionCertificate.xsdconfig | 46 +- .../apache/poi/poifs/crypt/encryptionInfo.xsd | 518 +++++----- .../poi/poifs/crypt/encryptionInfo.xsdconfig | 48 +- .../poi/poifs/crypt/encryptionPassword.xsd | 132 +-- .../poifs/crypt/encryptionPassword.xsdconfig | 46 +- .../apache/poi/poifs/crypt/signatureInfo.xsd | 204 ++-- .../org/apache/poi/schemas/XAdES.xsd | 932 +++++++++--------- .../org/apache/poi/schemas/XAdESv141.xsd | 30 +- .../apache/poi/schemas/ooxmlSchemas.xsdconfig | 98 +- .../poi/ooxml/HyperlinkRelationship.java | 88 +- .../poi/ooxml/ReferenceRelationship.java | 158 +-- .../apache/poi/xslf/usermodel/notesMaster.xml | 2 +- .../poi/xssf/usermodel/presetTableStyles.xml | 2 +- .../xssf/streaming/TestOutOfOrderColumns.java | 244 ++--- ...UserNameAwareTempFileCreationStrategy.java | 100 +- .../sl/draw/geom/presetShapeDefinitions.xml | 2 +- ...NameAwareTempFileCreationStrategyTest.java | 84 +- .../xdocs/devel/references/3rdparty.xml | 172 ++-- .../devtools/forbidden-signatures.txt | 348 +++---- .../spreadsheet/54686_fraction_formats.txt | 748 +++++++------- test-data/spreadsheet/SampleSS.xml | 284 +++--- test-data/spreadsheet/vmlDrawing1.vml | 82 +- 28 files changed, 2595 insertions(+), 2595 deletions(-) diff --git a/gradlew.bat b/gradlew.bat index 5eed7ee845..db3a6ac207 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,94 +1,94 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem -@rem SPDX-License-Identifier: Apache-2.0 -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH= - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH= + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/poi-examples/src/main/java/org/apache/poi/examples/xslf/AddVideoToPptx.java.txt b/poi-examples/src/main/java/org/apache/poi/examples/xslf/AddVideoToPptx.java.txt index 0b6225b6ee..cf1ac77d24 100644 --- a/poi-examples/src/main/java/org/apache/poi/examples/xslf/AddVideoToPptx.java.txt +++ b/poi-examples/src/main/java/org/apache/poi/examples/xslf/AddVideoToPptx.java.txt @@ -1,251 +1,251 @@ -/* - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ==================================================================== - */ - -package org.apache.poi.xslf.usermodel; - -import java.awt.Rectangle; -import java.awt.image.BufferedImage; -import java.io.ByteArrayOutputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.URL; -import java.text.DecimalFormat; - -import javax.imageio.ImageIO; -import javax.xml.namespace.QName; - -import org.apache.poi.openxml4j.opc.PackagePart; -import org.apache.poi.openxml4j.opc.PackagePartName; -import org.apache.poi.openxml4j.opc.PackageRelationship; -import org.apache.poi.openxml4j.opc.PackagingURIHelper; -import org.apache.poi.openxml4j.opc.TargetMode; -import org.apache.poi.sl.usermodel.PictureData.PictureType; -import org.apache.xmlbeans.XmlCursor; -import org.openxmlformats.schemas.drawingml.x2006.main.CTHyperlink; -import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId; -import org.openxmlformats.schemas.presentationml.x2006.main.CTApplicationNonVisualDrawingProps; -import org.openxmlformats.schemas.presentationml.x2006.main.CTExtension; -import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture; -import org.openxmlformats.schemas.presentationml.x2006.main.CTSlide; -import org.openxmlformats.schemas.presentationml.x2006.main.CTTLCommonMediaNodeData; -import org.openxmlformats.schemas.presentationml.x2006.main.CTTLCommonTimeNodeData; -import org.openxmlformats.schemas.presentationml.x2006.main.CTTimeNodeList; -import org.openxmlformats.schemas.presentationml.x2006.main.STTLTimeIndefinite; -import org.openxmlformats.schemas.presentationml.x2006.main.STTLTimeNodeFillType; -import org.openxmlformats.schemas.presentationml.x2006.main.STTLTimeNodeRestartType; -import org.openxmlformats.schemas.presentationml.x2006.main.STTLTimeNodeType; - -import com.xuggle.mediatool.IMediaReader; -import com.xuggle.mediatool.MediaListenerAdapter; -import com.xuggle.mediatool.ToolFactory; -import com.xuggle.mediatool.event.IVideoPictureEvent; -import com.xuggle.xuggler.Global; -import com.xuggle.xuggler.IContainer; -import com.xuggle.xuggler.io.InputOutputStreamHandler; - -/** - * Adding multiple videos to a slide - * - * need the Xuggler 5.4 jars: - * <repositories> - * <repository> - * <id>xuggle repo</id> - * <url>http://xuggle.googlecode.com/svn/trunk/repo/share/java/</url> - * </repository> - * </repositories> - * ... - * <dependency> - * <groupId>xuggle</groupId> - * <artifactId>xuggle-xuggler</artifactId> - * <version>5.4</version> - * </dependency> - * - * @see Apache POI XSLF Adding movie to the slide - * @see Question about embedded video in PPTX files - */ -public class AddVideoToPptx { - static DecimalFormat df_time = new DecimalFormat("0.####"); - - public static void main(String[] args) throws Exception { - URL video = new URL("http://archive.org/download/test-mpeg/test-mpeg.mpg"); - // URL video = new URL("file:test-mpeg.mpg"); - - XMLSlideShow pptx = new XMLSlideShow(); - - // add video file - String videoFileName = video.getPath().substring(video.getPath().lastIndexOf('/')+1); - PackagePartName partName = PackagingURIHelper.createPartName("/ppt/media/"+videoFileName); - PackagePart part = pptx.getPackage().createPart(partName, "video/mpeg"); - OutputStream partOs = part.getOutputStream(); - InputStream fis = video.openStream(); - byte buf[] = new byte[1024]; - for (int readBytes; (readBytes = fis.read(buf)) != -1; partOs.write(buf, 0, readBytes)); - fis.close(); - partOs.close(); - - XSLFSlide slide1 = pptx.createSlide(); - XSLFPictureShape pv1 = addPreview(pptx, slide1, part, 5, 50, 50); - addVideo(pptx, slide1, part, pv1, 5); - addTimingInfo(slide1, pv1); - XSLFPictureShape pv2 = addPreview(pptx, slide1, part, 9, 50, 250); - addVideo(pptx, slide1, part, pv2, 9); - addTimingInfo(slide1, pv2); - - FileOutputStream fos = new FileOutputStream("pptx-with-video.pptx"); - pptx.write(fos); - fos.close(); - - pptx.close(); - } - - static XSLFPictureShape addPreview(XMLSlideShow pptx, XSLFSlide slide1, PackagePart videoPart, double seconds, int x, int y) throws IOException { - // get preview after 5 sec. - IContainer ic = IContainer.make(); - InputOutputStreamHandler iosh = new InputOutputStreamHandler(videoPart.getInputStream()); - if (ic.open(iosh, IContainer.Type.READ, null) < 0) return null; - - IMediaReader mediaReader = ToolFactory.makeReader(ic); - - // stipulate that we want BufferedImages created in BGR 24bit color space - mediaReader.setBufferedImageTypeToGenerate(BufferedImage.TYPE_3BYTE_BGR); - - ImageSnapListener isl = new ImageSnapListener(seconds); - mediaReader.addListener(isl); - - // read out the contents of the media file and - // dispatch events to the attached listener - while (!isl.hasFired && mediaReader.readPacket() == null) ; - - mediaReader.close(); - ic.close(); - - // add snapshot - BufferedImage image1 = isl.image; - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ImageIO.write(image1, "jpeg", bos); - XSLFPictureData snap = pptx.addPicture(bos.toByteArray(), PictureType.JPEG); - XSLFPictureShape pic1 = slide1.createPicture(snap); - pic1.setAnchor(new Rectangle(x, y, image1.getWidth(), image1.getHeight())); - return pic1; - } - - static void addVideo(XMLSlideShow pptx, XSLFSlide slide1, PackagePart videoPart, XSLFPictureShape pic1, double seconds) throws IOException { - - // add video shape - PackagePartName partName = videoPart.getPartName(); - PackageRelationship prsEmbed1 = slide1.getPackagePart().addRelationship(partName, TargetMode.INTERNAL, "http://schemas.microsoft.com/office/2007/relationships/media"); - PackageRelationship prsExec1 = slide1.getPackagePart().addRelationship(partName, TargetMode.INTERNAL, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/video"); - CTPicture xpic1 = (CTPicture)pic1.getXmlObject(); - CTHyperlink link1 = xpic1.getNvPicPr().getCNvPr().addNewHlinkClick(); - link1.setId(""); - link1.setAction("ppaction://media"); - - // add video relation - CTApplicationNonVisualDrawingProps nvPr = xpic1.getNvPicPr().getNvPr(); - nvPr.addNewVideoFile().setLink(prsExec1.getId()); - CTExtension ext = nvPr.addNewExtLst().addNewExt(); - // see http://msdn.microsoft.com/en-us/library/dd950140(v=office.12).aspx - ext.setUri("{DAA4B4D4-6D71-4841-9C94-3DE7FCFB9230}"); - String p14Ns = "http://schemas.microsoft.com/office/powerpoint/2010/main"; - - try (XmlCursor cur = ext.newCursor()) { - cur.toEndToken(); - cur.beginElement(new QName(p14Ns, "media", "p14")); - cur.insertNamespace("p14", p14Ns); - cur.insertAttributeWithValue(new QName(STRelationshipId.type.getName().getNamespaceURI(), "embed"), prsEmbed1.getId()); - cur.beginElement(new QName(p14Ns, "trim", "p14")); - cur.insertAttributeWithValue("st", df_time.format(seconds*1000.0)); - } - } - - static void addTimingInfo(XSLFSlide slide1, XSLFPictureShape pic1) { - // add slide timing information, so video can be controlled - CTSlide xslide = slide1.getXmlObject(); - CTTimeNodeList ctnl; - if (!xslide.isSetTiming()) { - CTTLCommonTimeNodeData ctn = xslide.addNewTiming().addNewTnLst().addNewPar().addNewCTn(); - ctn.setDur(STTLTimeIndefinite.INDEFINITE); - ctn.setRestart(STTLTimeNodeRestartType.NEVER); - ctn.setNodeType(STTLTimeNodeType.TM_ROOT); - ctnl = ctn.addNewChildTnLst(); - } else { - ctnl = xslide.getTiming().getTnLst().getParArray(0).getCTn().getChildTnLst(); - } - - CTTLCommonMediaNodeData cmedia = ctnl.addNewVideo().addNewCMediaNode(); - cmedia.setVol(80000); - CTTLCommonTimeNodeData ctn = cmedia.addNewCTn(); - ctn.setFill(STTLTimeNodeFillType.HOLD); - ctn.setDisplay(false); - ctn.addNewStCondLst().addNewCond().setDelay(STTLTimeIndefinite.INDEFINITE); - cmedia.addNewTgtEl().addNewSpTgt().setSpid(""+pic1.getShapeId()); - } - - - static class ImageSnapListener extends MediaListenerAdapter { - final double SECONDS_BETWEEN_FRAMES; - final long MICRO_SECONDS_BETWEEN_FRAMES; - boolean hasFired = false; - BufferedImage image = null; - - // The video stream index, used to ensure we display frames from one and - // only one video stream from the media container. - int mVideoStreamIndex = -1; - - // Time of last frame write - long mLastPtsWrite = Global.NO_PTS; - - public ImageSnapListener(double seconds) { - SECONDS_BETWEEN_FRAMES = seconds; - MICRO_SECONDS_BETWEEN_FRAMES = - (long)(Global.DEFAULT_PTS_PER_SECOND * SECONDS_BETWEEN_FRAMES); - } - - - @Override - public void onVideoPicture(IVideoPictureEvent event) { - - if (event.getStreamIndex() != mVideoStreamIndex) { - // if the selected video stream id is not yet set, go ahead an - // select this lucky video stream - if (mVideoStreamIndex != -1) return; - mVideoStreamIndex = event.getStreamIndex(); - } - - long evtTS = event.getTimeStamp(); - - // if uninitialized, back date mLastPtsWrite to get the very first frame - if (mLastPtsWrite == Global.NO_PTS) - mLastPtsWrite = Math.max(0, evtTS - MICRO_SECONDS_BETWEEN_FRAMES); - - // if its time to write the next frame - if (evtTS - mLastPtsWrite >= MICRO_SECONDS_BETWEEN_FRAMES) { - if (!hasFired) { - image = event.getImage(); - hasFired = true; - } - // update last write time - mLastPtsWrite += MICRO_SECONDS_BETWEEN_FRAMES; - } - } - } - -} +/* + * ==================================================================== + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.apache.poi.xslf.usermodel; + +import java.awt.Rectangle; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.text.DecimalFormat; + +import javax.imageio.ImageIO; +import javax.xml.namespace.QName; + +import org.apache.poi.openxml4j.opc.PackagePart; +import org.apache.poi.openxml4j.opc.PackagePartName; +import org.apache.poi.openxml4j.opc.PackageRelationship; +import org.apache.poi.openxml4j.opc.PackagingURIHelper; +import org.apache.poi.openxml4j.opc.TargetMode; +import org.apache.poi.sl.usermodel.PictureData.PictureType; +import org.apache.xmlbeans.XmlCursor; +import org.openxmlformats.schemas.drawingml.x2006.main.CTHyperlink; +import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId; +import org.openxmlformats.schemas.presentationml.x2006.main.CTApplicationNonVisualDrawingProps; +import org.openxmlformats.schemas.presentationml.x2006.main.CTExtension; +import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture; +import org.openxmlformats.schemas.presentationml.x2006.main.CTSlide; +import org.openxmlformats.schemas.presentationml.x2006.main.CTTLCommonMediaNodeData; +import org.openxmlformats.schemas.presentationml.x2006.main.CTTLCommonTimeNodeData; +import org.openxmlformats.schemas.presentationml.x2006.main.CTTimeNodeList; +import org.openxmlformats.schemas.presentationml.x2006.main.STTLTimeIndefinite; +import org.openxmlformats.schemas.presentationml.x2006.main.STTLTimeNodeFillType; +import org.openxmlformats.schemas.presentationml.x2006.main.STTLTimeNodeRestartType; +import org.openxmlformats.schemas.presentationml.x2006.main.STTLTimeNodeType; + +import com.xuggle.mediatool.IMediaReader; +import com.xuggle.mediatool.MediaListenerAdapter; +import com.xuggle.mediatool.ToolFactory; +import com.xuggle.mediatool.event.IVideoPictureEvent; +import com.xuggle.xuggler.Global; +import com.xuggle.xuggler.IContainer; +import com.xuggle.xuggler.io.InputOutputStreamHandler; + +/** + * Adding multiple videos to a slide + * + * need the Xuggler 5.4 jars: + * <repositories> + * <repository> + * <id>xuggle repo</id> + * <url>http://xuggle.googlecode.com/svn/trunk/repo/share/java/</url> + * </repository> + * </repositories> + * ... + * <dependency> + * <groupId>xuggle</groupId> + * <artifactId>xuggle-xuggler</artifactId> + * <version>5.4</version> + * </dependency> + * + * @see Apache POI XSLF Adding movie to the slide + * @see Question about embedded video in PPTX files + */ +public class AddVideoToPptx { + static DecimalFormat df_time = new DecimalFormat("0.####"); + + public static void main(String[] args) throws Exception { + URL video = new URL("http://archive.org/download/test-mpeg/test-mpeg.mpg"); + // URL video = new URL("file:test-mpeg.mpg"); + + XMLSlideShow pptx = new XMLSlideShow(); + + // add video file + String videoFileName = video.getPath().substring(video.getPath().lastIndexOf('/')+1); + PackagePartName partName = PackagingURIHelper.createPartName("/ppt/media/"+videoFileName); + PackagePart part = pptx.getPackage().createPart(partName, "video/mpeg"); + OutputStream partOs = part.getOutputStream(); + InputStream fis = video.openStream(); + byte buf[] = new byte[1024]; + for (int readBytes; (readBytes = fis.read(buf)) != -1; partOs.write(buf, 0, readBytes)); + fis.close(); + partOs.close(); + + XSLFSlide slide1 = pptx.createSlide(); + XSLFPictureShape pv1 = addPreview(pptx, slide1, part, 5, 50, 50); + addVideo(pptx, slide1, part, pv1, 5); + addTimingInfo(slide1, pv1); + XSLFPictureShape pv2 = addPreview(pptx, slide1, part, 9, 50, 250); + addVideo(pptx, slide1, part, pv2, 9); + addTimingInfo(slide1, pv2); + + FileOutputStream fos = new FileOutputStream("pptx-with-video.pptx"); + pptx.write(fos); + fos.close(); + + pptx.close(); + } + + static XSLFPictureShape addPreview(XMLSlideShow pptx, XSLFSlide slide1, PackagePart videoPart, double seconds, int x, int y) throws IOException { + // get preview after 5 sec. + IContainer ic = IContainer.make(); + InputOutputStreamHandler iosh = new InputOutputStreamHandler(videoPart.getInputStream()); + if (ic.open(iosh, IContainer.Type.READ, null) < 0) return null; + + IMediaReader mediaReader = ToolFactory.makeReader(ic); + + // stipulate that we want BufferedImages created in BGR 24bit color space + mediaReader.setBufferedImageTypeToGenerate(BufferedImage.TYPE_3BYTE_BGR); + + ImageSnapListener isl = new ImageSnapListener(seconds); + mediaReader.addListener(isl); + + // read out the contents of the media file and + // dispatch events to the attached listener + while (!isl.hasFired && mediaReader.readPacket() == null) ; + + mediaReader.close(); + ic.close(); + + // add snapshot + BufferedImage image1 = isl.image; + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ImageIO.write(image1, "jpeg", bos); + XSLFPictureData snap = pptx.addPicture(bos.toByteArray(), PictureType.JPEG); + XSLFPictureShape pic1 = slide1.createPicture(snap); + pic1.setAnchor(new Rectangle(x, y, image1.getWidth(), image1.getHeight())); + return pic1; + } + + static void addVideo(XMLSlideShow pptx, XSLFSlide slide1, PackagePart videoPart, XSLFPictureShape pic1, double seconds) throws IOException { + + // add video shape + PackagePartName partName = videoPart.getPartName(); + PackageRelationship prsEmbed1 = slide1.getPackagePart().addRelationship(partName, TargetMode.INTERNAL, "http://schemas.microsoft.com/office/2007/relationships/media"); + PackageRelationship prsExec1 = slide1.getPackagePart().addRelationship(partName, TargetMode.INTERNAL, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/video"); + CTPicture xpic1 = (CTPicture)pic1.getXmlObject(); + CTHyperlink link1 = xpic1.getNvPicPr().getCNvPr().addNewHlinkClick(); + link1.setId(""); + link1.setAction("ppaction://media"); + + // add video relation + CTApplicationNonVisualDrawingProps nvPr = xpic1.getNvPicPr().getNvPr(); + nvPr.addNewVideoFile().setLink(prsExec1.getId()); + CTExtension ext = nvPr.addNewExtLst().addNewExt(); + // see http://msdn.microsoft.com/en-us/library/dd950140(v=office.12).aspx + ext.setUri("{DAA4B4D4-6D71-4841-9C94-3DE7FCFB9230}"); + String p14Ns = "http://schemas.microsoft.com/office/powerpoint/2010/main"; + + try (XmlCursor cur = ext.newCursor()) { + cur.toEndToken(); + cur.beginElement(new QName(p14Ns, "media", "p14")); + cur.insertNamespace("p14", p14Ns); + cur.insertAttributeWithValue(new QName(STRelationshipId.type.getName().getNamespaceURI(), "embed"), prsEmbed1.getId()); + cur.beginElement(new QName(p14Ns, "trim", "p14")); + cur.insertAttributeWithValue("st", df_time.format(seconds*1000.0)); + } + } + + static void addTimingInfo(XSLFSlide slide1, XSLFPictureShape pic1) { + // add slide timing information, so video can be controlled + CTSlide xslide = slide1.getXmlObject(); + CTTimeNodeList ctnl; + if (!xslide.isSetTiming()) { + CTTLCommonTimeNodeData ctn = xslide.addNewTiming().addNewTnLst().addNewPar().addNewCTn(); + ctn.setDur(STTLTimeIndefinite.INDEFINITE); + ctn.setRestart(STTLTimeNodeRestartType.NEVER); + ctn.setNodeType(STTLTimeNodeType.TM_ROOT); + ctnl = ctn.addNewChildTnLst(); + } else { + ctnl = xslide.getTiming().getTnLst().getParArray(0).getCTn().getChildTnLst(); + } + + CTTLCommonMediaNodeData cmedia = ctnl.addNewVideo().addNewCMediaNode(); + cmedia.setVol(80000); + CTTLCommonTimeNodeData ctn = cmedia.addNewCTn(); + ctn.setFill(STTLTimeNodeFillType.HOLD); + ctn.setDisplay(false); + ctn.addNewStCondLst().addNewCond().setDelay(STTLTimeIndefinite.INDEFINITE); + cmedia.addNewTgtEl().addNewSpTgt().setSpid(""+pic1.getShapeId()); + } + + + static class ImageSnapListener extends MediaListenerAdapter { + final double SECONDS_BETWEEN_FRAMES; + final long MICRO_SECONDS_BETWEEN_FRAMES; + boolean hasFired = false; + BufferedImage image = null; + + // The video stream index, used to ensure we display frames from one and + // only one video stream from the media container. + int mVideoStreamIndex = -1; + + // Time of last frame write + long mLastPtsWrite = Global.NO_PTS; + + public ImageSnapListener(double seconds) { + SECONDS_BETWEEN_FRAMES = seconds; + MICRO_SECONDS_BETWEEN_FRAMES = + (long)(Global.DEFAULT_PTS_PER_SECOND * SECONDS_BETWEEN_FRAMES); + } + + + @Override + public void onVideoPicture(IVideoPictureEvent event) { + + if (event.getStreamIndex() != mVideoStreamIndex) { + // if the selected video stream id is not yet set, go ahead an + // select this lucky video stream + if (mVideoStreamIndex != -1) return; + mVideoStreamIndex = event.getStreamIndex(); + } + + long evtTS = event.getTimeStamp(); + + // if uninitialized, back date mLastPtsWrite to get the very first frame + if (mLastPtsWrite == Global.NO_PTS) + mLastPtsWrite = Math.max(0, evtTS - MICRO_SECONDS_BETWEEN_FRAMES); + + // if its time to write the next frame + if (evtTS - mLastPtsWrite >= MICRO_SECONDS_BETWEEN_FRAMES) { + if (!hasFired) { + image = event.getImage(); + hasFired = true; + } + // update last write time + mLastPtsWrite += MICRO_SECONDS_BETWEEN_FRAMES; + } + } + } + +} diff --git a/poi-examples/src/main/java/org/apache/poi/examples/xslf/bar-chart-data.txt b/poi-examples/src/main/java/org/apache/poi/examples/xslf/bar-chart-data.txt index 22c7b86ab8..5f7d8e1ca7 100644 --- a/poi-examples/src/main/java/org/apache/poi/examples/xslf/bar-chart-data.txt +++ b/poi-examples/src/main/java/org/apache/poi/examples/xslf/bar-chart-data.txt @@ -1,12 +1,12 @@ -10 languages with most speakers as first language -countries,speakers,language -58,315,العربية -4,243,বাংলা -38,1299,中文 -118,378,English -4,260,हिन्दी -2,128,日本語 -15,223,português -6,119,ਪੰਜਾਬੀ -18,154,Русский язык -31,442,español +10 languages with most speakers as first language +countries,speakers,language +58,315,العربية +4,243,বাংলা +38,1299,中文 +118,378,English +4,260,हिन्दी +2,128,日本語 +15,223,português +6,119,ਪੰਜਾਬੀ +18,154,Русский язык +31,442,español diff --git a/poi-examples/src/main/java/org/apache/poi/examples/xslf/pie-chart-data.txt b/poi-examples/src/main/java/org/apache/poi/examples/xslf/pie-chart-data.txt index 40b6959c2c..3920f037e8 100644 --- a/poi-examples/src/main/java/org/apache/poi/examples/xslf/pie-chart-data.txt +++ b/poi-examples/src/main/java/org/apache/poi/examples/xslf/pie-chart-data.txt @@ -1,4 +1,4 @@ -My Chart -First 1.0 -Second 3.0 +My Chart +First 1.0 +Second 3.0 Third 4.0 \ No newline at end of file diff --git a/poi-examples/src/main/java/org/apache/poi/examples/xwpf/usermodel/bar-chart-data.txt b/poi-examples/src/main/java/org/apache/poi/examples/xwpf/usermodel/bar-chart-data.txt index 22c7b86ab8..5f7d8e1ca7 100644 --- a/poi-examples/src/main/java/org/apache/poi/examples/xwpf/usermodel/bar-chart-data.txt +++ b/poi-examples/src/main/java/org/apache/poi/examples/xwpf/usermodel/bar-chart-data.txt @@ -1,12 +1,12 @@ -10 languages with most speakers as first language -countries,speakers,language -58,315,العربية -4,243,বাংলা -38,1299,中文 -118,378,English -4,260,हिन्दी -2,128,日本語 -15,223,português -6,119,ਪੰਜਾਬੀ -18,154,Русский язык -31,442,español +10 languages with most speakers as first language +countries,speakers,language +58,315,العربية +4,243,বাংলা +38,1299,中文 +118,378,English +4,260,हिन्दी +2,128,日本語 +15,223,português +6,119,ਪੰਜਾਬੀ +18,154,Русский язык +31,442,español diff --git a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionCertificate.xsd b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionCertificate.xsd index 7423c85de0..112239e7b9 100644 --- a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionCertificate.xsd +++ b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionCertificate.xsd @@ -1,39 +1,39 @@ - - - - - - - - - - - - A base64-encoded value that specifies the encrypted form of the intermediate key, which is encrypted with the public key contained within the X509Certificate attribute. - - - A base64-encoded value that specifies a DER-encoded X.509 certificate (1) used to encrypt the intermediate key. The certificate (1) MUST contain only the public portion of the public-private key pair. - - - A base64-encoded value that specifies the HMAC of the binary data obtained by base64-decoding the X509Certificate attribute. The hashing algorithm used to derive the HMAC MUST be the hashing algorithm specified for the Encryption.keyData element. The secret key used to derive the HMAC MUST be the intermediate key. If the intermediate key is reset, any CertificateKeyEncryptor elements are also reset to contain the new intermediate key, except that the certVerifier attribute MUST match the value calculated using the current intermediate key, to verify that the CertificateKeyEncryptor element actually encrypted the current intermediate key. If a CertificateKeyEncryptor element does not have a correct certVerifier attribute, it MUST be discarded. - - - - + + + + + + + + + + + + A base64-encoded value that specifies the encrypted form of the intermediate key, which is encrypted with the public key contained within the X509Certificate attribute. + + + A base64-encoded value that specifies a DER-encoded X.509 certificate (1) used to encrypt the intermediate key. The certificate (1) MUST contain only the public portion of the public-private key pair. + + + A base64-encoded value that specifies the HMAC of the binary data obtained by base64-decoding the X509Certificate attribute. The hashing algorithm used to derive the HMAC MUST be the hashing algorithm specified for the Encryption.keyData element. The secret key used to derive the HMAC MUST be the intermediate key. If the intermediate key is reset, any CertificateKeyEncryptor elements are also reset to contain the new intermediate key, except that the certVerifier attribute MUST match the value calculated using the current intermediate key, to verify that the CertificateKeyEncryptor element actually encrypted the current intermediate key. If a CertificateKeyEncryptor element does not have a correct certVerifier attribute, it MUST be discarded. + + + + diff --git a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionCertificate.xsdconfig b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionCertificate.xsdconfig index 73a27fa50a..b65915633e 100644 --- a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionCertificate.xsdconfig +++ b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionCertificate.xsdconfig @@ -1,24 +1,24 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionInfo.xsd b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionInfo.xsd index 5b08560c3a..d33ca773b5 100644 --- a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionInfo.xsd +++ b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionInfo.xsd @@ -1,259 +1,259 @@ - - - - - - - - An unsigned integer that specifies the number of bytes used by a salt. It MUST be at least 1 and no greater than 65,536. - - - - - - - - - An unsigned integer that specifies the number of bytes used to encrypt one block of data. It MUST be at least 2, no greater than 4096, and a multiple of 2. - - - - - - - - - An unsigned integer that specifies the number of bits used by an encryption algorithm. It MUST be at least 8 and a multiple of 8. - - - - - - - - An unsigned integer that specifies the number of bytes used by a hash value. It MUST be at least 1, no greater than 65,536, and the same number of bytes as the hash algorithm emits. - - - - - - - - - An unsigned integer that specifies the number of times to iterate on a hash of a password. It MUST NOT be greater than 10,000,000. - - - - - - - - - modified for poi - list is restricted to given list in [ms-offcrypto] - A string that specifies the cipher algorithm. Values that are not defined MAY be used, and a compliant implementation is not required to support all defined values. Any algorithm that can be resolved by name by the underlying operating system can be used for hashing or encryption. Only block algorithms are supported for encryption. AES-128 is the default encryption algorithm, and SHA-1 is the default hashing algorithm if no other algorithms have been configured. - - - - - MUST conform to the AES algorithm. - - - - - MUST conform to the algorithm as specified in [RFC2268] (http://tools.ietf.org/html/rfc2268). The use of RC2 is not recommended. If RC2 is used with a key length of less than 128 bits, documents could interoperate incorrectly across different versions of Windows. - - - - - MUST NOT be used. - - - - - MUST conform to the DES algorithm. The use of DES is not recommended. If DES is used, the key length specified in the KeyBits element is required to be set to 64 for 56-bit encryption, and the key decrypted from encryptedKeyValue of KeyEncryptor is required to include the DES parity bits. - - - - - MUST conform to the algorithm as specified in [DRAFT-DESX] (http://tools.ietf.org/html/draft-ietf-ipsec-ciph-desx-00). The use of DESX is not recommended. If DESX is used, documents could interoperate incorrectly across different versions of Windows. - - - - - MUST conform to the algorithm as specified in [RFC1851] (http://tools.ietf.org/html/rfc1851). If 3DES or 3DES_112 is used, the key length specified in the KeyBits element is required to be set to 192 for 168-bit encryption and 128 for 112-bit encryption, and the key decrypted from encryptedKeyValue of KeyEncryptor is required to include the DES parity bits. - - - - - see 3DES - - - - - - - A string that specifies the chaining mode used by CipherAlgorithm. For more details about chaining modes, see [BCMO800-38A] (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf). - - - - - block chaining (CBC) - - - - - Cipher feedback chaining (CFB), with an 8-bit window - - - - - - - modified for poi - list is restricted to given list in [ms-offcrypto] - A string specifying a hashing algorithm. Values that are not defined MAY be used, and a compliant implementation is not required to support all defined values. - - - - - MUST conform to the algorithm as specified in [RFC4634] (http://tools.ietf.org/html/rfc4634). - - - - - see SHA1 - - - - - see SHA1 - - - - - see SHA1 - - - - - MUST conform to MD5. - - - - - MUST conform to the algorithm as specified in [RFC1320] (http://tools.ietf.org/html/rfc1320). - - - - - MUST conform to the algorithm as specified in [RFC1319] (http://tools.ietf.org/html/rfc1319). - - - - - MUST conform to the hash functions specified in [ISO/IEC 10118]. (https://en.wikipedia.org/wiki/RIPEMD) - - - - - see RIPEMD-128 (https://en.wikipedia.org/wiki/RIPEMD) - - - - - see RIPEMD-128 (https://en.wikipedia.org/wiki/ISO/IEC_10118-3) - - - - - - - A complex type that specifies the encryption used within this element. The saltValue attribute is a base64-encoded binary value that is randomly generated. The number of bytes required to decode the saltValue attribute MUST be equal to the value of the saltSize attribute. - - - - - - - - - - - - - A complex type that specifies data used to verify whether the encrypted data passes an integrity check. It MUST be generated using the method specified in section 2.3.4.14 (http://msdn.microsoft.com/en-us/library/dd924068(v=office.12).aspx). - - - - A base64-encoded value that specifies an encrypted key used in calculating the encryptedHmacValue. - - - - - A base64-encoded value that specifies an HMAC derived from encryptedHmacKey and the encrypted data. - - - - - - modified for POI - A complex type that specifies the parameters used to encrypt an intermediate key, which is used to perform the final encryption of the document. To ensure extensibility, arbitrary elements can be defined to encrypt the intermediate key. The intermediate key MUST be the same for all KeyEncryptor elements. - - - - - - - - modified for POI - - - - - - - - - - - - A sequence of KeyEncryptor elements. Exactly one KeyEncryptors element MUST be present, and the KeyEncryptors element MUST contain at least one KeyEncryptor. - - - - - - - - - - - modified for POI - All ECMA-376 documents [ECMA-376] encrypted by Microsoft Office using agile encryption will have a DataIntegrity element present. The schema allows for a DataIntegrity element to not be present because the encryption schema can be used by applications that do not create ECMA-376 documents [ECMA-376]. - - - - - The KeyEncryptor element, which MUST be used when encrypting password-protected agile encryption documents, is either a PasswordKeyEncryptor or a CertificateKeyEncryptor. Exactly one PasswordKeyEncryptor MUST be present. Zero or more CertificateKeyEncryptor elements are contained within the KeyEncryptors element. - - - - - - + + + + + + + + An unsigned integer that specifies the number of bytes used by a salt. It MUST be at least 1 and no greater than 65,536. + + + + + + + + + An unsigned integer that specifies the number of bytes used to encrypt one block of data. It MUST be at least 2, no greater than 4096, and a multiple of 2. + + + + + + + + + An unsigned integer that specifies the number of bits used by an encryption algorithm. It MUST be at least 8 and a multiple of 8. + + + + + + + + An unsigned integer that specifies the number of bytes used by a hash value. It MUST be at least 1, no greater than 65,536, and the same number of bytes as the hash algorithm emits. + + + + + + + + + An unsigned integer that specifies the number of times to iterate on a hash of a password. It MUST NOT be greater than 10,000,000. + + + + + + + + + modified for poi - list is restricted to given list in [ms-offcrypto] + A string that specifies the cipher algorithm. Values that are not defined MAY be used, and a compliant implementation is not required to support all defined values. Any algorithm that can be resolved by name by the underlying operating system can be used for hashing or encryption. Only block algorithms are supported for encryption. AES-128 is the default encryption algorithm, and SHA-1 is the default hashing algorithm if no other algorithms have been configured. + + + + + MUST conform to the AES algorithm. + + + + + MUST conform to the algorithm as specified in [RFC2268] (http://tools.ietf.org/html/rfc2268). The use of RC2 is not recommended. If RC2 is used with a key length of less than 128 bits, documents could interoperate incorrectly across different versions of Windows. + + + + + MUST NOT be used. + + + + + MUST conform to the DES algorithm. The use of DES is not recommended. If DES is used, the key length specified in the KeyBits element is required to be set to 64 for 56-bit encryption, and the key decrypted from encryptedKeyValue of KeyEncryptor is required to include the DES parity bits. + + + + + MUST conform to the algorithm as specified in [DRAFT-DESX] (http://tools.ietf.org/html/draft-ietf-ipsec-ciph-desx-00). The use of DESX is not recommended. If DESX is used, documents could interoperate incorrectly across different versions of Windows. + + + + + MUST conform to the algorithm as specified in [RFC1851] (http://tools.ietf.org/html/rfc1851). If 3DES or 3DES_112 is used, the key length specified in the KeyBits element is required to be set to 192 for 168-bit encryption and 128 for 112-bit encryption, and the key decrypted from encryptedKeyValue of KeyEncryptor is required to include the DES parity bits. + + + + + see 3DES + + + + + + + A string that specifies the chaining mode used by CipherAlgorithm. For more details about chaining modes, see [BCMO800-38A] (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf). + + + + + block chaining (CBC) + + + + + Cipher feedback chaining (CFB), with an 8-bit window + + + + + + + modified for poi - list is restricted to given list in [ms-offcrypto] + A string specifying a hashing algorithm. Values that are not defined MAY be used, and a compliant implementation is not required to support all defined values. + + + + + MUST conform to the algorithm as specified in [RFC4634] (http://tools.ietf.org/html/rfc4634). + + + + + see SHA1 + + + + + see SHA1 + + + + + see SHA1 + + + + + MUST conform to MD5. + + + + + MUST conform to the algorithm as specified in [RFC1320] (http://tools.ietf.org/html/rfc1320). + + + + + MUST conform to the algorithm as specified in [RFC1319] (http://tools.ietf.org/html/rfc1319). + + + + + MUST conform to the hash functions specified in [ISO/IEC 10118]. (https://en.wikipedia.org/wiki/RIPEMD) + + + + + see RIPEMD-128 (https://en.wikipedia.org/wiki/RIPEMD) + + + + + see RIPEMD-128 (https://en.wikipedia.org/wiki/ISO/IEC_10118-3) + + + + + + + A complex type that specifies the encryption used within this element. The saltValue attribute is a base64-encoded binary value that is randomly generated. The number of bytes required to decode the saltValue attribute MUST be equal to the value of the saltSize attribute. + + + + + + + + + + + + + A complex type that specifies data used to verify whether the encrypted data passes an integrity check. It MUST be generated using the method specified in section 2.3.4.14 (http://msdn.microsoft.com/en-us/library/dd924068(v=office.12).aspx). + + + + A base64-encoded value that specifies an encrypted key used in calculating the encryptedHmacValue. + + + + + A base64-encoded value that specifies an HMAC derived from encryptedHmacKey and the encrypted data. + + + + + + modified for POI + A complex type that specifies the parameters used to encrypt an intermediate key, which is used to perform the final encryption of the document. To ensure extensibility, arbitrary elements can be defined to encrypt the intermediate key. The intermediate key MUST be the same for all KeyEncryptor elements. + + + + + + + + modified for POI + + + + + + + + + + + + A sequence of KeyEncryptor elements. Exactly one KeyEncryptors element MUST be present, and the KeyEncryptors element MUST contain at least one KeyEncryptor. + + + + + + + + + + + modified for POI + All ECMA-376 documents [ECMA-376] encrypted by Microsoft Office using agile encryption will have a DataIntegrity element present. The schema allows for a DataIntegrity element to not be present because the encryption schema can be used by applications that do not create ECMA-376 documents [ECMA-376]. + + + + + The KeyEncryptor element, which MUST be used when encrypting password-protected agile encryption documents, is either a PasswordKeyEncryptor or a CertificateKeyEncryptor. Exactly one PasswordKeyEncryptor MUST be present. Zero or more CertificateKeyEncryptor elements are contained within the KeyEncryptors element. + + + + + + diff --git a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionInfo.xsdconfig b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionInfo.xsdconfig index c9474a0f3a..cbc24394b8 100644 --- a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionInfo.xsdconfig +++ b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionInfo.xsdconfig @@ -1,25 +1,25 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionPassword.xsd b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionPassword.xsd index 79ae888a0e..3ecfc92320 100644 --- a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionPassword.xsd +++ b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionPassword.xsd @@ -1,66 +1,66 @@ - - - - - - - - - - - - A SaltSize that specifies the size of the salt for a PasswordKeyEncryptor. - - - A BlockSize that specifies the block size for a PasswordKeyEncryptor. - - - A KeyBits that specifies the number of bits for a PasswordKeyEncryptor. - - - A HashSize that specifies the size of the binary form of the hash for a PasswordKeyEncryptor. - - - A CipherAlgorithm that specifies the cipher algorithm for a PasswordKeyEncryptor. The cipher algorithm specified MUST be the same as the cipher algorithm specified for the Encryption.keyData element. - - - A CipherChaining that specifies the cipher chaining mode for a PasswordKeyEncryptor. - - - A HashAlgorithm that specifies the hashing algorithm for a PasswordKeyEncryptor. The hashing algorithm specified MUST be the same as the hashing algorithm specified for the Encryption.keyData element. - - - A base64-encoded binary byte array that specifies the salt value for a PasswordKeyEncryptor. The number of bytes required by the decoded form of this element MUST be saltSize. - - - A SpinCount that specifies the spin count for a PasswordKeyEncryptor. - - - A base64-encoded value that specifies the encrypted verifier hash input for a PasswordKeyEncryptor used in password verification. - - - A base64-encoded value that specifies the encrypted verifier hash value for a PasswordKeyEncryptor used in password verification. - - - A base64-encoded value that specifies the encrypted form of the intermediate key. - - - - + + + + + + + + + + + + A SaltSize that specifies the size of the salt for a PasswordKeyEncryptor. + + + A BlockSize that specifies the block size for a PasswordKeyEncryptor. + + + A KeyBits that specifies the number of bits for a PasswordKeyEncryptor. + + + A HashSize that specifies the size of the binary form of the hash for a PasswordKeyEncryptor. + + + A CipherAlgorithm that specifies the cipher algorithm for a PasswordKeyEncryptor. The cipher algorithm specified MUST be the same as the cipher algorithm specified for the Encryption.keyData element. + + + A CipherChaining that specifies the cipher chaining mode for a PasswordKeyEncryptor. + + + A HashAlgorithm that specifies the hashing algorithm for a PasswordKeyEncryptor. The hashing algorithm specified MUST be the same as the hashing algorithm specified for the Encryption.keyData element. + + + A base64-encoded binary byte array that specifies the salt value for a PasswordKeyEncryptor. The number of bytes required by the decoded form of this element MUST be saltSize. + + + A SpinCount that specifies the spin count for a PasswordKeyEncryptor. + + + A base64-encoded value that specifies the encrypted verifier hash input for a PasswordKeyEncryptor used in password verification. + + + A base64-encoded value that specifies the encrypted verifier hash value for a PasswordKeyEncryptor used in password verification. + + + A base64-encoded value that specifies the encrypted form of the intermediate key. + + + + diff --git a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionPassword.xsdconfig b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionPassword.xsdconfig index 3a2bb2c8e9..5aeabfbc96 100644 --- a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionPassword.xsdconfig +++ b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/encryptionPassword.xsdconfig @@ -1,24 +1,24 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/signatureInfo.xsd b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/signatureInfo.xsd index f7019f13f5..e9f55885e0 100644 --- a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/signatureInfo.xsd +++ b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/poifs/crypt/signatureInfo.xsd @@ -1,103 +1,103 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/schemas/XAdES.xsd b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/schemas/XAdES.xsd index 4b74692f85..87f7209350 100644 --- a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/schemas/XAdES.xsd +++ b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/schemas/XAdES.xsd @@ -1,466 +1,466 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/schemas/XAdESv141.xsd b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/schemas/XAdESv141.xsd index 8cb527978b..446d2c1c7e 100644 --- a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/schemas/XAdESv141.xsd +++ b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/schemas/XAdESv141.xsd @@ -1,15 +1,15 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/schemas/ooxmlSchemas.xsdconfig b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/schemas/ooxmlSchemas.xsdconfig index a567df5816..a3881c05e6 100644 --- a/poi-ooxml-full/src/main/xmlschema/org/apache/poi/schemas/ooxmlSchemas.xsdconfig +++ b/poi-ooxml-full/src/main/xmlschema/org/apache/poi/schemas/ooxmlSchemas.xsdconfig @@ -1,50 +1,50 @@ - - - - - - com.microsoft.schemas.office.office - - - - com.microsoft.schemas.office.excel - - - - com.microsoft.schemas.office.word - - - - com.microsoft.schemas.office.powerpoint - - - - com.microsoft.schemas.vml - - - - com.microsoft.schemas.compatibility - - - - org.apache.poi.schemas.vmldrawing - - + + + + + + com.microsoft.schemas.office.office + + + + com.microsoft.schemas.office.excel + + + + com.microsoft.schemas.office.word + + + + com.microsoft.schemas.office.powerpoint + + + + com.microsoft.schemas.vml + + + + com.microsoft.schemas.compatibility + + + + org.apache.poi.schemas.vmldrawing + + \ No newline at end of file diff --git a/poi-ooxml/src/main/java/org/apache/poi/ooxml/HyperlinkRelationship.java b/poi-ooxml/src/main/java/org/apache/poi/ooxml/HyperlinkRelationship.java index d34756f245..3c66fc9cfb 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/ooxml/HyperlinkRelationship.java +++ b/poi-ooxml/src/main/java/org/apache/poi/ooxml/HyperlinkRelationship.java @@ -1,44 +1,44 @@ -/* ==================================================================== - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -==================================================================== */ -package org.apache.poi.ooxml; - -import org.apache.poi.openxml4j.opc.PackageRelationshipTypes; - -import java.net.URI; - -/** - * Represents a hyperlink relationship. - * - * @since 5.3.0 - */ -public class HyperlinkRelationship extends ReferenceRelationship { - /** - * Initializes a new instance of the HyperlinkRelationship. - * - * @param hyperlinkUri The target uri of the hyperlink relationship. - * @param isExternal Is the URI external. - * @param id The relationship ID. - */ - protected HyperlinkRelationship(POIXMLDocumentPart container, URI hyperlinkUri, boolean isExternal, String id) { - super(container, hyperlinkUri, isExternal, PackageRelationshipTypes.HYPERLINK_PART, id); - } - - @Override - public String getRelationshipType() { - return PackageRelationshipTypes.HYPERLINK_PART; - } -} +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.ooxml; + +import org.apache.poi.openxml4j.opc.PackageRelationshipTypes; + +import java.net.URI; + +/** + * Represents a hyperlink relationship. + * + * @since 5.3.0 + */ +public class HyperlinkRelationship extends ReferenceRelationship { + /** + * Initializes a new instance of the HyperlinkRelationship. + * + * @param hyperlinkUri The target uri of the hyperlink relationship. + * @param isExternal Is the URI external. + * @param id The relationship ID. + */ + protected HyperlinkRelationship(POIXMLDocumentPart container, URI hyperlinkUri, boolean isExternal, String id) { + super(container, hyperlinkUri, isExternal, PackageRelationshipTypes.HYPERLINK_PART, id); + } + + @Override + public String getRelationshipType() { + return PackageRelationshipTypes.HYPERLINK_PART; + } +} diff --git a/poi-ooxml/src/main/java/org/apache/poi/ooxml/ReferenceRelationship.java b/poi-ooxml/src/main/java/org/apache/poi/ooxml/ReferenceRelationship.java index c802157f44..336a6e7346 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/ooxml/ReferenceRelationship.java +++ b/poi-ooxml/src/main/java/org/apache/poi/ooxml/ReferenceRelationship.java @@ -1,79 +1,79 @@ -/* ==================================================================== - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -==================================================================== */ -package org.apache.poi.ooxml; - -import org.apache.poi.openxml4j.opc.PackageRelationship; -import org.apache.poi.openxml4j.opc.TargetMode; - -import java.net.URI; - -/** - * Defines a reference relationship. A reference relationship can be internal or external. - * - * @since 5.3.0 - */ -public abstract class ReferenceRelationship { - private POIXMLDocumentPart container; - private final String relationshipType; - private final boolean external; - private final String id; - private final URI uri; - - protected ReferenceRelationship(POIXMLDocumentPart container, PackageRelationship packageRelationship) { - if (packageRelationship == null) { - throw new IllegalArgumentException("packageRelationship"); - } - - this.container = container; - this.relationshipType = packageRelationship.getRelationshipType(); - this.uri = packageRelationship.getTargetURI(); - this.external = packageRelationship.getTargetMode() == TargetMode.EXTERNAL; - this.id = packageRelationship.getId(); - } - - protected ReferenceRelationship(POIXMLDocumentPart container, URI targetUri, boolean isExternal, String relationshipType, String id) { - if (targetUri == null) { - throw new NullPointerException("targetUri cannot be null"); - } - - this.container = container; - this.relationshipType = relationshipType; - this.uri = targetUri; - this.id = id; - this.external = isExternal; - } - - public POIXMLDocumentPart getContainer() { - return container; - } - - public String getRelationshipType() { - return relationshipType; - } - - public boolean isExternal() { - return external; - } - - public String getId() { - return id; - } - - public URI getUri() { - return uri; - } -} +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.ooxml; + +import org.apache.poi.openxml4j.opc.PackageRelationship; +import org.apache.poi.openxml4j.opc.TargetMode; + +import java.net.URI; + +/** + * Defines a reference relationship. A reference relationship can be internal or external. + * + * @since 5.3.0 + */ +public abstract class ReferenceRelationship { + private POIXMLDocumentPart container; + private final String relationshipType; + private final boolean external; + private final String id; + private final URI uri; + + protected ReferenceRelationship(POIXMLDocumentPart container, PackageRelationship packageRelationship) { + if (packageRelationship == null) { + throw new IllegalArgumentException("packageRelationship"); + } + + this.container = container; + this.relationshipType = packageRelationship.getRelationshipType(); + this.uri = packageRelationship.getTargetURI(); + this.external = packageRelationship.getTargetMode() == TargetMode.EXTERNAL; + this.id = packageRelationship.getId(); + } + + protected ReferenceRelationship(POIXMLDocumentPart container, URI targetUri, boolean isExternal, String relationshipType, String id) { + if (targetUri == null) { + throw new NullPointerException("targetUri cannot be null"); + } + + this.container = container; + this.relationshipType = relationshipType; + this.uri = targetUri; + this.id = id; + this.external = isExternal; + } + + public POIXMLDocumentPart getContainer() { + return container; + } + + public String getRelationshipType() { + return relationshipType; + } + + public boolean isExternal() { + return external; + } + + public String getId() { + return id; + } + + public URI getUri() { + return uri; + } +} diff --git a/poi-ooxml/src/main/resources/org/apache/poi/xslf/usermodel/notesMaster.xml b/poi-ooxml/src/main/resources/org/apache/poi/xslf/usermodel/notesMaster.xml index 0a8db65bd8..7f56d49c6b 100644 --- a/poi-ooxml/src/main/resources/org/apache/poi/xslf/usermodel/notesMaster.xml +++ b/poi-ooxml/src/main/resources/org/apache/poi/xslf/usermodel/notesMaster.xml @@ -1,2 +1,2 @@ - + 1.7.2013Click to edit Master text stylesSecond levelThird levelFourth levelFifth level‹#› \ No newline at end of file diff --git a/poi-ooxml/src/main/resources/org/apache/poi/xssf/usermodel/presetTableStyles.xml b/poi-ooxml/src/main/resources/org/apache/poi/xssf/usermodel/presetTableStyles.xml index f83f2e33c1..7f796bac7e 100644 --- a/poi-ooxml/src/main/resources/org/apache/poi/xssf/usermodel/presetTableStyles.xml +++ b/poi-ooxml/src/main/resources/org/apache/poi/xssf/usermodel/presetTableStyles.xml @@ -1,4 +1,4 @@ - + diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestOutOfOrderColumns.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestOutOfOrderColumns.java index b7b6e67030..d53de4fe20 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestOutOfOrderColumns.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestOutOfOrderColumns.java @@ -1,122 +1,122 @@ -/* - * ==================================================================== - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ==================================================================== - */ - -package org.apache.poi.xssf.streaming; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.io.IOException; -import java.io.InputStream; - -import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.xssf.usermodel.XSSFSheet; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.junit.jupiter.api.Test; - -/** - * Test creates cells in reverse column order in XSSF and SXSSF and expects - * saved files to have fixed the order. - * - * This is necessary because if columns in the saved file are out of order - * Excel will show a repair dialog when opening the file and removing data. - */ -public final class TestOutOfOrderColumns { - - @Test - void outOfOrderColumnsXSSF() throws IOException { - try ( - XSSFWorkbook wb = new XSSFWorkbook(); - UnsynchronizedByteArrayOutputStream bos = UnsynchronizedByteArrayOutputStream.builder().get() - ) { - XSSFSheet sheet = wb.createSheet(); - - Row row = sheet.createRow(0); - // create cells in reverse order - row.createCell(1).setCellValue("def"); - row.createCell(0).setCellValue("abc"); - - wb.write(bos); - - validateOrder(bos.toInputStream()); - } - } - - @Test - void outOfOrderColumnsSXSSF() throws IOException { - try ( - SXSSFWorkbook wb = new SXSSFWorkbook(); - UnsynchronizedByteArrayOutputStream bos = UnsynchronizedByteArrayOutputStream.builder().get() - ) { - Sheet sheet = wb.createSheet(); - - Row row = sheet.createRow(0); - // create cells in reverse order - row.createCell(1).setCellValue("xyz"); - row.createCell(0).setCellValue("uvw"); - - wb.write(bos); - - validateOrder(bos.toInputStream()); - } - } - - @Test - /** this is the problematic case, as XSSF column sorting is skipped when saving with SXSSF. */ - void mixOfXSSFAndSXSSF() throws IOException { - try ( - XSSFWorkbook wb = new XSSFWorkbook(); - UnsynchronizedByteArrayOutputStream bos = UnsynchronizedByteArrayOutputStream.builder().get() - ) { - XSSFSheet sheet = wb.createSheet(); - - Row row1 = sheet.createRow(0); - // create cells in reverse order - row1.createCell(1).setCellValue("def"); - row1.createCell(0).setCellValue("abc"); - - try (SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(wb)) { - Sheet sSheet = sxssfWorkbook.getSheetAt(0); - Row row2 = sSheet.createRow(1); - // create cells in reverse order - row2.createCell(1).setCellValue("xyz"); - row2.createCell(0).setCellValue("uvw"); - - sxssfWorkbook.write(bos); - - validateOrder(bos.toInputStream()); - } - } - } - - private void validateOrder(InputStream is) throws IOException { - // test if saved cells are in order - try (XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is)) { - XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0); - - Row resultRow = xssfSheet.getRow(0); - // POI doesn't show stored order because _cells TreeMap sorts it automatically. - // The only way to test is to compare the xml. - String s = resultRow.toString(); - assertTrue(s.matches("(?s).*A1.*B1.*"), "unexpected order: " + s); - } - } - -} +/* + * ==================================================================== + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.apache.poi.xssf.streaming; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.IOException; +import java.io.InputStream; + +import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.junit.jupiter.api.Test; + +/** + * Test creates cells in reverse column order in XSSF and SXSSF and expects + * saved files to have fixed the order. + * + * This is necessary because if columns in the saved file are out of order + * Excel will show a repair dialog when opening the file and removing data. + */ +public final class TestOutOfOrderColumns { + + @Test + void outOfOrderColumnsXSSF() throws IOException { + try ( + XSSFWorkbook wb = new XSSFWorkbook(); + UnsynchronizedByteArrayOutputStream bos = UnsynchronizedByteArrayOutputStream.builder().get() + ) { + XSSFSheet sheet = wb.createSheet(); + + Row row = sheet.createRow(0); + // create cells in reverse order + row.createCell(1).setCellValue("def"); + row.createCell(0).setCellValue("abc"); + + wb.write(bos); + + validateOrder(bos.toInputStream()); + } + } + + @Test + void outOfOrderColumnsSXSSF() throws IOException { + try ( + SXSSFWorkbook wb = new SXSSFWorkbook(); + UnsynchronizedByteArrayOutputStream bos = UnsynchronizedByteArrayOutputStream.builder().get() + ) { + Sheet sheet = wb.createSheet(); + + Row row = sheet.createRow(0); + // create cells in reverse order + row.createCell(1).setCellValue("xyz"); + row.createCell(0).setCellValue("uvw"); + + wb.write(bos); + + validateOrder(bos.toInputStream()); + } + } + + @Test + /** this is the problematic case, as XSSF column sorting is skipped when saving with SXSSF. */ + void mixOfXSSFAndSXSSF() throws IOException { + try ( + XSSFWorkbook wb = new XSSFWorkbook(); + UnsynchronizedByteArrayOutputStream bos = UnsynchronizedByteArrayOutputStream.builder().get() + ) { + XSSFSheet sheet = wb.createSheet(); + + Row row1 = sheet.createRow(0); + // create cells in reverse order + row1.createCell(1).setCellValue("def"); + row1.createCell(0).setCellValue("abc"); + + try (SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(wb)) { + Sheet sSheet = sxssfWorkbook.getSheetAt(0); + Row row2 = sSheet.createRow(1); + // create cells in reverse order + row2.createCell(1).setCellValue("xyz"); + row2.createCell(0).setCellValue("uvw"); + + sxssfWorkbook.write(bos); + + validateOrder(bos.toInputStream()); + } + } + } + + private void validateOrder(InputStream is) throws IOException { + // test if saved cells are in order + try (XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is)) { + XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0); + + Row resultRow = xssfSheet.getRow(0); + // POI doesn't show stored order because _cells TreeMap sorts it automatically. + // The only way to test is to compare the xml. + String s = resultRow.toString(); + assertTrue(s.matches("(?s).*A1.*B1.*"), "unexpected order: " + s); + } + } + +} diff --git a/poi/src/main/java/org/apache/poi/util/UserNameAwareTempFileCreationStrategy.java b/poi/src/main/java/org/apache/poi/util/UserNameAwareTempFileCreationStrategy.java index a9e5d2c0fe..08593cd2ed 100644 --- a/poi/src/main/java/org/apache/poi/util/UserNameAwareTempFileCreationStrategy.java +++ b/poi/src/main/java/org/apache/poi/util/UserNameAwareTempFileCreationStrategy.java @@ -1,50 +1,50 @@ -/* ==================================================================== - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -==================================================================== */ - -package org.apache.poi.util; - -import java.io.IOException; -import java.nio.file.Path; - -/** - * Username-aware subclass of {@link DefaultTempFileCreationStrategy} - * that avoids permission issues when deploying applications with multiple users on the same server. - * Other than adding the username to the temporary directory, all other behavior is the same as the superclass. - * - * @since 5.4.0 - */ -public class UserNameAwareTempFileCreationStrategy extends DefaultTempFileCreationStrategy { - - /** - * JVM property for the current username. - */ - private static final String JAVA_PROP_USER_NAME = "user.name"; - - @Override - protected Path getPOIFilesDirectoryPath() throws IOException { - final String tmpDir = getJavaIoTmpDir(); - String poifilesDir = POIFILES; - // Make the default temporary directory contain the username to avoid permission issues - // when deploying applications on the same server with multiple users - String username = System.getProperty(JAVA_PROP_USER_NAME); - if (null != username && !username.isEmpty()) { - poifilesDir += "_" + username; - } - return Path.of(tmpDir, poifilesDir); - } - -} +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.util; + +import java.io.IOException; +import java.nio.file.Path; + +/** + * Username-aware subclass of {@link DefaultTempFileCreationStrategy} + * that avoids permission issues when deploying applications with multiple users on the same server. + * Other than adding the username to the temporary directory, all other behavior is the same as the superclass. + * + * @since 5.4.0 + */ +public class UserNameAwareTempFileCreationStrategy extends DefaultTempFileCreationStrategy { + + /** + * JVM property for the current username. + */ + private static final String JAVA_PROP_USER_NAME = "user.name"; + + @Override + protected Path getPOIFilesDirectoryPath() throws IOException { + final String tmpDir = getJavaIoTmpDir(); + String poifilesDir = POIFILES; + // Make the default temporary directory contain the username to avoid permission issues + // when deploying applications on the same server with multiple users + String username = System.getProperty(JAVA_PROP_USER_NAME); + if (null != username && !username.isEmpty()) { + poifilesDir += "_" + username; + } + return Path.of(tmpDir, poifilesDir); + } + +} diff --git a/poi/src/main/resources/org/apache/poi/sl/draw/geom/presetShapeDefinitions.xml b/poi/src/main/resources/org/apache/poi/sl/draw/geom/presetShapeDefinitions.xml index f3c3f2ca33..b425872e06 100644 --- a/poi/src/main/resources/org/apache/poi/sl/draw/geom/presetShapeDefinitions.xml +++ b/poi/src/main/resources/org/apache/poi/sl/draw/geom/presetShapeDefinitions.xml @@ -1,4 +1,4 @@ - + diff --git a/poi/src/test/java/org/apache/poi/util/UserNameAwareTempFileCreationStrategyTest.java b/poi/src/test/java/org/apache/poi/util/UserNameAwareTempFileCreationStrategyTest.java index fd4b9267a6..0423d36299 100644 --- a/poi/src/test/java/org/apache/poi/util/UserNameAwareTempFileCreationStrategyTest.java +++ b/poi/src/test/java/org/apache/poi/util/UserNameAwareTempFileCreationStrategyTest.java @@ -1,42 +1,42 @@ -/* ==================================================================== - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -==================================================================== */ - -package org.apache.poi.util; - -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.nio.file.Path; - -import static org.apache.poi.util.DefaultTempFileCreationStrategy.POIFILES; -import static org.junit.jupiter.api.Assertions.assertEquals; - -class UserNameAwareTempFileCreationStrategyTest { - - @Test - void getPOIFilesDirectoryPath() throws IOException { - UserNameAwareTempFileCreationStrategy strategy = new UserNameAwareTempFileCreationStrategy(); - String tmpDir = System.getProperty(TempFile.JAVA_IO_TMPDIR); - String username = System.getProperty("user.name"); - String expectedPath = Path.of(tmpDir, POIFILES + "_" + username).toString(); - - Path actualPath = strategy.getPOIFilesDirectoryPath(); - - assertEquals(expectedPath, actualPath.toString()); - } - -} +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.util; + +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.nio.file.Path; + +import static org.apache.poi.util.DefaultTempFileCreationStrategy.POIFILES; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class UserNameAwareTempFileCreationStrategyTest { + + @Test + void getPOIFilesDirectoryPath() throws IOException { + UserNameAwareTempFileCreationStrategy strategy = new UserNameAwareTempFileCreationStrategy(); + String tmpDir = System.getProperty(TempFile.JAVA_IO_TMPDIR); + String username = System.getProperty("user.name"); + String expectedPath = Path.of(tmpDir, POIFILES + "_" + username).toString(); + + Path actualPath = strategy.getPOIFilesDirectoryPath(); + + assertEquals(expectedPath, actualPath.toString()); + } + +} diff --git a/src/documentation/content/xdocs/devel/references/3rdparty.xml b/src/documentation/content/xdocs/devel/references/3rdparty.xml index 7a85232327..18286f9ab4 100644 --- a/src/documentation/content/xdocs/devel/references/3rdparty.xml +++ b/src/documentation/content/xdocs/devel/references/3rdparty.xml @@ -1,86 +1,86 @@ - - - - - -
- Third Party Contributions - - - -
- - - -
How to Contribute -

- See How to contribute to Poi. -

- -
- -
Contributed Components -

- These are not necessarily deemed to be high enough quality to be included in the - core distribution, but they have been tested under - several key environments, they are provided under the same license - as Poi, and they are included in the POI distribution under the - contrib/ directory. -

- -

- None as yet! - although you can expect that some of the links - listed below will eventually migrate to the "contributed components" level, and - then maybe even into the main distribution. -

-
- -
Patch Queue -

Submissions of modifications - to POI which are awaiting review. Anyone can - comment on them on the dev mailing list - code reviewers are needed! - Use these at your own risk - although POI has no guarantee - either, these patches have not been reviewed, let alone accepted. -

-
- -
Other Extensions -

The other extensions listed here are not endorsed by the POI - project either - they are provided as a convenience only. They may or may not work, - they may or may not be open source, etc. -

- -

To have a link added to this table, see How to contribute - to POI.

- - - - - - - - - - -
Name and LinkTypeDescriptionStatusLicensingContact
- -
- -
+ + + + + +
+ Third Party Contributions + + + +
+ + + +
How to Contribute +

+ See How to contribute to Poi. +

+ +
+ +
Contributed Components +

+ These are not necessarily deemed to be high enough quality to be included in the + core distribution, but they have been tested under + several key environments, they are provided under the same license + as Poi, and they are included in the POI distribution under the + contrib/ directory. +

+ +

+ None as yet! - although you can expect that some of the links + listed below will eventually migrate to the "contributed components" level, and + then maybe even into the main distribution. +

+
+ +
Patch Queue +

Submissions of modifications + to POI which are awaiting review. Anyone can + comment on them on the dev mailing list - code reviewers are needed! + Use these at your own risk - although POI has no guarantee + either, these patches have not been reviewed, let alone accepted. +

+
+ +
Other Extensions +

The other extensions listed here are not endorsed by the POI + project either - they are provided as a convenience only. They may or may not work, + they may or may not be open source, etc. +

+ +

To have a link added to this table, see How to contribute + to POI.

+ + + + + + + + + + +
Name and LinkTypeDescriptionStatusLicensingContact
+ +
+ +
diff --git a/src/resources/devtools/forbidden-signatures.txt b/src/resources/devtools/forbidden-signatures.txt index ce9c56749f..8b9fca5f90 100644 --- a/src/resources/devtools/forbidden-signatures.txt +++ b/src/resources/devtools/forbidden-signatures.txt @@ -1,174 +1,174 @@ -# (C) Copyright Uwe Schindler (Generics Policeman) and others. -# Parts of this work are licensed to the Apache Software Foundation (ASF) -# under one or more contributor license agreements. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# This file contains API signatures which are specific to POI. -# The goal is to minimize implicit defaults - -@ignoreMissingClasses -@defaultMessage POI forbidden APIs - -# Locale related interfaces which we want to avoid to not have code which depends on the locale of the current machine -java.util.Locale#getDefault() @ Do not use methods that depend on the current Locale, either use Locale.ROOT or let the user define the locale, see class LocaleUtil for details -java.util.Locale#setDefault(java.util.Locale) @ Do not use methods that depend on the current Locale, either use Locale.ROOT or let the user define the locale, see class LocaleUtil for details -java.util.TimeZone#getDefault() @ Do not use methods that depend on the current Locale, either use Locale.ROOT or let the user define the locale, see class LocaleUtil for details -java.util.Date#toString() @ Do not use methods that depend on the current Locale, either use Locale.ROOT or let the user define the locale, see class LocaleUtil for details - -java.text.DecimalFormatSymbols#() @ use DecimalFormatSymbols.getInstance() -java.text.DecimalFormatSymbols#(java.util.Locale) @ use DecimalFormatSymbols.getInstance() - -# the following are taken from the Elasticsearch source at https://github.com/elastic/elasticsearch/tree/master/buildSrc/src/main/resources/forbidden - -@defaultMessage Convert to URI -java.net.URL#getPath() -java.net.URL#getFile() - -@defaultMessage Usage of getLocalHost is discouraged -java.net.InetAddress#getLocalHost() - -@defaultMessage Specify a location for the temp file/directory instead. -java.nio.file.Files#createTempDirectory(java.lang.String,java.nio.file.attribute.FileAttribute[]) -java.nio.file.Files#createTempFile(java.lang.String,java.lang.String,java.nio.file.attribute.FileAttribute[]) - -@defaultMessage Specify a location for the temp file/directory instead. -java.nio.file.Files#createTempDirectory(java.lang.String,java.nio.file.attribute.FileAttribute[]) -java.nio.file.Files#createTempFile(java.lang.String,java.lang.String,java.nio.file.attribute.FileAttribute[]) - -@defaultMessage Don't use java serialization - this can break BWC without noticing it -java.io.ObjectOutputStream -java.io.ObjectOutput -java.io.ObjectInputStream -java.io.ObjectInput - -@defaultMessage Resolve hosts explicitly to the address(es) you want with InetAddress. -java.net.InetSocketAddress#(java.lang.String,int) -java.net.Socket#(java.lang.String,int) -java.net.Socket#(java.lang.String,int,java.net.InetAddress,int) - -@defaultMessage Don't bind to wildcard addresses. Be specific. -java.net.DatagramSocket#() -java.net.DatagramSocket#(int) -java.net.InetSocketAddress#(int) -java.net.MulticastSocket#() -java.net.MulticastSocket#(int) -java.net.ServerSocket#(int) -java.net.ServerSocket#(int,int) - -@defaultMessage use NetworkAddress format/formatAddress to print IP or IP+ports -java.net.InetAddress#toString() -java.net.InetAddress#getHostAddress() -java.net.Inet4Address#getHostAddress() -java.net.Inet6Address#getHostAddress() -java.net.InetSocketAddress#toString() - -@defaultMessage avoid DNS lookups by accident: if you have a valid reason, then @SuppressWarnings with that reason so its completely clear -java.net.InetAddress#getHostName() -java.net.InetAddress#getCanonicalHostName() - -java.net.InetSocketAddress#getHostName() @ Use getHostString() instead, which avoids a DNS lookup - - -java.lang.Thread#getAllStackTraces() @ this method needs special permission -java.lang.Thread#getContextClassLoader() @ use getClass().getClassLoader() instead of getContextClassLoader() (see https://stackoverflow.com/a/36228195/2066598) - -@defaultMessage Avoid unchecked warnings by using Collections#empty(List|Map|Set) methods -java.util.Collections#EMPTY_LIST -java.util.Collections#EMPTY_MAP -java.util.Collections#EMPTY_SET - - -@defaultMessage spawns threads with vague names; use a custom thread factory and name threads so that you can tell (by its name) which executor it is associated with -java.util.concurrent.Executors#newFixedThreadPool(int) -java.util.concurrent.Executors#newSingleThreadExecutor() -java.util.concurrent.Executors#newCachedThreadPool() -java.util.concurrent.Executors#newSingleThreadScheduledExecutor() -java.util.concurrent.Executors#newScheduledThreadPool(int) -java.util.concurrent.Executors#defaultThreadFactory() -java.util.concurrent.Executors#privilegedThreadFactory() - -java.lang.Character#codePointBefore(char[],int) @ Implicit start offset is error-prone when the char[] is a buffer and the first chars are random chars -java.lang.Character#codePointAt(char[],int) @ Implicit end offset is error-prone when the char[] is a buffer and the last chars are random chars - -@defaultMessage specify a locale when using toUpperCase / to LowerCase - -java.lang.Character#isLowerCase(char) -java.lang.Character#isUpperCase(char) -java.lang.Character#toLowerCase(char) -java.lang.Character#toUpperCase(char) -java.lang.String#toLowerCase() -java.lang.String#toUpperCase() - -@defaultMessage Only use wait / notify when really needed try to use concurrency primitives, latches or callbacks instead. -java.lang.Object#wait() -java.lang.Object#wait(long) -java.lang.Object#wait(long,int) -java.lang.Object#notify() -java.lang.Object#notifyAll() - -@defaultMessage Don't interrupt threads use FutureUtils#cancel(Future) instead -java.util.concurrent.Future#cancel(boolean) - -@defaultMessage Don't use ...InputStream.available() as it gives wrong result for certain streams - use IOUtils.toByteArray to read the stream fully and then count the available bytes -java.io.InputStream#available() - -@defaultMessage Use newInstance, as newFactory does not seem to work on Android - https://github.com/centic9/poi-on-android/issues/44#issuecomment-426517981 -javax.xml.stream.XMLEventFactory#newFactory() -javax.xml.stream.XMLInputFactory#newFactory() -javax.xml.stream.XMLOutputFactory#newFactory() - -@defaultMessage Unnecessary, inefficient, and confusing conversion of String.toString -java.lang.String#toString() - -#@defaultMessage Deprecated Java APIs -#java.lang.StringBuffer -#java.util.Hashtable - -@defaultMessage DatatypeConverter is not available in Java 9+ without adding add-opens - use java.util.Base64 -javax.xml.bind.DatatypeConverter - -@defaultMessage don't rely on the threads ContextClassLoader - provide the classloader via load(Class, Classloader) -java.util.ServiceLoader#load(java.lang.Class) - -@defaultMessage Use Log4J classes instead -java.util.logging.** - -# taken from https://github.com/apache/solr/blob/main/gradle/validation/forbidden-apis/com.google.guava.guava.all.txt -@defaultMessage Use corresponding Java 8 functional/streaming interfaces -com.google.common.base.Function -com.google.common.base.Joiner -com.google.common.base.Predicate -com.google.common.base.Supplier - -@defaultMessage Use java.nio.charset.StandardCharsets instead -com.google.common.base.Charsets - -@defaultMessage Use methods in java.util.Objects instead -com.google.common.base.Objects#equal(java.lang.Object,java.lang.Object) -com.google.common.base.Objects#hashCode(java.lang.Object[]) -com.google.common.base.Preconditions#checkNotNull(java.lang.Object) -com.google.common.base.Preconditions#checkNotNull(java.lang.Object,java.lang.Object) - -@defaultMessage Use methods in java.util.Comparator instead -com.google.common.collect.Ordering - - -# taken from https://github.com/apache/solr/blob/main/gradle/validation/forbidden-apis/commons-codec.commons-codec.all.txt -@defaultMessage Use java.nio.charset.StandardCharsets instead -org.apache.commons.codec.Charsets - -@defaultMessage Use java.util.Base64 instead -org.apache.commons.codec.binary.Base64 - - +# (C) Copyright Uwe Schindler (Generics Policeman) and others. +# Parts of this work are licensed to the Apache Software Foundation (ASF) +# under one or more contributor license agreements. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# This file contains API signatures which are specific to POI. +# The goal is to minimize implicit defaults + +@ignoreMissingClasses +@defaultMessage POI forbidden APIs + +# Locale related interfaces which we want to avoid to not have code which depends on the locale of the current machine +java.util.Locale#getDefault() @ Do not use methods that depend on the current Locale, either use Locale.ROOT or let the user define the locale, see class LocaleUtil for details +java.util.Locale#setDefault(java.util.Locale) @ Do not use methods that depend on the current Locale, either use Locale.ROOT or let the user define the locale, see class LocaleUtil for details +java.util.TimeZone#getDefault() @ Do not use methods that depend on the current Locale, either use Locale.ROOT or let the user define the locale, see class LocaleUtil for details +java.util.Date#toString() @ Do not use methods that depend on the current Locale, either use Locale.ROOT or let the user define the locale, see class LocaleUtil for details + +java.text.DecimalFormatSymbols#() @ use DecimalFormatSymbols.getInstance() +java.text.DecimalFormatSymbols#(java.util.Locale) @ use DecimalFormatSymbols.getInstance() + +# the following are taken from the Elasticsearch source at https://github.com/elastic/elasticsearch/tree/master/buildSrc/src/main/resources/forbidden + +@defaultMessage Convert to URI +java.net.URL#getPath() +java.net.URL#getFile() + +@defaultMessage Usage of getLocalHost is discouraged +java.net.InetAddress#getLocalHost() + +@defaultMessage Specify a location for the temp file/directory instead. +java.nio.file.Files#createTempDirectory(java.lang.String,java.nio.file.attribute.FileAttribute[]) +java.nio.file.Files#createTempFile(java.lang.String,java.lang.String,java.nio.file.attribute.FileAttribute[]) + +@defaultMessage Specify a location for the temp file/directory instead. +java.nio.file.Files#createTempDirectory(java.lang.String,java.nio.file.attribute.FileAttribute[]) +java.nio.file.Files#createTempFile(java.lang.String,java.lang.String,java.nio.file.attribute.FileAttribute[]) + +@defaultMessage Don't use java serialization - this can break BWC without noticing it +java.io.ObjectOutputStream +java.io.ObjectOutput +java.io.ObjectInputStream +java.io.ObjectInput + +@defaultMessage Resolve hosts explicitly to the address(es) you want with InetAddress. +java.net.InetSocketAddress#(java.lang.String,int) +java.net.Socket#(java.lang.String,int) +java.net.Socket#(java.lang.String,int,java.net.InetAddress,int) + +@defaultMessage Don't bind to wildcard addresses. Be specific. +java.net.DatagramSocket#() +java.net.DatagramSocket#(int) +java.net.InetSocketAddress#(int) +java.net.MulticastSocket#() +java.net.MulticastSocket#(int) +java.net.ServerSocket#(int) +java.net.ServerSocket#(int,int) + +@defaultMessage use NetworkAddress format/formatAddress to print IP or IP+ports +java.net.InetAddress#toString() +java.net.InetAddress#getHostAddress() +java.net.Inet4Address#getHostAddress() +java.net.Inet6Address#getHostAddress() +java.net.InetSocketAddress#toString() + +@defaultMessage avoid DNS lookups by accident: if you have a valid reason, then @SuppressWarnings with that reason so its completely clear +java.net.InetAddress#getHostName() +java.net.InetAddress#getCanonicalHostName() + +java.net.InetSocketAddress#getHostName() @ Use getHostString() instead, which avoids a DNS lookup + + +java.lang.Thread#getAllStackTraces() @ this method needs special permission +java.lang.Thread#getContextClassLoader() @ use getClass().getClassLoader() instead of getContextClassLoader() (see https://stackoverflow.com/a/36228195/2066598) + +@defaultMessage Avoid unchecked warnings by using Collections#empty(List|Map|Set) methods +java.util.Collections#EMPTY_LIST +java.util.Collections#EMPTY_MAP +java.util.Collections#EMPTY_SET + + +@defaultMessage spawns threads with vague names; use a custom thread factory and name threads so that you can tell (by its name) which executor it is associated with +java.util.concurrent.Executors#newFixedThreadPool(int) +java.util.concurrent.Executors#newSingleThreadExecutor() +java.util.concurrent.Executors#newCachedThreadPool() +java.util.concurrent.Executors#newSingleThreadScheduledExecutor() +java.util.concurrent.Executors#newScheduledThreadPool(int) +java.util.concurrent.Executors#defaultThreadFactory() +java.util.concurrent.Executors#privilegedThreadFactory() + +java.lang.Character#codePointBefore(char[],int) @ Implicit start offset is error-prone when the char[] is a buffer and the first chars are random chars +java.lang.Character#codePointAt(char[],int) @ Implicit end offset is error-prone when the char[] is a buffer and the last chars are random chars + +@defaultMessage specify a locale when using toUpperCase / to LowerCase + +java.lang.Character#isLowerCase(char) +java.lang.Character#isUpperCase(char) +java.lang.Character#toLowerCase(char) +java.lang.Character#toUpperCase(char) +java.lang.String#toLowerCase() +java.lang.String#toUpperCase() + +@defaultMessage Only use wait / notify when really needed try to use concurrency primitives, latches or callbacks instead. +java.lang.Object#wait() +java.lang.Object#wait(long) +java.lang.Object#wait(long,int) +java.lang.Object#notify() +java.lang.Object#notifyAll() + +@defaultMessage Don't interrupt threads use FutureUtils#cancel(Future) instead +java.util.concurrent.Future#cancel(boolean) + +@defaultMessage Don't use ...InputStream.available() as it gives wrong result for certain streams - use IOUtils.toByteArray to read the stream fully and then count the available bytes +java.io.InputStream#available() + +@defaultMessage Use newInstance, as newFactory does not seem to work on Android - https://github.com/centic9/poi-on-android/issues/44#issuecomment-426517981 +javax.xml.stream.XMLEventFactory#newFactory() +javax.xml.stream.XMLInputFactory#newFactory() +javax.xml.stream.XMLOutputFactory#newFactory() + +@defaultMessage Unnecessary, inefficient, and confusing conversion of String.toString +java.lang.String#toString() + +#@defaultMessage Deprecated Java APIs +#java.lang.StringBuffer +#java.util.Hashtable + +@defaultMessage DatatypeConverter is not available in Java 9+ without adding add-opens - use java.util.Base64 +javax.xml.bind.DatatypeConverter + +@defaultMessage don't rely on the threads ContextClassLoader - provide the classloader via load(Class, Classloader) +java.util.ServiceLoader#load(java.lang.Class) + +@defaultMessage Use Log4J classes instead +java.util.logging.** + +# taken from https://github.com/apache/solr/blob/main/gradle/validation/forbidden-apis/com.google.guava.guava.all.txt +@defaultMessage Use corresponding Java 8 functional/streaming interfaces +com.google.common.base.Function +com.google.common.base.Joiner +com.google.common.base.Predicate +com.google.common.base.Supplier + +@defaultMessage Use java.nio.charset.StandardCharsets instead +com.google.common.base.Charsets + +@defaultMessage Use methods in java.util.Objects instead +com.google.common.base.Objects#equal(java.lang.Object,java.lang.Object) +com.google.common.base.Objects#hashCode(java.lang.Object[]) +com.google.common.base.Preconditions#checkNotNull(java.lang.Object) +com.google.common.base.Preconditions#checkNotNull(java.lang.Object,java.lang.Object) + +@defaultMessage Use methods in java.util.Comparator instead +com.google.common.collect.Ordering + + +# taken from https://github.com/apache/solr/blob/main/gradle/validation/forbidden-apis/commons-codec.commons-codec.all.txt +@defaultMessage Use java.nio.charset.StandardCharsets instead +org.apache.commons.codec.Charsets + +@defaultMessage Use java.util.Base64 instead +org.apache.commons.codec.binary.Base64 + + diff --git a/test-data/spreadsheet/54686_fraction_formats.txt b/test-data/spreadsheet/54686_fraction_formats.txt index 0de773efbd..c4b8528129 100644 --- a/test-data/spreadsheet/54686_fraction_formats.txt +++ b/test-data/spreadsheet/54686_fraction_formats.txt @@ -1,374 +1,374 @@ -Numerator Denominator Double 1Digit 2Digit 3Digit Half Quarter Eight Sixteenth Tenth 100th Tika-1132 -4051 8750153 0.000462963 0 0 0 0 0 0 0 0 0 4051/8750153 --105 100 -1.05 -1 -1 1/20 -1 1/20 -1 -1 -1 -1 1/16 -1 1/10 -1 5/100 -1 1/20 --104 100 -1.04 -1 -1 1/25 -1 1/25 -1 -1 -1 -1 1/16 -1 -1 4/100 -1 1/25 --103 100 -1.03 -1 -1 1/33 -1 3/100 -1 -1 -1 -1 -1 -1 3/100 -1 3/100 --102 100 -1.02 -1 -1 1/50 -1 1/50 -1 -1 -1 -1 -1 -1 2/100 -1 1/50 --101 100 -1.01 -1 -1 1/99 -1 1/100 -1 -1 -1 -1 -1 -1 1/100 -1 1/100 --100 100 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 --99 100 -0.99 -1 - 98/99 - 99/100 -1 -1 -1 -1 -1 - 99/100 - 99/100 --98 100 -0.98 -1 - 49/50 - 49/50 -1 -1 -1 -1 -1 - 98/100 - 49/50 --97 100 -0.97 -1 - 32/33 - 97/100 -1 -1 -1 -1 -1 - 97/100 - 97/100 --96 100 -0.96 -1 - 24/25 - 24/25 -1 -1 -1 - 15/16 -1 - 96/100 - 24/25 --95 100 -0.95 -1 - 19/20 - 19/20 -1 -1 -1 - 15/16 -1 - 95/100 - 19/20 --94 100 -0.94 -1 - 47/50 - 47/50 -1 -1 -1 - 15/16 - 9/10 - 94/100 - 47/50 --93 100 -0.93 -1 - 40/43 - 93/100 -1 -1 - 7/8 - 15/16 - 9/10 - 93/100 - 93/100 --92 100 -0.92 -1 - 23/25 - 23/25 -1 -1 - 7/8 - 15/16 - 9/10 - 92/100 - 23/25 --91 100 -0.91 -1 - 81/89 - 91/100 -1 -1 - 7/8 - 15/16 - 9/10 - 91/100 - 91/100 --90 100 -0.9 - 8/9 - 9/10 - 9/10 -1 -1 - 7/8 - 14/16 - 9/10 - 90/100 - 9/10 --89 100 -0.89 - 8/9 - 8/9 - 89/100 -1 -1 - 7/8 - 14/16 - 9/10 - 89/100 - 89/100 --88 100 -0.88 - 7/8 - 22/25 - 22/25 -1 -1 - 7/8 - 14/16 - 9/10 - 88/100 - 22/25 --87 100 -0.87 - 7/8 - 67/77 - 87/100 -1 - 3/4 - 7/8 - 14/16 - 9/10 - 87/100 - 87/100 --86 100 -0.86 - 6/7 - 43/50 - 43/50 -1 - 3/4 - 7/8 - 14/16 - 9/10 - 86/100 - 43/50 --85 100 -0.85 - 6/7 - 17/20 - 17/20 -1 - 3/4 - 7/8 - 14/16 - 9/10 - 85/100 - 17/20 --84 100 -0.84 - 5/6 - 21/25 - 21/25 -1 - 3/4 - 7/8 - 13/16 - 8/10 - 84/100 - 21/25 --83 100 -0.83 - 5/6 - 39/47 - 83/100 -1 - 3/4 - 7/8 - 13/16 - 8/10 - 83/100 - 83/100 --82 100 -0.82 - 5/6 - 41/50 - 41/50 -1 - 3/4 - 7/8 - 13/16 - 8/10 - 82/100 - 41/50 --81 100 -0.81 - 4/5 - 64/79 - 81/100 -1 - 3/4 - 6/8 - 13/16 - 8/10 - 81/100 - 81/100 --80 100 -0.8 - 4/5 - 4/5 - 4/5 -1 - 3/4 - 6/8 - 13/16 - 8/10 - 80/100 - 4/5 --79 100 -0.79 - 4/5 - 64/81 - 79/100 -1 - 3/4 - 6/8 - 13/16 - 8/10 - 79/100 - 79/100 --78 100 -0.78 - 7/9 - 39/50 - 39/50 -1 - 3/4 - 6/8 - 12/16 - 8/10 - 78/100 - 39/50 --77 100 -0.77 - 7/9 - 67/87 - 77/100 -1 - 3/4 - 6/8 - 12/16 - 8/10 - 77/100 - 77/100 --76 100 -0.76 - 3/4 - 19/25 - 19/25 -1 - 3/4 - 6/8 - 12/16 - 8/10 - 76/100 - 19/25 --75 100 -0.75 - 3/4 - 3/4 - 3/4 -1 - 3/4 - 6/8 - 12/16 - 8/10 - 75/100 - 3/4 --74 100 -0.74 - 3/4 - 37/50 - 37/50 - 1/2 - 3/4 - 6/8 - 12/16 - 7/10 - 74/100 - 37/50 --73 100 -0.73 - 3/4 - 46/63 - 73/100 - 1/2 - 3/4 - 6/8 - 12/16 - 7/10 - 73/100 - 73/100 --72 100 -0.72 - 5/7 - 18/25 - 18/25 - 1/2 - 3/4 - 6/8 - 12/16 - 7/10 - 72/100 - 18/25 --71 100 -0.71 - 5/7 - 22/31 - 71/100 - 1/2 - 3/4 - 6/8 - 11/16 - 7/10 - 71/100 - 71/100 --70 100 -0.7 - 2/3 - 7/10 - 7/10 - 1/2 - 3/4 - 6/8 - 11/16 - 7/10 - 70/100 - 7/10 --69 100 -0.69 - 2/3 - 20/29 - 69/100 - 1/2 - 3/4 - 6/8 - 11/16 - 7/10 - 69/100 - 69/100 --68 100 -0.68 - 2/3 - 17/25 - 17/25 - 1/2 - 3/4 - 5/8 - 11/16 - 7/10 - 68/100 - 17/25 --67 100 -0.67 - 2/3 - 65/97 - 67/100 - 1/2 - 3/4 - 5/8 - 11/16 - 7/10 - 67/100 - 67/100 --66 100 -0.66 - 2/3 - 33/50 - 33/50 - 1/2 - 3/4 - 5/8 - 11/16 - 7/10 - 66/100 - 33/50 --65 100 -0.65 - 2/3 - 13/20 - 13/20 - 1/2 - 3/4 - 5/8 - 10/16 - 7/10 - 65/100 - 13/20 --64 100 -0.64 - 2/3 - 16/25 - 16/25 - 1/2 - 3/4 - 5/8 - 10/16 - 6/10 - 64/100 - 16/25 --63 100 -0.63 - 5/8 - 46/73 - 63/100 - 1/2 - 3/4 - 5/8 - 10/16 - 6/10 - 63/100 - 63/100 --62 100 -0.62 - 5/8 - 31/50 - 31/50 - 1/2 - 2/4 - 5/8 - 10/16 - 6/10 - 62/100 - 31/50 --61 100 -0.61 - 3/5 - 36/59 - 61/100 - 1/2 - 2/4 - 5/8 - 10/16 - 6/10 - 61/100 - 61/100 --60 100 -0.6 - 3/5 - 3/5 - 3/5 - 1/2 - 2/4 - 5/8 - 10/16 - 6/10 - 60/100 - 3/5 --59 100 -0.59 - 3/5 - 23/39 - 59/100 - 1/2 - 2/4 - 5/8 - 9/16 - 6/10 - 59/100 - 59/100 --58 100 -0.58 - 4/7 - 29/50 - 29/50 - 1/2 - 2/4 - 5/8 - 9/16 - 6/10 - 58/100 - 29/50 --57 100 -0.57 - 4/7 - 53/93 - 57/100 - 1/2 - 2/4 - 5/8 - 9/16 - 6/10 - 57/100 - 57/100 --56 100 -0.56 - 5/9 - 14/25 - 14/25 - 1/2 - 2/4 - 4/8 - 9/16 - 6/10 - 56/100 - 14/25 --55 100 -0.55 - 5/9 - 11/20 - 11/20 - 1/2 - 2/4 - 4/8 - 9/16 - 6/10 - 55/100 - 11/20 --54 100 -0.54 - 1/2 - 27/50 - 27/50 - 1/2 - 2/4 - 4/8 - 9/16 - 5/10 - 54/100 - 27/50 --53 100 -0.53 - 1/2 - 44/83 - 53/100 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 53/100 - 53/100 --52 100 -0.52 - 1/2 - 13/25 - 13/25 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 52/100 - 13/25 --51 100 -0.51 - 1/2 - 25/49 - 51/100 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 51/100 - 51/100 --50 100 -0.5 - 1/2 - 1/2 - 1/2 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 50/100 - 1/2 --49 100 -0.49 - 1/2 - 24/49 - 49/100 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 49/100 - 49/100 --48 100 -0.48 - 1/2 - 12/25 - 12/25 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 48/100 - 12/25 --47 100 -0.47 - 1/2 - 8/17 - 47/100 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 47/100 - 47/100 --46 100 -0.46 - 1/2 - 23/50 - 23/50 - 1/2 - 2/4 - 4/8 - 7/16 - 5/10 - 46/100 - 23/50 --45 100 -0.45 - 4/9 - 9/20 - 9/20 - 1/2 - 2/4 - 4/8 - 7/16 - 5/10 - 45/100 - 9/20 --44 100 -0.44 - 4/9 - 11/25 - 11/25 - 1/2 - 2/4 - 4/8 - 7/16 - 4/10 - 44/100 - 11/25 --43 100 -0.43 - 3/7 - 3/7 - 43/100 - 1/2 - 2/4 - 3/8 - 7/16 - 4/10 - 43/100 - 43/100 --42 100 -0.42 - 3/7 - 21/50 - 21/50 - 1/2 - 2/4 - 3/8 - 7/16 - 4/10 - 42/100 - 21/50 --41 100 -0.41 - 2/5 - 16/39 - 41/100 - 1/2 - 2/4 - 3/8 - 7/16 - 4/10 - 41/100 - 41/100 --40 100 -0.4 - 2/5 - 2/5 - 2/5 - 1/2 - 2/4 - 3/8 - 6/16 - 4/10 - 40/100 - 2/5 --39 100 -0.39 - 2/5 - 16/41 - 39/100 - 1/2 - 2/4 - 3/8 - 6/16 - 4/10 - 39/100 - 39/100 --38 100 -0.38 - 3/8 - 19/50 - 19/50 - 1/2 - 2/4 - 3/8 - 6/16 - 4/10 - 38/100 - 19/50 --37 100 -0.37 - 3/8 - 10/27 - 37/100 - 1/2 - 1/4 - 3/8 - 6/16 - 4/10 - 37/100 - 37/100 --36 100 -0.36 - 1/3 - 9/25 - 9/25 - 1/2 - 1/4 - 3/8 - 6/16 - 4/10 - 36/100 - 9/25 --35 100 -0.35 - 1/3 - 7/20 - 7/20 - 1/2 - 1/4 - 3/8 - 6/16 - 4/10 - 35/100 - 7/20 --34 100 -0.34 - 1/3 - 17/50 - 17/50 - 1/2 - 1/4 - 3/8 - 5/16 - 3/10 - 34/100 - 17/50 --33 100 -0.33 - 1/3 - 1/3 - 33/100 - 1/2 - 1/4 - 3/8 - 5/16 - 3/10 - 33/100 - 33/100 --32 100 -0.32 - 1/3 - 8/25 - 8/25 - 1/2 - 1/4 - 3/8 - 5/16 - 3/10 - 32/100 - 8/25 --31 100 -0.31 - 1/3 - 22/71 - 31/100 - 1/2 - 1/4 - 2/8 - 5/16 - 3/10 - 31/100 - 31/100 --30 100 -0.3 - 2/7 - 3/10 - 3/10 - 1/2 - 1/4 - 2/8 - 5/16 - 3/10 - 30/100 - 3/10 --29 100 -0.29 - 2/7 - 20/69 - 29/100 - 1/2 - 1/4 - 2/8 - 5/16 - 3/10 - 29/100 - 29/100 --28 100 -0.28 - 2/7 - 7/25 - 7/25 - 1/2 - 1/4 - 2/8 - 4/16 - 3/10 - 28/100 - 7/25 --27 100 -0.27 - 1/4 - 10/37 - 27/100 - 1/2 - 1/4 - 2/8 - 4/16 - 3/10 - 27/100 - 27/100 --26 100 -0.26 - 1/4 - 13/50 - 13/50 - 1/2 - 1/4 - 2/8 - 4/16 - 3/10 - 26/100 - 13/50 --25 100 -0.25 - 1/4 - 1/4 - 1/4 - 1/2 - 1/4 - 2/8 - 4/16 - 3/10 - 25/100 - 1/4 --24 100 -0.24 - 1/4 - 6/25 - 6/25 -0 - 1/4 - 2/8 - 4/16 - 2/10 - 24/100 - 6/25 --23 100 -0.23 - 2/9 - 3/13 - 23/100 -0 - 1/4 - 2/8 - 4/16 - 2/10 - 23/100 - 23/100 --22 100 -0.22 - 2/9 - 11/50 - 11/50 -0 - 1/4 - 2/8 - 4/16 - 2/10 - 22/100 - 11/50 --21 100 -0.21 - 1/5 - 17/81 - 21/100 -0 - 1/4 - 2/8 - 3/16 - 2/10 - 21/100 - 21/100 --20 100 -0.2 - 1/5 - 1/5 - 1/5 -0 - 1/4 - 2/8 - 3/16 - 2/10 - 20/100 - 1/5 --19 100 -0.19 - 1/5 - 15/79 - 19/100 -0 - 1/4 - 2/8 - 3/16 - 2/10 - 19/100 - 19/100 --18 100 -0.18 - 1/6 - 9/50 - 9/50 -0 - 1/4 - 1/8 - 3/16 - 2/10 - 18/100 - 9/50 --17 100 -0.17 - 1/6 - 8/47 - 17/100 -0 - 1/4 - 1/8 - 3/16 - 2/10 - 17/100 - 17/100 --16 100 -0.16 - 1/6 - 4/25 - 4/25 -0 - 1/4 - 1/8 - 3/16 - 2/10 - 16/100 - 4/25 --15 100 -0.15 - 1/7 - 3/20 - 3/20 -0 - 1/4 - 1/8 - 2/16 - 2/10 - 15/100 - 3/20 --14 100 -0.14 - 1/7 - 7/50 - 7/50 -0 - 1/4 - 1/8 - 2/16 - 1/10 - 14/100 - 7/50 --13 100 -0.13 - 1/8 - 3/23 - 13/100 -0 - 1/4 - 1/8 - 2/16 - 1/10 - 13/100 - 13/100 --12 100 -0.12 - 1/8 - 3/25 - 3/25 -0 -0 - 1/8 - 2/16 - 1/10 - 12/100 - 3/25 --11 100 -0.11 - 1/9 - 10/91 - 11/100 -0 -0 - 1/8 - 2/16 - 1/10 - 11/100 - 11/100 --10 100 -0.1 -0 - 1/10 - 1/10 -0 -0 - 1/8 - 2/16 - 1/10 - 10/100 - 1/10 --9 100 -0.09 -0 - 1/11 - 9/100 -0 -0 - 1/8 - 1/16 - 1/10 - 9/100 - 9/100 --8 100 -0.08 -0 - 2/25 - 2/25 -0 -0 - 1/8 - 1/16 - 1/10 - 8/100 - 2/25 --7 100 -0.07 -0 - 4/57 - 7/100 -0 -0 - 1/8 - 1/16 - 1/10 - 7/100 - 7/100 --6 100 -0.06 -0 - 3/50 - 3/50 -0 -0 -0 - 1/16 - 1/10 - 6/100 - 3/50 --5 100 -0.05 -0 - 1/20 - 1/20 -0 -0 -0 - 1/16 - 1/10 - 5/100 - 1/20 --4 100 -0.04 -0 - 1/25 - 1/25 -0 -0 -0 - 1/16 -0 - 4/100 - 1/25 --3 100 -0.03 -0 - 2/67 - 3/100 -0 -0 -0 -0 -0 - 3/100 - 3/100 --2 100 -0.02 -0 - 1/50 - 1/50 -0 -0 -0 -0 -0 - 2/100 - 1/50 --1 100 -0.01 -0 -0 - 1/100 -0 -0 -0 -0 -0 - 1/100 - 1/100 -0 100 0 0 0 0 0 0 0 0 0 0 0 -1 100 0.01 0 0 1/100 0 0 0 0 0 1/100 1/100 -2 100 0.02 0 1/50 1/50 0 0 0 0 0 2/100 1/50 -3 100 0.03 0 2/67 3/100 0 0 0 0 0 3/100 3/100 -4 100 0.04 0 1/25 1/25 0 0 0 1/16 0 4/100 1/25 -5 100 0.05 0 1/20 1/20 0 0 0 1/16 1/10 5/100 1/20 -6 100 0.06 0 3/50 3/50 0 0 0 1/16 1/10 6/100 3/50 -7 100 0.07 0 4/57 7/100 0 0 1/8 1/16 1/10 7/100 7/100 -8 100 0.08 0 2/25 2/25 0 0 1/8 1/16 1/10 8/100 2/25 -9 100 0.09 0 1/11 9/100 0 0 1/8 1/16 1/10 9/100 9/100 -10 100 0.1 0 1/10 1/10 0 0 1/8 2/16 1/10 10/100 1/10 -11 100 0.11 1/9 10/91 11/100 0 0 1/8 2/16 1/10 11/100 11/100 -12 100 0.12 1/8 3/25 3/25 0 0 1/8 2/16 1/10 12/100 3/25 -13 100 0.13 1/8 3/23 13/100 0 1/4 1/8 2/16 1/10 13/100 13/100 -14 100 0.14 1/7 7/50 7/50 0 1/4 1/8 2/16 1/10 14/100 7/50 -15 100 0.15 1/7 3/20 3/20 0 1/4 1/8 2/16 2/10 15/100 3/20 -16 100 0.16 1/6 4/25 4/25 0 1/4 1/8 3/16 2/10 16/100 4/25 -17 100 0.17 1/6 8/47 17/100 0 1/4 1/8 3/16 2/10 17/100 17/100 -18 100 0.18 1/6 9/50 9/50 0 1/4 1/8 3/16 2/10 18/100 9/50 -19 100 0.19 1/5 15/79 19/100 0 1/4 2/8 3/16 2/10 19/100 19/100 -20 100 0.2 1/5 1/5 1/5 0 1/4 2/8 3/16 2/10 20/100 1/5 -21 100 0.21 1/5 17/81 21/100 0 1/4 2/8 3/16 2/10 21/100 21/100 -22 100 0.22 2/9 11/50 11/50 0 1/4 2/8 4/16 2/10 22/100 11/50 -23 100 0.23 2/9 3/13 23/100 0 1/4 2/8 4/16 2/10 23/100 23/100 -24 100 0.24 1/4 6/25 6/25 0 1/4 2/8 4/16 2/10 24/100 6/25 -25 100 0.25 1/4 1/4 1/4 1/2 1/4 2/8 4/16 3/10 25/100 1/4 -26 100 0.26 1/4 13/50 13/50 1/2 1/4 2/8 4/16 3/10 26/100 13/50 -27 100 0.27 1/4 10/37 27/100 1/2 1/4 2/8 4/16 3/10 27/100 27/100 -28 100 0.28 2/7 7/25 7/25 1/2 1/4 2/8 4/16 3/10 28/100 7/25 -29 100 0.29 2/7 20/69 29/100 1/2 1/4 2/8 5/16 3/10 29/100 29/100 -30 100 0.3 2/7 3/10 3/10 1/2 1/4 2/8 5/16 3/10 30/100 3/10 -31 100 0.31 1/3 22/71 31/100 1/2 1/4 2/8 5/16 3/10 31/100 31/100 -32 100 0.32 1/3 8/25 8/25 1/2 1/4 3/8 5/16 3/10 32/100 8/25 -33 100 0.33 1/3 1/3 33/100 1/2 1/4 3/8 5/16 3/10 33/100 33/100 -34 100 0.34 1/3 17/50 17/50 1/2 1/4 3/8 5/16 3/10 34/100 17/50 -35 100 0.35 1/3 7/20 7/20 1/2 1/4 3/8 6/16 4/10 35/100 7/20 -36 100 0.36 1/3 9/25 9/25 1/2 1/4 3/8 6/16 4/10 36/100 9/25 -37 100 0.37 3/8 10/27 37/100 1/2 1/4 3/8 6/16 4/10 37/100 37/100 -38 100 0.38 3/8 19/50 19/50 1/2 2/4 3/8 6/16 4/10 38/100 19/50 -39 100 0.39 2/5 16/41 39/100 1/2 2/4 3/8 6/16 4/10 39/100 39/100 -40 100 0.4 2/5 2/5 2/5 1/2 2/4 3/8 6/16 4/10 40/100 2/5 -41 100 0.41 2/5 16/39 41/100 1/2 2/4 3/8 7/16 4/10 41/100 41/100 -42 100 0.42 3/7 21/50 21/50 1/2 2/4 3/8 7/16 4/10 42/100 21/50 -43 100 0.43 3/7 3/7 43/100 1/2 2/4 3/8 7/16 4/10 43/100 43/100 -44 100 0.44 4/9 11/25 11/25 1/2 2/4 4/8 7/16 4/10 44/100 11/25 -45 100 0.45 4/9 9/20 9/20 1/2 2/4 4/8 7/16 5/10 45/100 9/20 -46 100 0.46 1/2 23/50 23/50 1/2 2/4 4/8 7/16 5/10 46/100 23/50 -47 100 0.47 1/2 8/17 47/100 1/2 2/4 4/8 8/16 5/10 47/100 47/100 -48 100 0.48 1/2 12/25 12/25 1/2 2/4 4/8 8/16 5/10 48/100 12/25 -49 100 0.49 1/2 24/49 49/100 1/2 2/4 4/8 8/16 5/10 49/100 49/100 -50 100 0.5 1/2 1/2 1/2 1/2 2/4 4/8 8/16 5/10 50/100 1/2 -51 100 0.51 1/2 25/49 51/100 1/2 2/4 4/8 8/16 5/10 51/100 51/100 -52 100 0.52 1/2 13/25 13/25 1/2 2/4 4/8 8/16 5/10 52/100 13/25 -53 100 0.53 1/2 44/83 53/100 1/2 2/4 4/8 8/16 5/10 53/100 53/100 -54 100 0.54 1/2 27/50 27/50 1/2 2/4 4/8 9/16 5/10 54/100 27/50 -55 100 0.55 5/9 11/20 11/20 1/2 2/4 4/8 9/16 6/10 55/100 11/20 -56 100 0.56 5/9 14/25 14/25 1/2 2/4 4/8 9/16 6/10 56/100 14/25 -57 100 0.57 4/7 53/93 57/100 1/2 2/4 5/8 9/16 6/10 57/100 57/100 -58 100 0.58 4/7 29/50 29/50 1/2 2/4 5/8 9/16 6/10 58/100 29/50 -59 100 0.59 3/5 23/39 59/100 1/2 2/4 5/8 9/16 6/10 59/100 59/100 -60 100 0.6 3/5 3/5 3/5 1/2 2/4 5/8 10/16 6/10 60/100 3/5 -61 100 0.61 3/5 36/59 61/100 1/2 2/4 5/8 10/16 6/10 61/100 61/100 -62 100 0.62 5/8 31/50 31/50 1/2 2/4 5/8 10/16 6/10 62/100 31/50 -63 100 0.63 5/8 46/73 63/100 1/2 3/4 5/8 10/16 6/10 63/100 63/100 -64 100 0.64 2/3 16/25 16/25 1/2 3/4 5/8 10/16 6/10 64/100 16/25 -65 100 0.65 2/3 13/20 13/20 1/2 3/4 5/8 10/16 7/10 65/100 13/20 -66 100 0.66 2/3 33/50 33/50 1/2 3/4 5/8 11/16 7/10 66/100 33/50 -67 100 0.67 2/3 65/97 67/100 1/2 3/4 5/8 11/16 7/10 67/100 67/100 -68 100 0.68 2/3 17/25 17/25 1/2 3/4 5/8 11/16 7/10 68/100 17/25 -69 100 0.69 2/3 20/29 69/100 1/2 3/4 6/8 11/16 7/10 69/100 69/100 -70 100 0.7 2/3 7/10 7/10 1/2 3/4 6/8 11/16 7/10 70/100 7/10 -71 100 0.71 5/7 22/31 71/100 1/2 3/4 6/8 11/16 7/10 71/100 71/100 -72 100 0.72 5/7 18/25 18/25 1/2 3/4 6/8 12/16 7/10 72/100 18/25 -73 100 0.73 3/4 46/63 73/100 1/2 3/4 6/8 12/16 7/10 73/100 73/100 -74 100 0.74 3/4 37/50 37/50 1/2 3/4 6/8 12/16 7/10 74/100 37/50 -75 100 0.75 3/4 3/4 3/4 1 3/4 6/8 12/16 8/10 75/100 3/4 -76 100 0.76 3/4 19/25 19/25 1 3/4 6/8 12/16 8/10 76/100 19/25 -77 100 0.77 7/9 67/87 77/100 1 3/4 6/8 12/16 8/10 77/100 77/100 -78 100 0.78 7/9 39/50 39/50 1 3/4 6/8 12/16 8/10 78/100 39/50 -79 100 0.79 4/5 64/81 79/100 1 3/4 6/8 13/16 8/10 79/100 79/100 -80 100 0.8 4/5 4/5 4/5 1 3/4 6/8 13/16 8/10 80/100 4/5 -81 100 0.81 4/5 64/79 81/100 1 3/4 6/8 13/16 8/10 81/100 81/100 -82 100 0.82 5/6 41/50 41/50 1 3/4 7/8 13/16 8/10 82/100 41/50 -83 100 0.83 5/6 39/47 83/100 1 3/4 7/8 13/16 8/10 83/100 83/100 -84 100 0.84 5/6 21/25 21/25 1 3/4 7/8 13/16 8/10 84/100 21/25 -85 100 0.85 6/7 17/20 17/20 1 3/4 7/8 14/16 9/10 85/100 17/20 -86 100 0.86 6/7 43/50 43/50 1 3/4 7/8 14/16 9/10 86/100 43/50 -87 100 0.87 7/8 67/77 87/100 1 3/4 7/8 14/16 9/10 87/100 87/100 -88 100 0.88 7/8 22/25 22/25 1 1 7/8 14/16 9/10 88/100 22/25 -89 100 0.89 8/9 8/9 89/100 1 1 7/8 14/16 9/10 89/100 89/100 -90 100 0.9 8/9 9/10 9/10 1 1 7/8 14/16 9/10 90/100 9/10 -91 100 0.91 1 81/89 91/100 1 1 7/8 15/16 9/10 91/100 91/100 -92 100 0.92 1 23/25 23/25 1 1 7/8 15/16 9/10 92/100 23/25 -93 100 0.93 1 40/43 93/100 1 1 7/8 15/16 9/10 93/100 93/100 -94 100 0.94 1 47/50 47/50 1 1 1 15/16 9/10 94/100 47/50 -95 100 0.95 1 19/20 19/20 1 1 1 15/16 1 95/100 19/20 -96 100 0.96 1 24/25 24/25 1 1 1 15/16 1 96/100 24/25 -97 100 0.97 1 32/33 97/100 1 1 1 1 1 97/100 97/100 -98 100 0.98 1 49/50 49/50 1 1 1 1 1 98/100 49/50 -99 100 0.99 1 98/99 99/100 1 1 1 1 1 99/100 99/100 -100 100 1 1 1 1 1 1 1 1 1 1 1 -101 100 1.01 1 1 1/99 1 1/100 1 1 1 1 1 1 1/100 1 1/100 -102 100 1.02 1 1 1/50 1 1/50 1 1 1 1 1 1 2/100 1 1/50 -103 100 1.03 1 1 1/33 1 3/100 1 1 1 1 1 1 3/100 1 3/100 -104 100 1.04 1 1 1/25 1 1/25 1 1 1 1 1/16 1 1 4/100 1 1/25 -105 100 1.05 1 1 1/20 1 1/20 1 1 1 1 1/16 1 1/10 1 5/100 1 1/20 -106 100 1.06 1 1 3/50 1 3/50 1 1 1 1 1/16 1 1/10 1 6/100 1 3/50 -107 100 1.07 1 1 4/57 1 7/100 1 1 1 1/8 1 1/16 1 1/10 1 7/100 1 7/100 -108 100 1.08 1 1 2/25 1 2/25 1 1 1 1/8 1 1/16 1 1/10 1 8/100 1 2/25 -109 100 1.09 1 1 1/11 1 9/100 1 1 1 1/8 1 1/16 1 1/10 1 9/100 1 9/100 -110 100 1.1 1 1/9 1 1/10 1 1/10 1 1 1 1/8 1 2/16 1 1/10 1 10/100 1 1/10 -111 100 1.11 1 1/9 1 1/9 1 11/100 1 1 1 1/8 1 2/16 1 1/10 1 11/100 1 11/100 -112 100 1.12 1 1/8 1 3/25 1 3/25 1 1 1 1/8 1 2/16 1 1/10 1 12/100 1 3/25 -113 100 1.13 1 1/8 1 10/77 1 13/100 1 1 1/4 1 1/8 1 2/16 1 1/10 1 13/100 1 13/100 -114 100 1.14 1 1/7 1 7/50 1 7/50 1 1 1/4 1 1/8 1 2/16 1 1/10 1 14/100 1 7/50 -115 100 1.15 1 1/7 1 3/20 1 3/20 1 1 1/4 1 1/8 1 2/16 1 1/10 1 15/100 1 3/20 -116 100 1.16 1 1/6 1 4/25 1 4/25 1 1 1/4 1 1/8 1 3/16 1 2/10 1 16/100 1 4/25 -117 100 1.17 1 1/6 1 9/53 1 17/100 1 1 1/4 1 1/8 1 3/16 1 2/10 1 17/100 1 17/100 -118 100 1.18 1 1/6 1 9/50 1 9/50 1 1 1/4 1 1/8 1 3/16 1 2/10 1 18/100 1 9/50 -119 100 1.19 1 1/5 1 15/79 1 19/100 1 1 1/4 1 2/8 1 3/16 1 2/10 1 19/100 1 19/100 -120 100 1.2 1 1/5 1 1/5 1 1/5 1 1 1/4 1 2/8 1 3/16 1 2/10 1 20/100 1 1/5 -121 100 1.21 1 1/5 1 17/81 1 21/100 1 1 1/4 1 2/8 1 3/16 1 2/10 1 21/100 1 21/100 -122 100 1.22 1 2/9 1 11/50 1 11/50 1 1 1/4 1 2/8 1 4/16 1 2/10 1 22/100 1 11/50 -123 100 1.23 1 2/9 1 20/87 1 23/100 1 1 1/4 1 2/8 1 4/16 1 2/10 1 23/100 1 23/100 -124 100 1.24 1 1/4 1 6/25 1 6/25 1 1 1/4 1 2/8 1 4/16 1 2/10 1 24/100 1 6/25 -125 100 1.25 1 1/4 1 1/4 1 1/4 1 1/2 1 1/4 1 2/8 1 4/16 1 3/10 1 25/100 1 1/4 -126 100 1.26 1 1/4 1 13/50 1 13/50 1 1/2 1 1/4 1 2/8 1 4/16 1 3/10 1 26/100 1 13/50 -127 100 1.27 1 1/4 1 10/37 1 27/100 1 1/2 1 1/4 1 2/8 1 4/16 1 3/10 1 27/100 1 27/100 --103 201 -0.512437811 - 1/2 - 41/80 - 103/201 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 51/100 - 103/201 --100 201 -0.497512438 - 1/2 - 1/2 - 100/201 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 50/100 - 100/201 --97 201 -0.482587065 - 1/2 - 14/29 - 97/201 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 48/100 - 97/201 --94 201 -0.467661692 - 1/2 - 29/62 - 94/201 - 1/2 - 2/4 - 4/8 - 7/16 - 5/10 - 47/100 - 94/201 --91 201 -0.452736318 - 4/9 - 24/53 - 91/201 - 1/2 - 2/4 - 4/8 - 7/16 - 5/10 - 45/100 - 91/201 --88 201 -0.437810945 - 4/9 - 7/16 - 88/201 - 1/2 - 2/4 - 4/8 - 7/16 - 4/10 - 44/100 - 88/201 --85 201 -0.422885572 - 3/7 - 11/26 - 85/201 - 1/2 - 2/4 - 3/8 - 7/16 - 4/10 - 42/100 - 85/201 --82 201 -0.407960199 - 2/5 - 31/76 - 82/201 - 1/2 - 2/4 - 3/8 - 7/16 - 4/10 - 41/100 - 82/201 --79 201 -0.393034826 - 2/5 - 11/28 - 79/201 - 1/2 - 2/4 - 3/8 - 6/16 - 4/10 - 39/100 - 79/201 --76 201 -0.378109453 - 3/8 - 31/82 - 76/201 - 1/2 - 2/4 - 3/8 - 6/16 - 4/10 - 38/100 - 76/201 --73 201 -0.36318408 - 1/3 - 4/11 - 73/201 - 1/2 - 1/4 - 3/8 - 6/16 - 4/10 - 36/100 - 73/201 --70 201 -0.348258706 - 1/3 - 31/89 - 70/201 - 1/2 - 1/4 - 3/8 - 6/16 - 3/10 - 35/100 - 70/201 --67 201 -0.333333333 - 1/3 - 1/3 - 1/3 - 1/2 - 1/4 - 3/8 - 5/16 - 3/10 - 33/100 - 1/3 --64 201 -0.31840796 - 1/3 - 7/22 - 64/201 - 1/2 - 1/4 - 3/8 - 5/16 - 3/10 - 32/100 - 64/201 --61 201 -0.303482587 - 1/3 - 17/56 - 61/201 - 1/2 - 1/4 - 2/8 - 5/16 - 3/10 - 30/100 - 61/201 --58 201 -0.288557214 - 2/7 - 15/52 - 58/201 - 1/2 - 1/4 - 2/8 - 5/16 - 3/10 - 29/100 - 58/201 --55 201 -0.273631841 - 2/7 - 26/95 - 55/201 - 1/2 - 1/4 - 2/8 - 4/16 - 3/10 - 27/100 - 55/201 --52 201 -0.258706468 - 1/4 - 15/58 - 52/201 - 1/2 - 1/4 - 2/8 - 4/16 - 3/10 - 26/100 - 52/201 --49 201 -0.243781095 - 1/4 - 10/41 - 49/201 -0 - 1/4 - 2/8 - 4/16 - 2/10 - 24/100 - 49/201 --46 201 -0.228855721 - 2/9 - 19/83 - 46/201 -0 - 1/4 - 2/8 - 4/16 - 2/10 - 23/100 - 46/201 --43 201 -0.213930348 - 1/5 - 3/14 - 43/201 -0 - 1/4 - 2/8 - 3/16 - 2/10 - 21/100 - 43/201 --40 201 -0.199004975 - 1/5 - 1/5 - 40/201 -0 - 1/4 - 2/8 - 3/16 - 2/10 - 20/100 - 40/201 --37 201 -0.184079602 - 1/5 - 7/38 - 37/201 -0 - 1/4 - 1/8 - 3/16 - 2/10 - 18/100 - 37/201 --34 201 -0.169154229 - 1/6 - 11/65 - 34/201 -0 - 1/4 - 1/8 - 3/16 - 2/10 - 17/100 - 34/201 --31 201 -0.154228856 - 1/6 - 2/13 - 31/201 -0 - 1/4 - 1/8 - 2/16 - 2/10 - 15/100 - 31/201 --28 201 -0.139303483 - 1/7 - 11/79 - 28/201 -0 - 1/4 - 1/8 - 2/16 - 1/10 - 14/100 - 28/201 --25 201 -0.124378109 - 1/8 - 1/8 - 25/201 -0 -0 - 1/8 - 2/16 - 1/10 - 12/100 - 25/201 --22 201 -0.109452736 - 1/9 - 7/64 - 22/201 -0 -0 - 1/8 - 2/16 - 1/10 - 11/100 - 22/201 --19 201 -0.094527363 -0 - 7/74 - 19/201 -0 -0 - 1/8 - 2/16 - 1/10 - 9/100 - 19/201 --16 201 -0.07960199 -0 - 7/88 - 16/201 -0 -0 - 1/8 - 1/16 - 1/10 - 8/100 - 16/201 --13 201 -0.064676617 -0 - 2/31 - 13/201 -0 -0 - 1/8 - 1/16 - 1/10 - 6/100 - 13/201 --10 201 -0.049751244 -0 - 1/20 - 10/201 -0 -0 -0 - 1/16 -0 - 5/100 - 10/201 --7 201 -0.034825871 -0 - 3/86 - 7/201 -0 -0 -0 - 1/16 -0 - 3/100 - 7/201 --4 201 -0.019900498 -0 - 1/50 - 4/201 -0 -0 -0 -0 -0 - 2/100 - 4/201 --1 201 -0.004975124 -0 -0 - 1/201 -0 -0 -0 -0 -0 -0 - 1/201 -2 201 0.009950249 0 0 2/201 0 0 0 0 0 1/100 2/201 -5 201 0.024875622 0 1/40 5/201 0 0 0 0 0 2/100 5/201 -8 201 0.039800995 0 1/25 8/201 0 0 0 1/16 0 4/100 8/201 -11 201 0.054726368 0 4/73 11/201 0 0 0 1/16 1/10 5/100 11/201 -14 201 0.069651741 0 3/43 14/201 0 0 1/8 1/16 1/10 7/100 14/201 -17 201 0.084577114 0 6/71 17/201 0 0 1/8 1/16 1/10 8/100 17/201 -20 201 0.099502488 0 1/10 20/201 0 0 1/8 2/16 1/10 10/100 20/201 -23 201 0.114427861 1/9 4/35 23/201 0 0 1/8 2/16 1/10 11/100 23/201 -26 201 0.129353234 1/8 11/85 26/201 0 1/4 1/8 2/16 1/10 13/100 26/201 -29 201 0.144278607 1/7 14/97 29/201 0 1/4 1/8 2/16 1/10 14/100 29/201 -32 201 0.15920398 1/6 7/44 32/201 0 1/4 1/8 3/16 2/10 16/100 32/201 -35 201 0.174129353 1/6 4/23 35/201 0 1/4 1/8 3/16 2/10 17/100 35/201 -38 201 0.189054726 1/5 7/37 38/201 0 1/4 2/8 3/16 2/10 19/100 38/201 -41 201 0.2039801 1/5 10/49 41/201 0 1/4 2/8 3/16 2/10 20/100 41/201 -44 201 0.218905473 2/9 7/32 44/201 0 1/4 2/8 4/16 2/10 22/100 44/201 -47 201 0.233830846 1/4 18/77 47/201 0 1/4 2/8 4/16 2/10 23/100 47/201 -50 201 0.248756219 1/4 1/4 50/201 0 1/4 2/8 4/16 2/10 25/100 50/201 -53 201 0.263681592 1/4 24/91 53/201 1/2 1/4 2/8 4/16 3/10 26/100 53/201 -56 201 0.278606965 2/7 17/61 56/201 1/2 1/4 2/8 4/16 3/10 28/100 56/201 -59 201 0.293532338 2/7 27/92 59/201 1/2 1/4 2/8 5/16 3/10 29/100 59/201 -62 201 0.308457711 1/3 29/94 62/201 1/2 1/4 2/8 5/16 3/10 31/100 62/201 -65 201 0.323383085 1/3 11/34 65/201 1/2 1/4 3/8 5/16 3/10 32/100 65/201 -68 201 0.338308458 1/3 23/68 68/201 1/2 1/4 3/8 5/16 3/10 34/100 68/201 -71 201 0.353233831 1/3 6/17 71/201 1/2 1/4 3/8 6/16 4/10 35/100 71/201 -74 201 0.368159204 3/8 7/19 74/201 1/2 1/4 3/8 6/16 4/10 37/100 74/201 -77 201 0.383084577 3/8 18/47 77/201 1/2 2/4 3/8 6/16 4/10 38/100 77/201 -80 201 0.39800995 2/5 39/98 80/201 1/2 2/4 3/8 6/16 4/10 40/100 80/201 -83 201 0.412935323 2/5 19/46 83/201 1/2 2/4 3/8 7/16 4/10 41/100 83/201 -86 201 0.427860697 3/7 3/7 86/201 1/2 2/4 3/8 7/16 4/10 43/100 86/201 -89 201 0.44278607 4/9 31/70 89/201 1/2 2/4 4/8 7/16 4/10 44/100 89/201 -92 201 0.457711443 1/2 27/59 92/201 1/2 2/4 4/8 7/16 5/10 46/100 92/201 -95 201 0.472636816 1/2 26/55 95/201 1/2 2/4 4/8 8/16 5/10 47/100 95/201 -98 201 0.487562189 1/2 39/80 98/201 1/2 2/4 4/8 8/16 5/10 49/100 98/201 -101 201 0.502487562 1/2 1/2 101/201 1/2 2/4 4/8 8/16 5/10 50/100 101/201 -104 201 0.517412935 1/2 15/29 104/201 1/2 2/4 4/8 8/16 5/10 52/100 104/201 -107 201 0.532338308 1/2 33/62 107/201 1/2 2/4 4/8 9/16 5/10 53/100 107/201 -110 201 0.547263682 5/9 29/53 110/201 1/2 2/4 4/8 9/16 5/10 55/100 110/201 -113 201 0.562189055 5/9 9/16 113/201 1/2 2/4 4/8 9/16 6/10 56/100 113/201 -116 201 0.577114428 4/7 15/26 116/201 1/2 2/4 5/8 9/16 6/10 58/100 116/201 -119 201 0.592039801 3/5 45/76 119/201 1/2 2/4 5/8 9/16 6/10 59/100 119/201 -122 201 0.606965174 3/5 17/28 122/201 1/2 2/4 5/8 10/16 6/10 61/100 122/201 -125 201 0.621890547 5/8 51/82 125/201 1/2 2/4 5/8 10/16 6/10 62/100 125/201 -128 201 0.63681592 2/3 7/11 128/201 1/2 3/4 5/8 10/16 6/10 64/100 128/201 -131 201 0.651741294 2/3 58/89 131/201 1/2 3/4 5/8 10/16 7/10 65/100 131/201 -134 201 0.666666667 2/3 2/3 2/3 1/2 3/4 5/8 11/16 7/10 67/100 2/3 -137 201 0.68159204 2/3 15/22 137/201 1/2 3/4 5/8 11/16 7/10 68/100 137/201 -140 201 0.696517413 2/3 39/56 140/201 1/2 3/4 6/8 11/16 7/10 70/100 140/201 -143 201 0.711442786 5/7 37/52 143/201 1/2 3/4 6/8 11/16 7/10 71/100 143/201 -146 201 0.726368159 5/7 69/95 146/201 1/2 3/4 6/8 12/16 7/10 73/100 146/201 -149 201 0.741293532 3/4 43/58 149/201 1/2 3/4 6/8 12/16 7/10 74/100 149/201 -152 201 0.756218905 3/4 31/41 152/201 1 3/4 6/8 12/16 8/10 76/100 152/201 -155 201 0.771144279 7/9 64/83 155/201 1 3/4 6/8 12/16 8/10 77/100 155/201 -158 201 0.786069652 4/5 11/14 158/201 1 3/4 6/8 13/16 8/10 79/100 158/201 -161 201 0.800995025 4/5 4/5 161/201 1 3/4 6/8 13/16 8/10 80/100 161/201 -164 201 0.815920398 4/5 31/38 164/201 1 3/4 7/8 13/16 8/10 82/100 164/201 -167 201 0.830845771 5/6 54/65 167/201 1 3/4 7/8 13/16 8/10 83/100 167/201 -170 201 0.845771144 5/6 11/13 170/201 1 3/4 7/8 14/16 8/10 85/100 170/201 -173 201 0.860696517 6/7 68/79 173/201 1 3/4 7/8 14/16 9/10 86/100 173/201 -176 201 0.875621891 7/8 7/8 176/201 1 1 7/8 14/16 9/10 88/100 176/201 -179 201 0.890547264 8/9 57/64 179/201 1 1 7/8 14/16 9/10 89/100 179/201 -182 201 0.905472637 1 67/74 182/201 1 1 7/8 14/16 9/10 91/100 182/201 -185 201 0.92039801 1 81/88 185/201 1 1 7/8 15/16 9/10 92/100 185/201 -188 201 0.935323383 1 29/31 188/201 1 1 7/8 15/16 9/10 94/100 188/201 -191 201 0.950248756 1 19/20 191/201 1 1 1 15/16 1 95/100 191/201 -194 201 0.965174129 1 83/86 194/201 1 1 1 15/16 1 97/100 194/201 -197 201 0.980099502 1 49/50 197/201 1 1 1 1 1 98/100 197/201 -200 201 0.995024876 1 1 200/201 1 1 1 1 1 1 200/201 -203 201 1.009950249 1 1 1 2/201 1 1 1 1 1 1 1/100 1 2/201 -206 201 1.024875622 1 1 1/40 1 5/201 1 1 1 1 1 1 2/100 1 5/201 -209 201 1.039800995 1 1 1/25 1 8/201 1 1 1 1 1/16 1 1 4/100 1 8/201 -212 201 1.054726368 1 1 4/73 1 11/201 1 1 1 1 1/16 1 1/10 1 5/100 1 11/201 -215 201 1.069651741 1 1 3/43 1 14/201 1 1 1 1/8 1 1/16 1 1/10 1 7/100 1 14/201 -218 201 1.084577114 1 1 6/71 1 17/201 1 1 1 1/8 1 1/16 1 1/10 1 8/100 1 17/201 -221 201 1.099502488 1 1 1/10 1 20/201 1 1 1 1/8 1 2/16 1 1/10 1 10/100 1 20/201 -224 201 1.114427861 1 1/9 1 4/35 1 23/201 1 1 1 1/8 1 2/16 1 1/10 1 11/100 1 23/201 -227 201 1.129353234 1 1/8 1 11/85 1 26/201 1 1 1/4 1 1/8 1 2/16 1 1/10 1 13/100 1 26/201 -230 201 1.144278607 1 1/7 1 14/97 1 29/201 1 1 1/4 1 1/8 1 2/16 1 1/10 1 14/100 1 29/201 -233 201 1.15920398 1 1/6 1 7/44 1 32/201 1 1 1/4 1 1/8 1 3/16 1 2/10 1 16/100 1 32/201 -236 201 1.174129353 1 1/6 1 4/23 1 35/201 1 1 1/4 1 1/8 1 3/16 1 2/10 1 17/100 1 35/201 -239 201 1.189054726 1 1/5 1 7/37 1 38/201 1 1 1/4 1 2/8 1 3/16 1 2/10 1 19/100 1 38/201 -242 201 1.2039801 1 1/5 1 10/49 1 41/201 1 1 1/4 1 2/8 1 3/16 1 2/10 1 20/100 1 41/201 -245 201 1.218905473 1 2/9 1 7/32 1 44/201 1 1 1/4 1 2/8 1 4/16 1 2/10 1 22/100 1 44/201 -248 201 1.233830846 1 1/4 1 18/77 1 47/201 1 1 1/4 1 2/8 1 4/16 1 2/10 1 23/100 1 47/201 -251 201 1.248756219 1 1/4 1 1/4 1 50/201 1 1 1/4 1 2/8 1 4/16 1 2/10 1 25/100 1 50/201 -254 201 1.263681592 1 1/4 1 24/91 1 53/201 1 1/2 1 1/4 1 2/8 1 4/16 1 3/10 1 26/100 1 53/201 - - - - - - - - - - - - - - - - - - - +Numerator Denominator Double 1Digit 2Digit 3Digit Half Quarter Eight Sixteenth Tenth 100th Tika-1132 +4051 8750153 0.000462963 0 0 0 0 0 0 0 0 0 4051/8750153 +-105 100 -1.05 -1 -1 1/20 -1 1/20 -1 -1 -1 -1 1/16 -1 1/10 -1 5/100 -1 1/20 +-104 100 -1.04 -1 -1 1/25 -1 1/25 -1 -1 -1 -1 1/16 -1 -1 4/100 -1 1/25 +-103 100 -1.03 -1 -1 1/33 -1 3/100 -1 -1 -1 -1 -1 -1 3/100 -1 3/100 +-102 100 -1.02 -1 -1 1/50 -1 1/50 -1 -1 -1 -1 -1 -1 2/100 -1 1/50 +-101 100 -1.01 -1 -1 1/99 -1 1/100 -1 -1 -1 -1 -1 -1 1/100 -1 1/100 +-100 100 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +-99 100 -0.99 -1 - 98/99 - 99/100 -1 -1 -1 -1 -1 - 99/100 - 99/100 +-98 100 -0.98 -1 - 49/50 - 49/50 -1 -1 -1 -1 -1 - 98/100 - 49/50 +-97 100 -0.97 -1 - 32/33 - 97/100 -1 -1 -1 -1 -1 - 97/100 - 97/100 +-96 100 -0.96 -1 - 24/25 - 24/25 -1 -1 -1 - 15/16 -1 - 96/100 - 24/25 +-95 100 -0.95 -1 - 19/20 - 19/20 -1 -1 -1 - 15/16 -1 - 95/100 - 19/20 +-94 100 -0.94 -1 - 47/50 - 47/50 -1 -1 -1 - 15/16 - 9/10 - 94/100 - 47/50 +-93 100 -0.93 -1 - 40/43 - 93/100 -1 -1 - 7/8 - 15/16 - 9/10 - 93/100 - 93/100 +-92 100 -0.92 -1 - 23/25 - 23/25 -1 -1 - 7/8 - 15/16 - 9/10 - 92/100 - 23/25 +-91 100 -0.91 -1 - 81/89 - 91/100 -1 -1 - 7/8 - 15/16 - 9/10 - 91/100 - 91/100 +-90 100 -0.9 - 8/9 - 9/10 - 9/10 -1 -1 - 7/8 - 14/16 - 9/10 - 90/100 - 9/10 +-89 100 -0.89 - 8/9 - 8/9 - 89/100 -1 -1 - 7/8 - 14/16 - 9/10 - 89/100 - 89/100 +-88 100 -0.88 - 7/8 - 22/25 - 22/25 -1 -1 - 7/8 - 14/16 - 9/10 - 88/100 - 22/25 +-87 100 -0.87 - 7/8 - 67/77 - 87/100 -1 - 3/4 - 7/8 - 14/16 - 9/10 - 87/100 - 87/100 +-86 100 -0.86 - 6/7 - 43/50 - 43/50 -1 - 3/4 - 7/8 - 14/16 - 9/10 - 86/100 - 43/50 +-85 100 -0.85 - 6/7 - 17/20 - 17/20 -1 - 3/4 - 7/8 - 14/16 - 9/10 - 85/100 - 17/20 +-84 100 -0.84 - 5/6 - 21/25 - 21/25 -1 - 3/4 - 7/8 - 13/16 - 8/10 - 84/100 - 21/25 +-83 100 -0.83 - 5/6 - 39/47 - 83/100 -1 - 3/4 - 7/8 - 13/16 - 8/10 - 83/100 - 83/100 +-82 100 -0.82 - 5/6 - 41/50 - 41/50 -1 - 3/4 - 7/8 - 13/16 - 8/10 - 82/100 - 41/50 +-81 100 -0.81 - 4/5 - 64/79 - 81/100 -1 - 3/4 - 6/8 - 13/16 - 8/10 - 81/100 - 81/100 +-80 100 -0.8 - 4/5 - 4/5 - 4/5 -1 - 3/4 - 6/8 - 13/16 - 8/10 - 80/100 - 4/5 +-79 100 -0.79 - 4/5 - 64/81 - 79/100 -1 - 3/4 - 6/8 - 13/16 - 8/10 - 79/100 - 79/100 +-78 100 -0.78 - 7/9 - 39/50 - 39/50 -1 - 3/4 - 6/8 - 12/16 - 8/10 - 78/100 - 39/50 +-77 100 -0.77 - 7/9 - 67/87 - 77/100 -1 - 3/4 - 6/8 - 12/16 - 8/10 - 77/100 - 77/100 +-76 100 -0.76 - 3/4 - 19/25 - 19/25 -1 - 3/4 - 6/8 - 12/16 - 8/10 - 76/100 - 19/25 +-75 100 -0.75 - 3/4 - 3/4 - 3/4 -1 - 3/4 - 6/8 - 12/16 - 8/10 - 75/100 - 3/4 +-74 100 -0.74 - 3/4 - 37/50 - 37/50 - 1/2 - 3/4 - 6/8 - 12/16 - 7/10 - 74/100 - 37/50 +-73 100 -0.73 - 3/4 - 46/63 - 73/100 - 1/2 - 3/4 - 6/8 - 12/16 - 7/10 - 73/100 - 73/100 +-72 100 -0.72 - 5/7 - 18/25 - 18/25 - 1/2 - 3/4 - 6/8 - 12/16 - 7/10 - 72/100 - 18/25 +-71 100 -0.71 - 5/7 - 22/31 - 71/100 - 1/2 - 3/4 - 6/8 - 11/16 - 7/10 - 71/100 - 71/100 +-70 100 -0.7 - 2/3 - 7/10 - 7/10 - 1/2 - 3/4 - 6/8 - 11/16 - 7/10 - 70/100 - 7/10 +-69 100 -0.69 - 2/3 - 20/29 - 69/100 - 1/2 - 3/4 - 6/8 - 11/16 - 7/10 - 69/100 - 69/100 +-68 100 -0.68 - 2/3 - 17/25 - 17/25 - 1/2 - 3/4 - 5/8 - 11/16 - 7/10 - 68/100 - 17/25 +-67 100 -0.67 - 2/3 - 65/97 - 67/100 - 1/2 - 3/4 - 5/8 - 11/16 - 7/10 - 67/100 - 67/100 +-66 100 -0.66 - 2/3 - 33/50 - 33/50 - 1/2 - 3/4 - 5/8 - 11/16 - 7/10 - 66/100 - 33/50 +-65 100 -0.65 - 2/3 - 13/20 - 13/20 - 1/2 - 3/4 - 5/8 - 10/16 - 7/10 - 65/100 - 13/20 +-64 100 -0.64 - 2/3 - 16/25 - 16/25 - 1/2 - 3/4 - 5/8 - 10/16 - 6/10 - 64/100 - 16/25 +-63 100 -0.63 - 5/8 - 46/73 - 63/100 - 1/2 - 3/4 - 5/8 - 10/16 - 6/10 - 63/100 - 63/100 +-62 100 -0.62 - 5/8 - 31/50 - 31/50 - 1/2 - 2/4 - 5/8 - 10/16 - 6/10 - 62/100 - 31/50 +-61 100 -0.61 - 3/5 - 36/59 - 61/100 - 1/2 - 2/4 - 5/8 - 10/16 - 6/10 - 61/100 - 61/100 +-60 100 -0.6 - 3/5 - 3/5 - 3/5 - 1/2 - 2/4 - 5/8 - 10/16 - 6/10 - 60/100 - 3/5 +-59 100 -0.59 - 3/5 - 23/39 - 59/100 - 1/2 - 2/4 - 5/8 - 9/16 - 6/10 - 59/100 - 59/100 +-58 100 -0.58 - 4/7 - 29/50 - 29/50 - 1/2 - 2/4 - 5/8 - 9/16 - 6/10 - 58/100 - 29/50 +-57 100 -0.57 - 4/7 - 53/93 - 57/100 - 1/2 - 2/4 - 5/8 - 9/16 - 6/10 - 57/100 - 57/100 +-56 100 -0.56 - 5/9 - 14/25 - 14/25 - 1/2 - 2/4 - 4/8 - 9/16 - 6/10 - 56/100 - 14/25 +-55 100 -0.55 - 5/9 - 11/20 - 11/20 - 1/2 - 2/4 - 4/8 - 9/16 - 6/10 - 55/100 - 11/20 +-54 100 -0.54 - 1/2 - 27/50 - 27/50 - 1/2 - 2/4 - 4/8 - 9/16 - 5/10 - 54/100 - 27/50 +-53 100 -0.53 - 1/2 - 44/83 - 53/100 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 53/100 - 53/100 +-52 100 -0.52 - 1/2 - 13/25 - 13/25 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 52/100 - 13/25 +-51 100 -0.51 - 1/2 - 25/49 - 51/100 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 51/100 - 51/100 +-50 100 -0.5 - 1/2 - 1/2 - 1/2 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 50/100 - 1/2 +-49 100 -0.49 - 1/2 - 24/49 - 49/100 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 49/100 - 49/100 +-48 100 -0.48 - 1/2 - 12/25 - 12/25 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 48/100 - 12/25 +-47 100 -0.47 - 1/2 - 8/17 - 47/100 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 47/100 - 47/100 +-46 100 -0.46 - 1/2 - 23/50 - 23/50 - 1/2 - 2/4 - 4/8 - 7/16 - 5/10 - 46/100 - 23/50 +-45 100 -0.45 - 4/9 - 9/20 - 9/20 - 1/2 - 2/4 - 4/8 - 7/16 - 5/10 - 45/100 - 9/20 +-44 100 -0.44 - 4/9 - 11/25 - 11/25 - 1/2 - 2/4 - 4/8 - 7/16 - 4/10 - 44/100 - 11/25 +-43 100 -0.43 - 3/7 - 3/7 - 43/100 - 1/2 - 2/4 - 3/8 - 7/16 - 4/10 - 43/100 - 43/100 +-42 100 -0.42 - 3/7 - 21/50 - 21/50 - 1/2 - 2/4 - 3/8 - 7/16 - 4/10 - 42/100 - 21/50 +-41 100 -0.41 - 2/5 - 16/39 - 41/100 - 1/2 - 2/4 - 3/8 - 7/16 - 4/10 - 41/100 - 41/100 +-40 100 -0.4 - 2/5 - 2/5 - 2/5 - 1/2 - 2/4 - 3/8 - 6/16 - 4/10 - 40/100 - 2/5 +-39 100 -0.39 - 2/5 - 16/41 - 39/100 - 1/2 - 2/4 - 3/8 - 6/16 - 4/10 - 39/100 - 39/100 +-38 100 -0.38 - 3/8 - 19/50 - 19/50 - 1/2 - 2/4 - 3/8 - 6/16 - 4/10 - 38/100 - 19/50 +-37 100 -0.37 - 3/8 - 10/27 - 37/100 - 1/2 - 1/4 - 3/8 - 6/16 - 4/10 - 37/100 - 37/100 +-36 100 -0.36 - 1/3 - 9/25 - 9/25 - 1/2 - 1/4 - 3/8 - 6/16 - 4/10 - 36/100 - 9/25 +-35 100 -0.35 - 1/3 - 7/20 - 7/20 - 1/2 - 1/4 - 3/8 - 6/16 - 4/10 - 35/100 - 7/20 +-34 100 -0.34 - 1/3 - 17/50 - 17/50 - 1/2 - 1/4 - 3/8 - 5/16 - 3/10 - 34/100 - 17/50 +-33 100 -0.33 - 1/3 - 1/3 - 33/100 - 1/2 - 1/4 - 3/8 - 5/16 - 3/10 - 33/100 - 33/100 +-32 100 -0.32 - 1/3 - 8/25 - 8/25 - 1/2 - 1/4 - 3/8 - 5/16 - 3/10 - 32/100 - 8/25 +-31 100 -0.31 - 1/3 - 22/71 - 31/100 - 1/2 - 1/4 - 2/8 - 5/16 - 3/10 - 31/100 - 31/100 +-30 100 -0.3 - 2/7 - 3/10 - 3/10 - 1/2 - 1/4 - 2/8 - 5/16 - 3/10 - 30/100 - 3/10 +-29 100 -0.29 - 2/7 - 20/69 - 29/100 - 1/2 - 1/4 - 2/8 - 5/16 - 3/10 - 29/100 - 29/100 +-28 100 -0.28 - 2/7 - 7/25 - 7/25 - 1/2 - 1/4 - 2/8 - 4/16 - 3/10 - 28/100 - 7/25 +-27 100 -0.27 - 1/4 - 10/37 - 27/100 - 1/2 - 1/4 - 2/8 - 4/16 - 3/10 - 27/100 - 27/100 +-26 100 -0.26 - 1/4 - 13/50 - 13/50 - 1/2 - 1/4 - 2/8 - 4/16 - 3/10 - 26/100 - 13/50 +-25 100 -0.25 - 1/4 - 1/4 - 1/4 - 1/2 - 1/4 - 2/8 - 4/16 - 3/10 - 25/100 - 1/4 +-24 100 -0.24 - 1/4 - 6/25 - 6/25 -0 - 1/4 - 2/8 - 4/16 - 2/10 - 24/100 - 6/25 +-23 100 -0.23 - 2/9 - 3/13 - 23/100 -0 - 1/4 - 2/8 - 4/16 - 2/10 - 23/100 - 23/100 +-22 100 -0.22 - 2/9 - 11/50 - 11/50 -0 - 1/4 - 2/8 - 4/16 - 2/10 - 22/100 - 11/50 +-21 100 -0.21 - 1/5 - 17/81 - 21/100 -0 - 1/4 - 2/8 - 3/16 - 2/10 - 21/100 - 21/100 +-20 100 -0.2 - 1/5 - 1/5 - 1/5 -0 - 1/4 - 2/8 - 3/16 - 2/10 - 20/100 - 1/5 +-19 100 -0.19 - 1/5 - 15/79 - 19/100 -0 - 1/4 - 2/8 - 3/16 - 2/10 - 19/100 - 19/100 +-18 100 -0.18 - 1/6 - 9/50 - 9/50 -0 - 1/4 - 1/8 - 3/16 - 2/10 - 18/100 - 9/50 +-17 100 -0.17 - 1/6 - 8/47 - 17/100 -0 - 1/4 - 1/8 - 3/16 - 2/10 - 17/100 - 17/100 +-16 100 -0.16 - 1/6 - 4/25 - 4/25 -0 - 1/4 - 1/8 - 3/16 - 2/10 - 16/100 - 4/25 +-15 100 -0.15 - 1/7 - 3/20 - 3/20 -0 - 1/4 - 1/8 - 2/16 - 2/10 - 15/100 - 3/20 +-14 100 -0.14 - 1/7 - 7/50 - 7/50 -0 - 1/4 - 1/8 - 2/16 - 1/10 - 14/100 - 7/50 +-13 100 -0.13 - 1/8 - 3/23 - 13/100 -0 - 1/4 - 1/8 - 2/16 - 1/10 - 13/100 - 13/100 +-12 100 -0.12 - 1/8 - 3/25 - 3/25 -0 -0 - 1/8 - 2/16 - 1/10 - 12/100 - 3/25 +-11 100 -0.11 - 1/9 - 10/91 - 11/100 -0 -0 - 1/8 - 2/16 - 1/10 - 11/100 - 11/100 +-10 100 -0.1 -0 - 1/10 - 1/10 -0 -0 - 1/8 - 2/16 - 1/10 - 10/100 - 1/10 +-9 100 -0.09 -0 - 1/11 - 9/100 -0 -0 - 1/8 - 1/16 - 1/10 - 9/100 - 9/100 +-8 100 -0.08 -0 - 2/25 - 2/25 -0 -0 - 1/8 - 1/16 - 1/10 - 8/100 - 2/25 +-7 100 -0.07 -0 - 4/57 - 7/100 -0 -0 - 1/8 - 1/16 - 1/10 - 7/100 - 7/100 +-6 100 -0.06 -0 - 3/50 - 3/50 -0 -0 -0 - 1/16 - 1/10 - 6/100 - 3/50 +-5 100 -0.05 -0 - 1/20 - 1/20 -0 -0 -0 - 1/16 - 1/10 - 5/100 - 1/20 +-4 100 -0.04 -0 - 1/25 - 1/25 -0 -0 -0 - 1/16 -0 - 4/100 - 1/25 +-3 100 -0.03 -0 - 2/67 - 3/100 -0 -0 -0 -0 -0 - 3/100 - 3/100 +-2 100 -0.02 -0 - 1/50 - 1/50 -0 -0 -0 -0 -0 - 2/100 - 1/50 +-1 100 -0.01 -0 -0 - 1/100 -0 -0 -0 -0 -0 - 1/100 - 1/100 +0 100 0 0 0 0 0 0 0 0 0 0 0 +1 100 0.01 0 0 1/100 0 0 0 0 0 1/100 1/100 +2 100 0.02 0 1/50 1/50 0 0 0 0 0 2/100 1/50 +3 100 0.03 0 2/67 3/100 0 0 0 0 0 3/100 3/100 +4 100 0.04 0 1/25 1/25 0 0 0 1/16 0 4/100 1/25 +5 100 0.05 0 1/20 1/20 0 0 0 1/16 1/10 5/100 1/20 +6 100 0.06 0 3/50 3/50 0 0 0 1/16 1/10 6/100 3/50 +7 100 0.07 0 4/57 7/100 0 0 1/8 1/16 1/10 7/100 7/100 +8 100 0.08 0 2/25 2/25 0 0 1/8 1/16 1/10 8/100 2/25 +9 100 0.09 0 1/11 9/100 0 0 1/8 1/16 1/10 9/100 9/100 +10 100 0.1 0 1/10 1/10 0 0 1/8 2/16 1/10 10/100 1/10 +11 100 0.11 1/9 10/91 11/100 0 0 1/8 2/16 1/10 11/100 11/100 +12 100 0.12 1/8 3/25 3/25 0 0 1/8 2/16 1/10 12/100 3/25 +13 100 0.13 1/8 3/23 13/100 0 1/4 1/8 2/16 1/10 13/100 13/100 +14 100 0.14 1/7 7/50 7/50 0 1/4 1/8 2/16 1/10 14/100 7/50 +15 100 0.15 1/7 3/20 3/20 0 1/4 1/8 2/16 2/10 15/100 3/20 +16 100 0.16 1/6 4/25 4/25 0 1/4 1/8 3/16 2/10 16/100 4/25 +17 100 0.17 1/6 8/47 17/100 0 1/4 1/8 3/16 2/10 17/100 17/100 +18 100 0.18 1/6 9/50 9/50 0 1/4 1/8 3/16 2/10 18/100 9/50 +19 100 0.19 1/5 15/79 19/100 0 1/4 2/8 3/16 2/10 19/100 19/100 +20 100 0.2 1/5 1/5 1/5 0 1/4 2/8 3/16 2/10 20/100 1/5 +21 100 0.21 1/5 17/81 21/100 0 1/4 2/8 3/16 2/10 21/100 21/100 +22 100 0.22 2/9 11/50 11/50 0 1/4 2/8 4/16 2/10 22/100 11/50 +23 100 0.23 2/9 3/13 23/100 0 1/4 2/8 4/16 2/10 23/100 23/100 +24 100 0.24 1/4 6/25 6/25 0 1/4 2/8 4/16 2/10 24/100 6/25 +25 100 0.25 1/4 1/4 1/4 1/2 1/4 2/8 4/16 3/10 25/100 1/4 +26 100 0.26 1/4 13/50 13/50 1/2 1/4 2/8 4/16 3/10 26/100 13/50 +27 100 0.27 1/4 10/37 27/100 1/2 1/4 2/8 4/16 3/10 27/100 27/100 +28 100 0.28 2/7 7/25 7/25 1/2 1/4 2/8 4/16 3/10 28/100 7/25 +29 100 0.29 2/7 20/69 29/100 1/2 1/4 2/8 5/16 3/10 29/100 29/100 +30 100 0.3 2/7 3/10 3/10 1/2 1/4 2/8 5/16 3/10 30/100 3/10 +31 100 0.31 1/3 22/71 31/100 1/2 1/4 2/8 5/16 3/10 31/100 31/100 +32 100 0.32 1/3 8/25 8/25 1/2 1/4 3/8 5/16 3/10 32/100 8/25 +33 100 0.33 1/3 1/3 33/100 1/2 1/4 3/8 5/16 3/10 33/100 33/100 +34 100 0.34 1/3 17/50 17/50 1/2 1/4 3/8 5/16 3/10 34/100 17/50 +35 100 0.35 1/3 7/20 7/20 1/2 1/4 3/8 6/16 4/10 35/100 7/20 +36 100 0.36 1/3 9/25 9/25 1/2 1/4 3/8 6/16 4/10 36/100 9/25 +37 100 0.37 3/8 10/27 37/100 1/2 1/4 3/8 6/16 4/10 37/100 37/100 +38 100 0.38 3/8 19/50 19/50 1/2 2/4 3/8 6/16 4/10 38/100 19/50 +39 100 0.39 2/5 16/41 39/100 1/2 2/4 3/8 6/16 4/10 39/100 39/100 +40 100 0.4 2/5 2/5 2/5 1/2 2/4 3/8 6/16 4/10 40/100 2/5 +41 100 0.41 2/5 16/39 41/100 1/2 2/4 3/8 7/16 4/10 41/100 41/100 +42 100 0.42 3/7 21/50 21/50 1/2 2/4 3/8 7/16 4/10 42/100 21/50 +43 100 0.43 3/7 3/7 43/100 1/2 2/4 3/8 7/16 4/10 43/100 43/100 +44 100 0.44 4/9 11/25 11/25 1/2 2/4 4/8 7/16 4/10 44/100 11/25 +45 100 0.45 4/9 9/20 9/20 1/2 2/4 4/8 7/16 5/10 45/100 9/20 +46 100 0.46 1/2 23/50 23/50 1/2 2/4 4/8 7/16 5/10 46/100 23/50 +47 100 0.47 1/2 8/17 47/100 1/2 2/4 4/8 8/16 5/10 47/100 47/100 +48 100 0.48 1/2 12/25 12/25 1/2 2/4 4/8 8/16 5/10 48/100 12/25 +49 100 0.49 1/2 24/49 49/100 1/2 2/4 4/8 8/16 5/10 49/100 49/100 +50 100 0.5 1/2 1/2 1/2 1/2 2/4 4/8 8/16 5/10 50/100 1/2 +51 100 0.51 1/2 25/49 51/100 1/2 2/4 4/8 8/16 5/10 51/100 51/100 +52 100 0.52 1/2 13/25 13/25 1/2 2/4 4/8 8/16 5/10 52/100 13/25 +53 100 0.53 1/2 44/83 53/100 1/2 2/4 4/8 8/16 5/10 53/100 53/100 +54 100 0.54 1/2 27/50 27/50 1/2 2/4 4/8 9/16 5/10 54/100 27/50 +55 100 0.55 5/9 11/20 11/20 1/2 2/4 4/8 9/16 6/10 55/100 11/20 +56 100 0.56 5/9 14/25 14/25 1/2 2/4 4/8 9/16 6/10 56/100 14/25 +57 100 0.57 4/7 53/93 57/100 1/2 2/4 5/8 9/16 6/10 57/100 57/100 +58 100 0.58 4/7 29/50 29/50 1/2 2/4 5/8 9/16 6/10 58/100 29/50 +59 100 0.59 3/5 23/39 59/100 1/2 2/4 5/8 9/16 6/10 59/100 59/100 +60 100 0.6 3/5 3/5 3/5 1/2 2/4 5/8 10/16 6/10 60/100 3/5 +61 100 0.61 3/5 36/59 61/100 1/2 2/4 5/8 10/16 6/10 61/100 61/100 +62 100 0.62 5/8 31/50 31/50 1/2 2/4 5/8 10/16 6/10 62/100 31/50 +63 100 0.63 5/8 46/73 63/100 1/2 3/4 5/8 10/16 6/10 63/100 63/100 +64 100 0.64 2/3 16/25 16/25 1/2 3/4 5/8 10/16 6/10 64/100 16/25 +65 100 0.65 2/3 13/20 13/20 1/2 3/4 5/8 10/16 7/10 65/100 13/20 +66 100 0.66 2/3 33/50 33/50 1/2 3/4 5/8 11/16 7/10 66/100 33/50 +67 100 0.67 2/3 65/97 67/100 1/2 3/4 5/8 11/16 7/10 67/100 67/100 +68 100 0.68 2/3 17/25 17/25 1/2 3/4 5/8 11/16 7/10 68/100 17/25 +69 100 0.69 2/3 20/29 69/100 1/2 3/4 6/8 11/16 7/10 69/100 69/100 +70 100 0.7 2/3 7/10 7/10 1/2 3/4 6/8 11/16 7/10 70/100 7/10 +71 100 0.71 5/7 22/31 71/100 1/2 3/4 6/8 11/16 7/10 71/100 71/100 +72 100 0.72 5/7 18/25 18/25 1/2 3/4 6/8 12/16 7/10 72/100 18/25 +73 100 0.73 3/4 46/63 73/100 1/2 3/4 6/8 12/16 7/10 73/100 73/100 +74 100 0.74 3/4 37/50 37/50 1/2 3/4 6/8 12/16 7/10 74/100 37/50 +75 100 0.75 3/4 3/4 3/4 1 3/4 6/8 12/16 8/10 75/100 3/4 +76 100 0.76 3/4 19/25 19/25 1 3/4 6/8 12/16 8/10 76/100 19/25 +77 100 0.77 7/9 67/87 77/100 1 3/4 6/8 12/16 8/10 77/100 77/100 +78 100 0.78 7/9 39/50 39/50 1 3/4 6/8 12/16 8/10 78/100 39/50 +79 100 0.79 4/5 64/81 79/100 1 3/4 6/8 13/16 8/10 79/100 79/100 +80 100 0.8 4/5 4/5 4/5 1 3/4 6/8 13/16 8/10 80/100 4/5 +81 100 0.81 4/5 64/79 81/100 1 3/4 6/8 13/16 8/10 81/100 81/100 +82 100 0.82 5/6 41/50 41/50 1 3/4 7/8 13/16 8/10 82/100 41/50 +83 100 0.83 5/6 39/47 83/100 1 3/4 7/8 13/16 8/10 83/100 83/100 +84 100 0.84 5/6 21/25 21/25 1 3/4 7/8 13/16 8/10 84/100 21/25 +85 100 0.85 6/7 17/20 17/20 1 3/4 7/8 14/16 9/10 85/100 17/20 +86 100 0.86 6/7 43/50 43/50 1 3/4 7/8 14/16 9/10 86/100 43/50 +87 100 0.87 7/8 67/77 87/100 1 3/4 7/8 14/16 9/10 87/100 87/100 +88 100 0.88 7/8 22/25 22/25 1 1 7/8 14/16 9/10 88/100 22/25 +89 100 0.89 8/9 8/9 89/100 1 1 7/8 14/16 9/10 89/100 89/100 +90 100 0.9 8/9 9/10 9/10 1 1 7/8 14/16 9/10 90/100 9/10 +91 100 0.91 1 81/89 91/100 1 1 7/8 15/16 9/10 91/100 91/100 +92 100 0.92 1 23/25 23/25 1 1 7/8 15/16 9/10 92/100 23/25 +93 100 0.93 1 40/43 93/100 1 1 7/8 15/16 9/10 93/100 93/100 +94 100 0.94 1 47/50 47/50 1 1 1 15/16 9/10 94/100 47/50 +95 100 0.95 1 19/20 19/20 1 1 1 15/16 1 95/100 19/20 +96 100 0.96 1 24/25 24/25 1 1 1 15/16 1 96/100 24/25 +97 100 0.97 1 32/33 97/100 1 1 1 1 1 97/100 97/100 +98 100 0.98 1 49/50 49/50 1 1 1 1 1 98/100 49/50 +99 100 0.99 1 98/99 99/100 1 1 1 1 1 99/100 99/100 +100 100 1 1 1 1 1 1 1 1 1 1 1 +101 100 1.01 1 1 1/99 1 1/100 1 1 1 1 1 1 1/100 1 1/100 +102 100 1.02 1 1 1/50 1 1/50 1 1 1 1 1 1 2/100 1 1/50 +103 100 1.03 1 1 1/33 1 3/100 1 1 1 1 1 1 3/100 1 3/100 +104 100 1.04 1 1 1/25 1 1/25 1 1 1 1 1/16 1 1 4/100 1 1/25 +105 100 1.05 1 1 1/20 1 1/20 1 1 1 1 1/16 1 1/10 1 5/100 1 1/20 +106 100 1.06 1 1 3/50 1 3/50 1 1 1 1 1/16 1 1/10 1 6/100 1 3/50 +107 100 1.07 1 1 4/57 1 7/100 1 1 1 1/8 1 1/16 1 1/10 1 7/100 1 7/100 +108 100 1.08 1 1 2/25 1 2/25 1 1 1 1/8 1 1/16 1 1/10 1 8/100 1 2/25 +109 100 1.09 1 1 1/11 1 9/100 1 1 1 1/8 1 1/16 1 1/10 1 9/100 1 9/100 +110 100 1.1 1 1/9 1 1/10 1 1/10 1 1 1 1/8 1 2/16 1 1/10 1 10/100 1 1/10 +111 100 1.11 1 1/9 1 1/9 1 11/100 1 1 1 1/8 1 2/16 1 1/10 1 11/100 1 11/100 +112 100 1.12 1 1/8 1 3/25 1 3/25 1 1 1 1/8 1 2/16 1 1/10 1 12/100 1 3/25 +113 100 1.13 1 1/8 1 10/77 1 13/100 1 1 1/4 1 1/8 1 2/16 1 1/10 1 13/100 1 13/100 +114 100 1.14 1 1/7 1 7/50 1 7/50 1 1 1/4 1 1/8 1 2/16 1 1/10 1 14/100 1 7/50 +115 100 1.15 1 1/7 1 3/20 1 3/20 1 1 1/4 1 1/8 1 2/16 1 1/10 1 15/100 1 3/20 +116 100 1.16 1 1/6 1 4/25 1 4/25 1 1 1/4 1 1/8 1 3/16 1 2/10 1 16/100 1 4/25 +117 100 1.17 1 1/6 1 9/53 1 17/100 1 1 1/4 1 1/8 1 3/16 1 2/10 1 17/100 1 17/100 +118 100 1.18 1 1/6 1 9/50 1 9/50 1 1 1/4 1 1/8 1 3/16 1 2/10 1 18/100 1 9/50 +119 100 1.19 1 1/5 1 15/79 1 19/100 1 1 1/4 1 2/8 1 3/16 1 2/10 1 19/100 1 19/100 +120 100 1.2 1 1/5 1 1/5 1 1/5 1 1 1/4 1 2/8 1 3/16 1 2/10 1 20/100 1 1/5 +121 100 1.21 1 1/5 1 17/81 1 21/100 1 1 1/4 1 2/8 1 3/16 1 2/10 1 21/100 1 21/100 +122 100 1.22 1 2/9 1 11/50 1 11/50 1 1 1/4 1 2/8 1 4/16 1 2/10 1 22/100 1 11/50 +123 100 1.23 1 2/9 1 20/87 1 23/100 1 1 1/4 1 2/8 1 4/16 1 2/10 1 23/100 1 23/100 +124 100 1.24 1 1/4 1 6/25 1 6/25 1 1 1/4 1 2/8 1 4/16 1 2/10 1 24/100 1 6/25 +125 100 1.25 1 1/4 1 1/4 1 1/4 1 1/2 1 1/4 1 2/8 1 4/16 1 3/10 1 25/100 1 1/4 +126 100 1.26 1 1/4 1 13/50 1 13/50 1 1/2 1 1/4 1 2/8 1 4/16 1 3/10 1 26/100 1 13/50 +127 100 1.27 1 1/4 1 10/37 1 27/100 1 1/2 1 1/4 1 2/8 1 4/16 1 3/10 1 27/100 1 27/100 +-103 201 -0.512437811 - 1/2 - 41/80 - 103/201 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 51/100 - 103/201 +-100 201 -0.497512438 - 1/2 - 1/2 - 100/201 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 50/100 - 100/201 +-97 201 -0.482587065 - 1/2 - 14/29 - 97/201 - 1/2 - 2/4 - 4/8 - 8/16 - 5/10 - 48/100 - 97/201 +-94 201 -0.467661692 - 1/2 - 29/62 - 94/201 - 1/2 - 2/4 - 4/8 - 7/16 - 5/10 - 47/100 - 94/201 +-91 201 -0.452736318 - 4/9 - 24/53 - 91/201 - 1/2 - 2/4 - 4/8 - 7/16 - 5/10 - 45/100 - 91/201 +-88 201 -0.437810945 - 4/9 - 7/16 - 88/201 - 1/2 - 2/4 - 4/8 - 7/16 - 4/10 - 44/100 - 88/201 +-85 201 -0.422885572 - 3/7 - 11/26 - 85/201 - 1/2 - 2/4 - 3/8 - 7/16 - 4/10 - 42/100 - 85/201 +-82 201 -0.407960199 - 2/5 - 31/76 - 82/201 - 1/2 - 2/4 - 3/8 - 7/16 - 4/10 - 41/100 - 82/201 +-79 201 -0.393034826 - 2/5 - 11/28 - 79/201 - 1/2 - 2/4 - 3/8 - 6/16 - 4/10 - 39/100 - 79/201 +-76 201 -0.378109453 - 3/8 - 31/82 - 76/201 - 1/2 - 2/4 - 3/8 - 6/16 - 4/10 - 38/100 - 76/201 +-73 201 -0.36318408 - 1/3 - 4/11 - 73/201 - 1/2 - 1/4 - 3/8 - 6/16 - 4/10 - 36/100 - 73/201 +-70 201 -0.348258706 - 1/3 - 31/89 - 70/201 - 1/2 - 1/4 - 3/8 - 6/16 - 3/10 - 35/100 - 70/201 +-67 201 -0.333333333 - 1/3 - 1/3 - 1/3 - 1/2 - 1/4 - 3/8 - 5/16 - 3/10 - 33/100 - 1/3 +-64 201 -0.31840796 - 1/3 - 7/22 - 64/201 - 1/2 - 1/4 - 3/8 - 5/16 - 3/10 - 32/100 - 64/201 +-61 201 -0.303482587 - 1/3 - 17/56 - 61/201 - 1/2 - 1/4 - 2/8 - 5/16 - 3/10 - 30/100 - 61/201 +-58 201 -0.288557214 - 2/7 - 15/52 - 58/201 - 1/2 - 1/4 - 2/8 - 5/16 - 3/10 - 29/100 - 58/201 +-55 201 -0.273631841 - 2/7 - 26/95 - 55/201 - 1/2 - 1/4 - 2/8 - 4/16 - 3/10 - 27/100 - 55/201 +-52 201 -0.258706468 - 1/4 - 15/58 - 52/201 - 1/2 - 1/4 - 2/8 - 4/16 - 3/10 - 26/100 - 52/201 +-49 201 -0.243781095 - 1/4 - 10/41 - 49/201 -0 - 1/4 - 2/8 - 4/16 - 2/10 - 24/100 - 49/201 +-46 201 -0.228855721 - 2/9 - 19/83 - 46/201 -0 - 1/4 - 2/8 - 4/16 - 2/10 - 23/100 - 46/201 +-43 201 -0.213930348 - 1/5 - 3/14 - 43/201 -0 - 1/4 - 2/8 - 3/16 - 2/10 - 21/100 - 43/201 +-40 201 -0.199004975 - 1/5 - 1/5 - 40/201 -0 - 1/4 - 2/8 - 3/16 - 2/10 - 20/100 - 40/201 +-37 201 -0.184079602 - 1/5 - 7/38 - 37/201 -0 - 1/4 - 1/8 - 3/16 - 2/10 - 18/100 - 37/201 +-34 201 -0.169154229 - 1/6 - 11/65 - 34/201 -0 - 1/4 - 1/8 - 3/16 - 2/10 - 17/100 - 34/201 +-31 201 -0.154228856 - 1/6 - 2/13 - 31/201 -0 - 1/4 - 1/8 - 2/16 - 2/10 - 15/100 - 31/201 +-28 201 -0.139303483 - 1/7 - 11/79 - 28/201 -0 - 1/4 - 1/8 - 2/16 - 1/10 - 14/100 - 28/201 +-25 201 -0.124378109 - 1/8 - 1/8 - 25/201 -0 -0 - 1/8 - 2/16 - 1/10 - 12/100 - 25/201 +-22 201 -0.109452736 - 1/9 - 7/64 - 22/201 -0 -0 - 1/8 - 2/16 - 1/10 - 11/100 - 22/201 +-19 201 -0.094527363 -0 - 7/74 - 19/201 -0 -0 - 1/8 - 2/16 - 1/10 - 9/100 - 19/201 +-16 201 -0.07960199 -0 - 7/88 - 16/201 -0 -0 - 1/8 - 1/16 - 1/10 - 8/100 - 16/201 +-13 201 -0.064676617 -0 - 2/31 - 13/201 -0 -0 - 1/8 - 1/16 - 1/10 - 6/100 - 13/201 +-10 201 -0.049751244 -0 - 1/20 - 10/201 -0 -0 -0 - 1/16 -0 - 5/100 - 10/201 +-7 201 -0.034825871 -0 - 3/86 - 7/201 -0 -0 -0 - 1/16 -0 - 3/100 - 7/201 +-4 201 -0.019900498 -0 - 1/50 - 4/201 -0 -0 -0 -0 -0 - 2/100 - 4/201 +-1 201 -0.004975124 -0 -0 - 1/201 -0 -0 -0 -0 -0 -0 - 1/201 +2 201 0.009950249 0 0 2/201 0 0 0 0 0 1/100 2/201 +5 201 0.024875622 0 1/40 5/201 0 0 0 0 0 2/100 5/201 +8 201 0.039800995 0 1/25 8/201 0 0 0 1/16 0 4/100 8/201 +11 201 0.054726368 0 4/73 11/201 0 0 0 1/16 1/10 5/100 11/201 +14 201 0.069651741 0 3/43 14/201 0 0 1/8 1/16 1/10 7/100 14/201 +17 201 0.084577114 0 6/71 17/201 0 0 1/8 1/16 1/10 8/100 17/201 +20 201 0.099502488 0 1/10 20/201 0 0 1/8 2/16 1/10 10/100 20/201 +23 201 0.114427861 1/9 4/35 23/201 0 0 1/8 2/16 1/10 11/100 23/201 +26 201 0.129353234 1/8 11/85 26/201 0 1/4 1/8 2/16 1/10 13/100 26/201 +29 201 0.144278607 1/7 14/97 29/201 0 1/4 1/8 2/16 1/10 14/100 29/201 +32 201 0.15920398 1/6 7/44 32/201 0 1/4 1/8 3/16 2/10 16/100 32/201 +35 201 0.174129353 1/6 4/23 35/201 0 1/4 1/8 3/16 2/10 17/100 35/201 +38 201 0.189054726 1/5 7/37 38/201 0 1/4 2/8 3/16 2/10 19/100 38/201 +41 201 0.2039801 1/5 10/49 41/201 0 1/4 2/8 3/16 2/10 20/100 41/201 +44 201 0.218905473 2/9 7/32 44/201 0 1/4 2/8 4/16 2/10 22/100 44/201 +47 201 0.233830846 1/4 18/77 47/201 0 1/4 2/8 4/16 2/10 23/100 47/201 +50 201 0.248756219 1/4 1/4 50/201 0 1/4 2/8 4/16 2/10 25/100 50/201 +53 201 0.263681592 1/4 24/91 53/201 1/2 1/4 2/8 4/16 3/10 26/100 53/201 +56 201 0.278606965 2/7 17/61 56/201 1/2 1/4 2/8 4/16 3/10 28/100 56/201 +59 201 0.293532338 2/7 27/92 59/201 1/2 1/4 2/8 5/16 3/10 29/100 59/201 +62 201 0.308457711 1/3 29/94 62/201 1/2 1/4 2/8 5/16 3/10 31/100 62/201 +65 201 0.323383085 1/3 11/34 65/201 1/2 1/4 3/8 5/16 3/10 32/100 65/201 +68 201 0.338308458 1/3 23/68 68/201 1/2 1/4 3/8 5/16 3/10 34/100 68/201 +71 201 0.353233831 1/3 6/17 71/201 1/2 1/4 3/8 6/16 4/10 35/100 71/201 +74 201 0.368159204 3/8 7/19 74/201 1/2 1/4 3/8 6/16 4/10 37/100 74/201 +77 201 0.383084577 3/8 18/47 77/201 1/2 2/4 3/8 6/16 4/10 38/100 77/201 +80 201 0.39800995 2/5 39/98 80/201 1/2 2/4 3/8 6/16 4/10 40/100 80/201 +83 201 0.412935323 2/5 19/46 83/201 1/2 2/4 3/8 7/16 4/10 41/100 83/201 +86 201 0.427860697 3/7 3/7 86/201 1/2 2/4 3/8 7/16 4/10 43/100 86/201 +89 201 0.44278607 4/9 31/70 89/201 1/2 2/4 4/8 7/16 4/10 44/100 89/201 +92 201 0.457711443 1/2 27/59 92/201 1/2 2/4 4/8 7/16 5/10 46/100 92/201 +95 201 0.472636816 1/2 26/55 95/201 1/2 2/4 4/8 8/16 5/10 47/100 95/201 +98 201 0.487562189 1/2 39/80 98/201 1/2 2/4 4/8 8/16 5/10 49/100 98/201 +101 201 0.502487562 1/2 1/2 101/201 1/2 2/4 4/8 8/16 5/10 50/100 101/201 +104 201 0.517412935 1/2 15/29 104/201 1/2 2/4 4/8 8/16 5/10 52/100 104/201 +107 201 0.532338308 1/2 33/62 107/201 1/2 2/4 4/8 9/16 5/10 53/100 107/201 +110 201 0.547263682 5/9 29/53 110/201 1/2 2/4 4/8 9/16 5/10 55/100 110/201 +113 201 0.562189055 5/9 9/16 113/201 1/2 2/4 4/8 9/16 6/10 56/100 113/201 +116 201 0.577114428 4/7 15/26 116/201 1/2 2/4 5/8 9/16 6/10 58/100 116/201 +119 201 0.592039801 3/5 45/76 119/201 1/2 2/4 5/8 9/16 6/10 59/100 119/201 +122 201 0.606965174 3/5 17/28 122/201 1/2 2/4 5/8 10/16 6/10 61/100 122/201 +125 201 0.621890547 5/8 51/82 125/201 1/2 2/4 5/8 10/16 6/10 62/100 125/201 +128 201 0.63681592 2/3 7/11 128/201 1/2 3/4 5/8 10/16 6/10 64/100 128/201 +131 201 0.651741294 2/3 58/89 131/201 1/2 3/4 5/8 10/16 7/10 65/100 131/201 +134 201 0.666666667 2/3 2/3 2/3 1/2 3/4 5/8 11/16 7/10 67/100 2/3 +137 201 0.68159204 2/3 15/22 137/201 1/2 3/4 5/8 11/16 7/10 68/100 137/201 +140 201 0.696517413 2/3 39/56 140/201 1/2 3/4 6/8 11/16 7/10 70/100 140/201 +143 201 0.711442786 5/7 37/52 143/201 1/2 3/4 6/8 11/16 7/10 71/100 143/201 +146 201 0.726368159 5/7 69/95 146/201 1/2 3/4 6/8 12/16 7/10 73/100 146/201 +149 201 0.741293532 3/4 43/58 149/201 1/2 3/4 6/8 12/16 7/10 74/100 149/201 +152 201 0.756218905 3/4 31/41 152/201 1 3/4 6/8 12/16 8/10 76/100 152/201 +155 201 0.771144279 7/9 64/83 155/201 1 3/4 6/8 12/16 8/10 77/100 155/201 +158 201 0.786069652 4/5 11/14 158/201 1 3/4 6/8 13/16 8/10 79/100 158/201 +161 201 0.800995025 4/5 4/5 161/201 1 3/4 6/8 13/16 8/10 80/100 161/201 +164 201 0.815920398 4/5 31/38 164/201 1 3/4 7/8 13/16 8/10 82/100 164/201 +167 201 0.830845771 5/6 54/65 167/201 1 3/4 7/8 13/16 8/10 83/100 167/201 +170 201 0.845771144 5/6 11/13 170/201 1 3/4 7/8 14/16 8/10 85/100 170/201 +173 201 0.860696517 6/7 68/79 173/201 1 3/4 7/8 14/16 9/10 86/100 173/201 +176 201 0.875621891 7/8 7/8 176/201 1 1 7/8 14/16 9/10 88/100 176/201 +179 201 0.890547264 8/9 57/64 179/201 1 1 7/8 14/16 9/10 89/100 179/201 +182 201 0.905472637 1 67/74 182/201 1 1 7/8 14/16 9/10 91/100 182/201 +185 201 0.92039801 1 81/88 185/201 1 1 7/8 15/16 9/10 92/100 185/201 +188 201 0.935323383 1 29/31 188/201 1 1 7/8 15/16 9/10 94/100 188/201 +191 201 0.950248756 1 19/20 191/201 1 1 1 15/16 1 95/100 191/201 +194 201 0.965174129 1 83/86 194/201 1 1 1 15/16 1 97/100 194/201 +197 201 0.980099502 1 49/50 197/201 1 1 1 1 1 98/100 197/201 +200 201 0.995024876 1 1 200/201 1 1 1 1 1 1 200/201 +203 201 1.009950249 1 1 1 2/201 1 1 1 1 1 1 1/100 1 2/201 +206 201 1.024875622 1 1 1/40 1 5/201 1 1 1 1 1 1 2/100 1 5/201 +209 201 1.039800995 1 1 1/25 1 8/201 1 1 1 1 1/16 1 1 4/100 1 8/201 +212 201 1.054726368 1 1 4/73 1 11/201 1 1 1 1 1/16 1 1/10 1 5/100 1 11/201 +215 201 1.069651741 1 1 3/43 1 14/201 1 1 1 1/8 1 1/16 1 1/10 1 7/100 1 14/201 +218 201 1.084577114 1 1 6/71 1 17/201 1 1 1 1/8 1 1/16 1 1/10 1 8/100 1 17/201 +221 201 1.099502488 1 1 1/10 1 20/201 1 1 1 1/8 1 2/16 1 1/10 1 10/100 1 20/201 +224 201 1.114427861 1 1/9 1 4/35 1 23/201 1 1 1 1/8 1 2/16 1 1/10 1 11/100 1 23/201 +227 201 1.129353234 1 1/8 1 11/85 1 26/201 1 1 1/4 1 1/8 1 2/16 1 1/10 1 13/100 1 26/201 +230 201 1.144278607 1 1/7 1 14/97 1 29/201 1 1 1/4 1 1/8 1 2/16 1 1/10 1 14/100 1 29/201 +233 201 1.15920398 1 1/6 1 7/44 1 32/201 1 1 1/4 1 1/8 1 3/16 1 2/10 1 16/100 1 32/201 +236 201 1.174129353 1 1/6 1 4/23 1 35/201 1 1 1/4 1 1/8 1 3/16 1 2/10 1 17/100 1 35/201 +239 201 1.189054726 1 1/5 1 7/37 1 38/201 1 1 1/4 1 2/8 1 3/16 1 2/10 1 19/100 1 38/201 +242 201 1.2039801 1 1/5 1 10/49 1 41/201 1 1 1/4 1 2/8 1 3/16 1 2/10 1 20/100 1 41/201 +245 201 1.218905473 1 2/9 1 7/32 1 44/201 1 1 1/4 1 2/8 1 4/16 1 2/10 1 22/100 1 44/201 +248 201 1.233830846 1 1/4 1 18/77 1 47/201 1 1 1/4 1 2/8 1 4/16 1 2/10 1 23/100 1 47/201 +251 201 1.248756219 1 1/4 1 1/4 1 50/201 1 1 1/4 1 2/8 1 4/16 1 2/10 1 25/100 1 50/201 +254 201 1.263681592 1 1/4 1 24/91 1 53/201 1 1/2 1 1/4 1 2/8 1 4/16 1 3/10 1 26/100 1 53/201 + + + + + + + + + + + + + + + + + + + diff --git a/test-data/spreadsheet/SampleSS.xml b/test-data/spreadsheet/SampleSS.xml index 45cd58cec1..1c6de1466a 100644 --- a/test-data/spreadsheet/SampleSS.xml +++ b/test-data/spreadsheet/SampleSS.xml @@ -1,142 +1,142 @@ - - - - - Sample Spreadsheet - Spreadsheet for testing - Nick Burch - Testing Sample Formulas - This is a sample spreadsheet, for use when testing things - Nick Burch - 2008-01-04T11:51:36Z - 2008-01-04T11:56:04Z - 14.00 - - - - - - 5580 - 11295 - 360 - 60 - 1 - False - False - - - - - - - - - - Test spreadsheet - - - 2nd row - 2nd row 2nd column - - - This one is red - -
- - -
-