From 90170942312c0262025f7f2af598faa642533259 Mon Sep 17 00:00:00 2001 From: Yegor Kozlov Date: Mon, 10 May 2010 16:11:50 +0000 Subject: [PATCH] Enhanced SViewer to support most border types, cell formats, and conditional formatting. Added ToHtml example that converts a spreadsheet into HTML, See Bugzilla #49066 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@942809 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 5 + src/documentation/content/xdocs/status.xml | 1 + .../org/apache/poi/hssf}/view/SVBorder.java | 2 +- .../poi/hssf}/view/SVFractionalFormat.java | 2 +- .../apache/poi/hssf}/view/SVRowHeader.java | 2 +- .../apache/poi/hssf/view/SVSheetTable.java | 241 ++++ .../poi/hssf}/view/SVTableCellEditor.java | 2 +- .../poi/hssf}/view/SVTableCellRenderer.java | 2 +- .../apache/poi/hssf}/view/SVTableModel.java | 2 +- .../apache/poi/hssf}/view/SVTableUtils.java | 2 +- .../org/apache/poi/hssf}/view/SViewer.java | 2 +- .../apache/poi/hssf}/view/SViewerPanel.java | 2 +- .../poi/hssf/view/brush/BasicBrush.java | 72 ++ .../org/apache/poi/hssf/view/brush/Brush.java | 14 + .../poi/hssf/view/brush/DoubleStroke.java | 62 + .../poi/hssf/view/brush/PendingPaintings.java | 178 +++ .../apache/poi/hssf/view/brush/package.html | 4 + .../poi/ss/examples/html/HSSFHtmlHelper.java | 66 + .../poi/ss/examples/html/HtmlHelper.java | 23 + .../apache/poi/ss/examples/html/ToHtml.java | 443 +++++++ .../poi/ss/examples/html/XSSFHtmlHelper.java | 64 + .../poi/ss/examples/html/excelStyle.css | 54 + .../apache/poi/ss/examples/html/package.html | 2 + .../poi/ss/format/CellDateFormatter.java | 213 ++++ .../poi/ss/format/CellElapsedFormatter.java | 215 ++++ .../org/apache/poi/ss/format/CellFormat.java | 313 +++++ .../poi/ss/format/CellFormatCondition.java | 121 ++ .../apache/poi/ss/format/CellFormatPart.java | 494 ++++++++ .../poi/ss/format/CellFormatResult.java | 58 + .../apache/poi/ss/format/CellFormatType.java | 74 ++ .../apache/poi/ss/format/CellFormatter.java | 102 ++ .../poi/ss/format/CellGeneralFormatter.java | 84 ++ .../poi/ss/format/CellNumberFormatter.java | 1085 +++++++++++++++++ .../poi/ss/format/CellTextFormatter.java | 79 ++ .../org/apache/poi/ss/format/package.html | 3 + .../poi/ss/format/TestCellFormatPart.java | 126 ++ .../poi/ss/format/CellFormatTestBase.java | 293 +++++ .../apache/poi/ss/format/TestCellFormat.java | 32 + .../ss/format/TestCellFormatCondition.java | 64 + test-data/spreadsheet/DateFormatTests.xlsx | Bin 0 -> 45480 bytes test-data/spreadsheet/ElapsedFormatTests.xlsx | Bin 0 -> 36062 bytes test-data/spreadsheet/FormatChoiceTests.xls | Bin 0 -> 32768 bytes test-data/spreadsheet/FormatChoiceTests.xlsx | Bin 0 -> 46589 bytes .../spreadsheet/FormatConditionTests.xlsx | Bin 0 -> 45923 bytes test-data/spreadsheet/GeneralFormatTests.xlsx | Bin 0 -> 36134 bytes .../spreadsheet/NumberFormatApproxTests.xlsx | Bin 0 -> 58079 bytes test-data/spreadsheet/NumberFormatTests.xlsx | Bin 0 -> 52961 bytes test-data/spreadsheet/TextFormatTests.xlsx | Bin 0 -> 47360 bytes 48 files changed, 4594 insertions(+), 9 deletions(-) rename src/{contrib/src/org/apache/poi/hssf/contrib => examples/src/org/apache/poi/hssf}/view/SVBorder.java (99%) rename src/{contrib/src/org/apache/poi/hssf/contrib => examples/src/org/apache/poi/hssf}/view/SVFractionalFormat.java (99%) rename src/{contrib/src/org/apache/poi/hssf/contrib => examples/src/org/apache/poi/hssf}/view/SVRowHeader.java (98%) create mode 100644 src/examples/src/org/apache/poi/hssf/view/SVSheetTable.java rename src/{contrib/src/org/apache/poi/hssf/contrib => examples/src/org/apache/poi/hssf}/view/SVTableCellEditor.java (99%) rename src/{contrib/src/org/apache/poi/hssf/contrib => examples/src/org/apache/poi/hssf}/view/SVTableCellRenderer.java (99%) rename src/{contrib/src/org/apache/poi/hssf/contrib => examples/src/org/apache/poi/hssf}/view/SVTableModel.java (98%) rename src/{contrib/src/org/apache/poi/hssf/contrib => examples/src/org/apache/poi/hssf}/view/SVTableUtils.java (98%) rename src/{contrib/src/org/apache/poi/hssf/contrib => examples/src/org/apache/poi/hssf}/view/SViewer.java (99%) rename src/{contrib/src/org/apache/poi/hssf/contrib => examples/src/org/apache/poi/hssf}/view/SViewerPanel.java (99%) create mode 100644 src/examples/src/org/apache/poi/hssf/view/brush/BasicBrush.java create mode 100644 src/examples/src/org/apache/poi/hssf/view/brush/Brush.java create mode 100644 src/examples/src/org/apache/poi/hssf/view/brush/DoubleStroke.java create mode 100644 src/examples/src/org/apache/poi/hssf/view/brush/PendingPaintings.java create mode 100644 src/examples/src/org/apache/poi/hssf/view/brush/package.html create mode 100644 src/examples/src/org/apache/poi/ss/examples/html/HSSFHtmlHelper.java create mode 100644 src/examples/src/org/apache/poi/ss/examples/html/HtmlHelper.java create mode 100644 src/examples/src/org/apache/poi/ss/examples/html/ToHtml.java create mode 100644 src/examples/src/org/apache/poi/ss/examples/html/XSSFHtmlHelper.java create mode 100644 src/examples/src/org/apache/poi/ss/examples/html/excelStyle.css create mode 100644 src/examples/src/org/apache/poi/ss/examples/html/package.html create mode 100644 src/java/org/apache/poi/ss/format/CellDateFormatter.java create mode 100644 src/java/org/apache/poi/ss/format/CellElapsedFormatter.java create mode 100644 src/java/org/apache/poi/ss/format/CellFormat.java create mode 100644 src/java/org/apache/poi/ss/format/CellFormatCondition.java create mode 100644 src/java/org/apache/poi/ss/format/CellFormatPart.java create mode 100644 src/java/org/apache/poi/ss/format/CellFormatResult.java create mode 100644 src/java/org/apache/poi/ss/format/CellFormatType.java create mode 100644 src/java/org/apache/poi/ss/format/CellFormatter.java create mode 100644 src/java/org/apache/poi/ss/format/CellGeneralFormatter.java create mode 100644 src/java/org/apache/poi/ss/format/CellNumberFormatter.java create mode 100644 src/java/org/apache/poi/ss/format/CellTextFormatter.java create mode 100644 src/java/org/apache/poi/ss/format/package.html create mode 100644 src/ooxml/testcases/org/apache/poi/ss/format/TestCellFormatPart.java create mode 100644 src/testcases/org/apache/poi/ss/format/CellFormatTestBase.java create mode 100644 src/testcases/org/apache/poi/ss/format/TestCellFormat.java create mode 100644 src/testcases/org/apache/poi/ss/format/TestCellFormatCondition.java create mode 100644 test-data/spreadsheet/DateFormatTests.xlsx create mode 100644 test-data/spreadsheet/ElapsedFormatTests.xlsx create mode 100644 test-data/spreadsheet/FormatChoiceTests.xls create mode 100644 test-data/spreadsheet/FormatChoiceTests.xlsx create mode 100644 test-data/spreadsheet/FormatConditionTests.xlsx create mode 100644 test-data/spreadsheet/GeneralFormatTests.xlsx create mode 100644 test-data/spreadsheet/NumberFormatApproxTests.xlsx create mode 100644 test-data/spreadsheet/NumberFormatTests.xlsx create mode 100644 test-data/spreadsheet/TextFormatTests.xlsx diff --git a/build.xml b/build.xml index 83bffa9d26..df0dfb674f 100644 --- a/build.xml +++ b/build.xml @@ -504,6 +504,11 @@ under the License. + + + + + diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 6d8c5e58c3..4a86cee548 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 49066 - Worksheet/cell formatting, with view and HTML converter 49020 - Workaround Excel outputting invalid XML in button definitions by not closing BR tags 49050 - Improve performance of AbstractEscherHolderRecord when there are lots of Continue Records 49194 - Correct text size limit for OOXML .xlsx files diff --git a/src/contrib/src/org/apache/poi/hssf/contrib/view/SVBorder.java b/src/examples/src/org/apache/poi/hssf/view/SVBorder.java similarity index 99% rename from src/contrib/src/org/apache/poi/hssf/contrib/view/SVBorder.java rename to src/examples/src/org/apache/poi/hssf/view/SVBorder.java index fb25448cb5..083b9cc18e 100644 --- a/src/contrib/src/org/apache/poi/hssf/contrib/view/SVBorder.java +++ b/src/examples/src/org/apache/poi/hssf/view/SVBorder.java @@ -16,7 +16,7 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hssf.contrib.view; +package org.apache.poi.hssf.view; import java.awt.*; diff --git a/src/contrib/src/org/apache/poi/hssf/contrib/view/SVFractionalFormat.java b/src/examples/src/org/apache/poi/hssf/view/SVFractionalFormat.java similarity index 99% rename from src/contrib/src/org/apache/poi/hssf/contrib/view/SVFractionalFormat.java rename to src/examples/src/org/apache/poi/hssf/view/SVFractionalFormat.java index 5512a73a71..cd6ff6ea72 100644 --- a/src/contrib/src/org/apache/poi/hssf/contrib/view/SVFractionalFormat.java +++ b/src/examples/src/org/apache/poi/hssf/view/SVFractionalFormat.java @@ -17,7 +17,7 @@ ==================================================================== */ -package org.apache.poi.hssf.contrib.view; +package org.apache.poi.hssf.view; import java.text.*; diff --git a/src/contrib/src/org/apache/poi/hssf/contrib/view/SVRowHeader.java b/src/examples/src/org/apache/poi/hssf/view/SVRowHeader.java similarity index 98% rename from src/contrib/src/org/apache/poi/hssf/contrib/view/SVRowHeader.java rename to src/examples/src/org/apache/poi/hssf/view/SVRowHeader.java index fe63dfcc8a..c6db2f71a4 100644 --- a/src/contrib/src/org/apache/poi/hssf/contrib/view/SVRowHeader.java +++ b/src/examples/src/org/apache/poi/hssf/view/SVRowHeader.java @@ -18,7 +18,7 @@ -package org.apache.poi.hssf.contrib.view; +package org.apache.poi.hssf.view; import java.awt.*; import javax.swing.*; diff --git a/src/examples/src/org/apache/poi/hssf/view/SVSheetTable.java b/src/examples/src/org/apache/poi/hssf/view/SVSheetTable.java new file mode 100644 index 0000000000..ed2fd8fb6d --- /dev/null +++ b/src/examples/src/org/apache/poi/hssf/view/SVSheetTable.java @@ -0,0 +1,241 @@ +/* ==================================================================== + 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.hssf.view; + +import org.apache.poi.hssf.view.brush.PendingPaintings; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; + +import javax.swing.*; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.table.*; +import javax.swing.text.JTextComponent; +import java.awt.*; +import java.awt.event.HierarchyEvent; +import java.awt.event.HierarchyListener; + +/** + * This class is a table that represents the values in a single worksheet. + * + * @author Ken Arnold, Industrious Media LLC + */ +public class SVSheetTable extends JTable { + private final HSSFSheet sheet; + private final PendingPaintings pendingPaintings; + private FormulaDisplayListener formulaListener; + private JScrollPane scroll; + + private static final Color HEADER_BACKGROUND = new Color(235, 235, 235); + + /** + * This field is the magic number to convert from a Character width to a java + * pixel width. + *

+ * When the "normal" font size in a workbook changes, this effects all of the + * heights and widths. Unfortunately there is no way to retrieve this + * information, hence the MAGIC number. + *

+ * This number may only work for the normal style font size of Arial size 10. + */ + private static final int magicCharFactor = 7; + + private class HeaderCell extends JLabel { + private final int row; + + public HeaderCell(Object value, int row) { + super(value.toString(), CENTER); + this.row = row; + setBackground(HEADER_BACKGROUND); + setOpaque(true); + setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY)); + setRowSelectionAllowed(false); + } + + @Override + public Dimension getPreferredSize() { + Dimension d = super.getPreferredSize(); + if (row >= 0) { + d.height = getRowHeight(row); + } + return d; + } + + @Override + public Dimension getMaximumSize() { + Dimension d = super.getMaximumSize(); + if (row >= 0) { + d.height = getRowHeight(row); + } + return d; + } + + @Override + public Dimension getMinimumSize() { + Dimension d = super.getMinimumSize(); + if (row >= 0) { + d.height = getRowHeight(row); + } + return d; + } + } + + private class HeaderCellRenderer implements TableCellRenderer { + public Component getTableCellRendererComponent(JTable table, Object value, + boolean isSelected, boolean hasFocus, int row, int column) { + + return new HeaderCell(value, row); + } + } + + private class FormulaDisplayListener implements ListSelectionListener { + private final JTextComponent formulaDisplay; + + public FormulaDisplayListener(JTextComponent formulaDisplay) { + this.formulaDisplay = formulaDisplay; + } + + public void valueChanged(ListSelectionEvent e) { + int row = getSelectedRow(); + int col = getSelectedColumn(); + if (row < 0 || col < 0) { + return; + } + + if (e.getValueIsAdjusting()) { + return; + } + + HSSFCell cell = (HSSFCell) getValueAt(row, col); + String formula = ""; + if (cell != null) { + if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) { + formula = cell.getCellFormula(); + } else { + formula = cell.toString(); + } + if (formula == null) + formula = ""; + } + formulaDisplay.setText(formula); + } + } + + public SVSheetTable(HSSFSheet sheet) { + super(new SVTableModel(sheet)); + this.sheet = sheet; + + setIntercellSpacing(new Dimension(0, 0)); + setAutoResizeMode(AUTO_RESIZE_OFF); + JTableHeader header = getTableHeader(); + header.setDefaultRenderer(new HeaderCellRenderer()); + pendingPaintings = new PendingPaintings(this); + + //Set the columns the correct size + TableColumnModel columns = getColumnModel(); + for (int i = 0; i < columns.getColumnCount(); i++) { + TableColumn column = columns.getColumn(i); + int width = sheet.getColumnWidth(i); + //256 is because the width is in 256ths of a character + column.setPreferredWidth(width / 256 * magicCharFactor); + } + + Toolkit t = getToolkit(); + int res = t.getScreenResolution(); + TableModel model = getModel(); + for (int i = 0; i < model.getRowCount(); i++) { + Row row = sheet.getRow(i - sheet.getFirstRowNum()); + if (row != null) { + short h = row.getHeight(); + int height = Math.round(Math.max(1, h / (res / 70 * 20) + 3)); + System.out.printf("%d: %d (%d @ %d)%n", i, height, h, res); + setRowHeight(i, height); + } + } + + addHierarchyListener(new HierarchyListener() { + public void hierarchyChanged(HierarchyEvent e) { + if ((e.getChangeFlags() & HierarchyEvent.PARENT_CHANGED) != 0) { + Container changedParent = e.getChangedParent(); + if (changedParent instanceof JViewport) { + Container grandparent = changedParent.getParent(); + if (grandparent instanceof JScrollPane) { + JScrollPane jScrollPane = (JScrollPane) grandparent; + setupScroll(jScrollPane); + } + } + } + } + }); + } + + public void setupScroll(JScrollPane scroll) { + if (scroll == this.scroll) + return; + + this.scroll = scroll; + if (scroll == null) + return; + + SVRowHeader rowHeader = new SVRowHeader(sheet, this, 0); + scroll.setRowHeaderView(rowHeader); + scroll.setCorner(JScrollPane.UPPER_LEADING_CORNER, headerCell("?")); + } + + public void setFormulaDisplay(JTextComponent formulaDisplay) { + ListSelectionModel rowSelMod = getSelectionModel(); + ListSelectionModel colSelMod = getColumnModel().getSelectionModel(); + + if (formulaDisplay == null) { + rowSelMod.removeListSelectionListener(formulaListener); + colSelMod.removeListSelectionListener(formulaListener); + formulaListener = null; + } + + if (formulaDisplay != null) { + formulaListener = new FormulaDisplayListener(formulaDisplay); + rowSelMod.addListSelectionListener(formulaListener); + colSelMod.addListSelectionListener(formulaListener); + } + } + + public JTextComponent getFormulaDisplay() { + if (formulaListener == null) + return null; + else + return formulaListener.formulaDisplay; + } + + public Component headerCell(String text) { + return new HeaderCell(text, -1); + } + + @Override + public void paintComponent(Graphics g1) { + Graphics2D g = (Graphics2D) g1; + + pendingPaintings.clear(); + + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + super.paintComponent(g); + + pendingPaintings.paint(g); + } +} \ No newline at end of file diff --git a/src/contrib/src/org/apache/poi/hssf/contrib/view/SVTableCellEditor.java b/src/examples/src/org/apache/poi/hssf/view/SVTableCellEditor.java similarity index 99% rename from src/contrib/src/org/apache/poi/hssf/contrib/view/SVTableCellEditor.java rename to src/examples/src/org/apache/poi/hssf/view/SVTableCellEditor.java index e7a2a5ded3..4fd79a9620 100644 --- a/src/contrib/src/org/apache/poi/hssf/contrib/view/SVTableCellEditor.java +++ b/src/examples/src/org/apache/poi/hssf/view/SVTableCellEditor.java @@ -16,7 +16,7 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hssf.contrib.view; +package org.apache.poi.hssf.view; import java.awt.*; import java.awt.event.*; diff --git a/src/contrib/src/org/apache/poi/hssf/contrib/view/SVTableCellRenderer.java b/src/examples/src/org/apache/poi/hssf/view/SVTableCellRenderer.java similarity index 99% rename from src/contrib/src/org/apache/poi/hssf/contrib/view/SVTableCellRenderer.java rename to src/examples/src/org/apache/poi/hssf/view/SVTableCellRenderer.java index 0e4873b5de..4b2e634bb3 100644 --- a/src/contrib/src/org/apache/poi/hssf/contrib/view/SVTableCellRenderer.java +++ b/src/examples/src/org/apache/poi/hssf/view/SVTableCellRenderer.java @@ -17,7 +17,7 @@ ==================================================================== */ -package org.apache.poi.hssf.contrib.view; +package org.apache.poi.hssf.view; import javax.swing.*; import javax.swing.table.TableCellRenderer; diff --git a/src/contrib/src/org/apache/poi/hssf/contrib/view/SVTableModel.java b/src/examples/src/org/apache/poi/hssf/view/SVTableModel.java similarity index 98% rename from src/contrib/src/org/apache/poi/hssf/contrib/view/SVTableModel.java rename to src/examples/src/org/apache/poi/hssf/view/SVTableModel.java index c2f4bb31a0..170dacb697 100644 --- a/src/contrib/src/org/apache/poi/hssf/contrib/view/SVTableModel.java +++ b/src/examples/src/org/apache/poi/hssf/view/SVTableModel.java @@ -18,7 +18,7 @@ -package org.apache.poi.hssf.contrib.view; +package org.apache.poi.hssf.view; import java.util.Iterator; import javax.swing.table.*; diff --git a/src/contrib/src/org/apache/poi/hssf/contrib/view/SVTableUtils.java b/src/examples/src/org/apache/poi/hssf/view/SVTableUtils.java similarity index 98% rename from src/contrib/src/org/apache/poi/hssf/contrib/view/SVTableUtils.java rename to src/examples/src/org/apache/poi/hssf/view/SVTableUtils.java index 5815ea0a59..08ac7b32e0 100644 --- a/src/contrib/src/org/apache/poi/hssf/contrib/view/SVTableUtils.java +++ b/src/examples/src/org/apache/poi/hssf/view/SVTableUtils.java @@ -16,7 +16,7 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hssf.contrib.view; +package org.apache.poi.hssf.view; import java.util.*; import java.awt.*; diff --git a/src/contrib/src/org/apache/poi/hssf/contrib/view/SViewer.java b/src/examples/src/org/apache/poi/hssf/view/SViewer.java similarity index 99% rename from src/contrib/src/org/apache/poi/hssf/contrib/view/SViewer.java rename to src/examples/src/org/apache/poi/hssf/view/SViewer.java index a3668f6490..de2cfb1f6d 100644 --- a/src/contrib/src/org/apache/poi/hssf/contrib/view/SViewer.java +++ b/src/examples/src/org/apache/poi/hssf/view/SViewer.java @@ -18,7 +18,7 @@ -package org.apache.poi.hssf.contrib.view; +package org.apache.poi.hssf.view; import java.awt.*; import java.awt.event.*; diff --git a/src/contrib/src/org/apache/poi/hssf/contrib/view/SViewerPanel.java b/src/examples/src/org/apache/poi/hssf/view/SViewerPanel.java similarity index 99% rename from src/contrib/src/org/apache/poi/hssf/contrib/view/SViewerPanel.java rename to src/examples/src/org/apache/poi/hssf/view/SViewerPanel.java index f4695376d0..5fe596220a 100644 --- a/src/contrib/src/org/apache/poi/hssf/contrib/view/SViewerPanel.java +++ b/src/examples/src/org/apache/poi/hssf/view/SViewerPanel.java @@ -15,7 +15,7 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hssf.contrib.view; +package org.apache.poi.hssf.view; import java.awt.*; import java.awt.event.*; diff --git a/src/examples/src/org/apache/poi/hssf/view/brush/BasicBrush.java b/src/examples/src/org/apache/poi/hssf/view/brush/BasicBrush.java new file mode 100644 index 0000000000..db36b83265 --- /dev/null +++ b/src/examples/src/org/apache/poi/hssf/view/brush/BasicBrush.java @@ -0,0 +1,72 @@ +/* ==================================================================== + 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.hssf.view.brush; + +import java.awt.*; + +/** + * This is a basic brush that just draws the line with the given parameters. + * This is a {@link BasicStroke} object that can be used as a {@link Brush}. + * + * @author Ken Arnold, Industrious Media LLC + * @see BasicStroke + */ +public class BasicBrush extends BasicStroke implements Brush { + /** + * Creates a new basic brush with the given width. Invokes {@link + * BasicStroke#BasicStroke(float)} + * + * @param width The brush width. + * + * @see BasicStroke#BasicStroke(float) + */ + public BasicBrush(float width) { + super(width); + } + + /** + * Creates a new basic brush with the given width, cap, and join. Invokes + * {@link BasicStroke#BasicStroke(float,int,int)} + * + * @param width The brush width. + * @param cap The capping style. + * @param join The join style. + * + * @see BasicStroke#BasicStroke(float, int, int) + */ + public BasicBrush(float width, int cap, int join) { + super(width, cap, join); + } + + /** + * Creates a new basic brush with the given parameters. Invokes {@link + * BasicStroke#BasicStroke(float,int,int,float,float[],float)} with a miter + * limit of 11 (the normal default value). + * + * @param width The brush width. + * @param cap The capping style. + * @param join The join style. + * @param dashes The dash intervals. + * @param dashPos The intial dash position in the dash intervals. + * + * @see BasicStroke#BasicStroke(float, int, int, float, float[], float) + */ + public BasicBrush(float width, int cap, int join, float[] dashes, + int dashPos) { + super(width, cap, join, 11.0f, dashes, dashPos); + } +} \ No newline at end of file diff --git a/src/examples/src/org/apache/poi/hssf/view/brush/Brush.java b/src/examples/src/org/apache/poi/hssf/view/brush/Brush.java new file mode 100644 index 0000000000..30786a635e --- /dev/null +++ b/src/examples/src/org/apache/poi/hssf/view/brush/Brush.java @@ -0,0 +1,14 @@ +package org.apache.poi.hssf.view.brush; + +import java.awt.*; + +/** + * This is the type you must implement to create a brush that will be used for a + * spreadsheet border. + * + * @author Ken Arnold, Industrious Media LLC + */ +public interface Brush extends Stroke { + /** Returns the width of the brush. */ + float getLineWidth(); +} \ No newline at end of file diff --git a/src/examples/src/org/apache/poi/hssf/view/brush/DoubleStroke.java b/src/examples/src/org/apache/poi/hssf/view/brush/DoubleStroke.java new file mode 100644 index 0000000000..126214b8a1 --- /dev/null +++ b/src/examples/src/org/apache/poi/hssf/view/brush/DoubleStroke.java @@ -0,0 +1,62 @@ +/* ==================================================================== + 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.hssf.view.brush; + +import java.awt.*; + +/** + * This Stroke implementation applies a BasicStroke to a shape twice. If you + * draw with this Stroke, then instead of outlining the shape, you're outlining + * the outline of the shape. + * + * @author Ken Arnold, Industrious Media LLC + */ +public class DoubleStroke implements Brush { + BasicStroke stroke1, stroke2; // the two strokes to use + + /** + * Creates a new double-stroke brush. This surrounds a cell with a two + * lines separated by white space between. + * + * @param width1 The width of the blank space in the middle + * @param width2 The width of the each of the two drawn strokes. + */ + public DoubleStroke(float width1, float width2) { + stroke1 = new BasicStroke(width1); // Constructor arguments specify + stroke2 = new BasicStroke(width2); // the line widths for the strokes + } + + /** + * Stroke the outline. + * + * @param s The shape in which to stroke. + * + * @return The created stroke as a new shape. + */ + public Shape createStrokedShape(Shape s) { + // Use the first stroke to create an outline of the shape + Shape outline = stroke1.createStrokedShape(s); + // Use the second stroke to create an outline of that outline. + // It is this outline of the outline that will be filled in + return stroke2.createStrokedShape(outline); + } + + /** {@inheritDoc} */ + public float getLineWidth() { + return stroke1.getLineWidth() + 2 * stroke2.getLineWidth(); + } +} \ No newline at end of file diff --git a/src/examples/src/org/apache/poi/hssf/view/brush/PendingPaintings.java b/src/examples/src/org/apache/poi/hssf/view/brush/PendingPaintings.java new file mode 100644 index 0000000000..3b95c05ac1 --- /dev/null +++ b/src/examples/src/org/apache/poi/hssf/view/brush/PendingPaintings.java @@ -0,0 +1,178 @@ +/* ==================================================================== + 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.hssf.view.brush; + +import javax.swing.*; +import java.awt.*; +import java.awt.geom.*; +import java.util.ArrayList; +import java.util.List; + +/** + * This class is used to hold pending brush paintings. The model is that some + * border drawing requires drawing strokes after all the cells have been + * painted. The list of pending paintings can be put in this object during the + * initial paint of the component, and then executed at the appropriate time, + * such as at the end of the containing object's {@link + * JComponent#paintChildren(Graphics)} method. + *

+ * It is up to the parent component to invoke the {@link #paint(Graphics2D)} + * method of this objet at that appropriate time. + * + * @author Ken Arnold, Industrious Media LLC + */ +public class PendingPaintings { + /** + * The name of the client property that holds this object in the parent + * component. + */ + public static final String PENDING_PAINTINGS = + PendingPaintings.class.getSimpleName(); + + private final List paintings; + + /** A single painting description. */ + public static class Painting { + final Stroke stroke; + final Color color; + final Shape shape; + final AffineTransform transform; + + /** + * Creates a new painting description. + * + * @param stroke The stroke to paint. + * @param color The color of the stroke. + * @param shape The shape of the stroke. + * @param transform The transformation matrix to use. + */ + public Painting(Stroke stroke, Color color, Shape shape, + AffineTransform transform) { + + this.color = color; + this.shape = shape; + this.stroke = stroke; + this.transform = transform; + } + + /** + * Draw the painting. + * + * @param g The graphics object to use to draw with. + */ + public void draw(Graphics2D g) { + g.setTransform(transform); + g.setStroke(stroke); + g.setColor(color); + g.draw(shape); + } + } + + /** + * Creates a new object on the given parent. The created object will be + * stored as a client property. + * + * @param parent + */ + public PendingPaintings(JComponent parent) { + paintings = new ArrayList(); + parent.putClientProperty(PENDING_PAINTINGS, this); + } + + /** Drops all pending paintings. */ + public void clear() { + paintings.clear(); + } + + /** + * Paints all pending paintings. Once they have been painted they are + * removed from the list of pending paintings (they aren't pending anymore, + * after all). + * + * @param g The graphics object to draw with. + */ + public void paint(Graphics2D g) { + g.setBackground(Color.CYAN); + AffineTransform origTransform = g.getTransform(); + for (Painting c : paintings) { + c.draw(g); + } + g.setTransform(origTransform); + + clear(); + } + + /** + * Adds a new pending painting to the list on the given component. This + * will find the first ancestor that has a {@link PendingPaintings} client + * property, starting with the component itself. + * + * @param c The component for which the painting is being added. + * @param g The graphics object to draw with. + * @param stroke The stroke to draw. + * @param color The color to draw with. + * @param shape The shape to stroke. + */ + public static void add(JComponent c, Graphics2D g, Stroke stroke, + Color color, Shape shape) { + + add(c, new Painting(stroke, color, shape, g.getTransform())); + } + + /** + * Adds a new pending painting to the list on the given component. This + * will find the first ancestor that has a {@link PendingPaintings} client + * property, starting with the component itself. + * + * @param c The component for which the painting is being added. + * @param newPainting The new painting. + */ + public static void add(JComponent c, Painting newPainting) { + PendingPaintings pending = pendingPaintingsFor(c); + if (pending != null) { + pending.paintings.add(newPainting); + } + } + + /** + * Returns the pending painting object for the given component, if any. This + * is retrieved from the first object found that has a {@link + * #PENDING_PAINTINGS} client property, starting with this component and + * looking up its ancestors (parent, parent's parent, etc.) + *

+ * This allows any descendant of a component that has a {@link + * PendingPaintings} property to add its own pending paintings. + * + * @param c The component for which the painting is being added. + * + * @return The pending painting object for that component, or null + * if there is none. + */ + public static PendingPaintings pendingPaintingsFor(JComponent c) { + for (Component parent = c; + parent != null; + parent = parent.getParent()) { + if (parent instanceof JComponent) { + JComponent jc = (JComponent) parent; + Object pd = jc.getClientProperty(PENDING_PAINTINGS); + if (pd != null) + return (PendingPaintings) pd; + } + } + return null; + } +} \ No newline at end of file diff --git a/src/examples/src/org/apache/poi/hssf/view/brush/package.html b/src/examples/src/org/apache/poi/hssf/view/brush/package.html new file mode 100644 index 0000000000..dc4b833a66 --- /dev/null +++ b/src/examples/src/org/apache/poi/hssf/view/brush/package.html @@ -0,0 +1,4 @@ +This package contains some brushes that are used when drawing borders for Excel +cells. + +@author Ken Arnold, Industrious Media LLC \ No newline at end of file diff --git a/src/examples/src/org/apache/poi/ss/examples/html/HSSFHtmlHelper.java b/src/examples/src/org/apache/poi/ss/examples/html/HSSFHtmlHelper.java new file mode 100644 index 0000000000..1e235f929e --- /dev/null +++ b/src/examples/src/org/apache/poi/ss/examples/html/HSSFHtmlHelper.java @@ -0,0 +1,66 @@ +/* ==================================================================== + 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.ss.examples.html; + +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFPalette; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.ss.usermodel.CellStyle; + +import java.util.Formatter; + +/** + * Implementation of {@link HtmlHelper} for HSSF files. + * + * @author Ken Arnold, Industrious Media LLC + */ +public class HSSFHtmlHelper implements HtmlHelper { + private final HSSFWorkbook wb; + private final HSSFPalette colors; + + private static final HSSFColor HSSF_AUTO = new HSSFColor.AUTOMATIC(); + + public HSSFHtmlHelper(HSSFWorkbook wb) { + this.wb = wb; + // If there is no custom palette, then this creates a new one that is + // a copy of the default + colors = wb.getCustomPalette(); + } + + public void colorStyles(CellStyle style, Formatter out) { + HSSFCellStyle cs = (HSSFCellStyle) style; + out.format(" /* fill pattern = %d */%n", cs.getFillPattern()); + styleColor(out, "background-color", cs.getFillForegroundColor()); + styleColor(out, "color", cs.getFont(wb).getColor()); + styleColor(out, "border-left-color", cs.getLeftBorderColor()); + styleColor(out, "border-right-color", cs.getRightBorderColor()); + styleColor(out, "border-top-color", cs.getTopBorderColor()); + styleColor(out, "border-bottom-color", cs.getBottomBorderColor()); + } + + private void styleColor(Formatter out, String attr, short index) { + HSSFColor color = colors.getColor(index); + if (index == HSSF_AUTO.getIndex() || color == null) { + out.format(" /* %s: index = %d */%n", attr, index); + } else { + short[] rgb = color.getTriplet(); + out.format(" %s: #%02x%02x%02x; /* index = %d */%n", attr, rgb[0], + rgb[1], rgb[2], index); + } + } +} \ No newline at end of file diff --git a/src/examples/src/org/apache/poi/ss/examples/html/HtmlHelper.java b/src/examples/src/org/apache/poi/ss/examples/html/HtmlHelper.java new file mode 100644 index 0000000000..1d4c2a5b74 --- /dev/null +++ b/src/examples/src/org/apache/poi/ss/examples/html/HtmlHelper.java @@ -0,0 +1,23 @@ +package org.apache.poi.ss.examples.html; + +import org.apache.poi.ss.usermodel.CellStyle; + +import java.util.Formatter; + +/** + * This interface is used where code wants to be independent of the workbook + * formats. If you are writing such code, you can add a method to this + * interface, and then implement it for both HSSF and XSSF workbooks, letting + * the driving code stay independent of format. + * + * @author Ken Arnold, Industrious Media LLC + */ +public interface HtmlHelper { + /** + * Outputs the appropriate CSS style for the given cell style. + * + * @param style The cell style. + * @param out The place to write the output. + */ + void colorStyles(CellStyle style, Formatter out); +} \ No newline at end of file diff --git a/src/examples/src/org/apache/poi/ss/examples/html/ToHtml.java b/src/examples/src/org/apache/poi/ss/examples/html/ToHtml.java new file mode 100644 index 0000000000..b5480cf59e --- /dev/null +++ b/src/examples/src/org/apache/poi/ss/examples/html/ToHtml.java @@ -0,0 +1,443 @@ +/* ==================================================================== + 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.ss.examples.html; + +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFFont; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.format.CellFormat; +import org.apache.poi.ss.format.CellFormatResult; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.io.BufferedReader; +import java.io.Closeable; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.util.Formatter; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import static org.apache.poi.ss.usermodel.CellStyle.*; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; + +/** + * This example shows how to display a spreadsheet in HTML using the classes for + * spreadsheet display. + * + * @author Ken Arnold, Industrious Media LLC + */ +public class ToHtml { + private final Workbook wb; + private final Appendable output; + private boolean completeHTML; + private Formatter out; + private boolean gotBounds; + private int firstColumn; + private int endColumn; + private HtmlHelper helper; + + private static final String DEFAULTS_CLASS = "excelDefaults"; + private static final String COL_HEAD_CLASS = "colHeader"; + private static final String ROW_HEAD_CLASS = "rowHeader"; + + private static final Map ALIGN = mapFor(ALIGN_LEFT, "left", + ALIGN_CENTER, "center", ALIGN_RIGHT, "right", ALIGN_FILL, "left", + ALIGN_JUSTIFY, "left", ALIGN_CENTER_SELECTION, "center"); + + private static final Map VERTICAL_ALIGN = mapFor( + VERTICAL_BOTTOM, "bottom", VERTICAL_CENTER, "middle", VERTICAL_TOP, + "top"); + + private static final Map BORDER = mapFor(BORDER_DASH_DOT, + "dashed 1pt", BORDER_DASH_DOT_DOT, "dashed 1pt", BORDER_DASHED, + "dashed 1pt", BORDER_DOTTED, "dotted 1pt", BORDER_DOUBLE, + "double 3pt", BORDER_HAIR, "solid 1px", BORDER_MEDIUM, "solid 2pt", + BORDER_MEDIUM_DASH_DOT, "dashed 2pt", BORDER_MEDIUM_DASH_DOT_DOT, + "dashed 2pt", BORDER_MEDIUM_DASHED, "dashed 2pt", BORDER_NONE, + "none", BORDER_SLANTED_DASH_DOT, "dashed 2pt", BORDER_THICK, + "solid 3pt", BORDER_THIN, "dashed 1pt"); + + @SuppressWarnings({"unchecked"}) + private static Map mapFor(Object... mapping) { + Map map = new HashMap(); + for (int i = 0; i < mapping.length; i += 2) { + map.put((K) mapping[i], (V) mapping[i + 1]); + } + return map; + } + + /** + * Creates a new converter to HTML for the given workbook. + * + * @param wb The workbook. + * @param output Where the HTML output will be written. + * + * @return An object for converting the workbook to HTML. + */ + public static ToHtml create(Workbook wb, Appendable output) { + return new ToHtml(wb, output); + } + + /** + * Creates a new converter to HTML for the given workbook. If the path ends + * with ".xlsx" an {@link XSSFWorkbook} will be used; otherwise + * this will use an {@link HSSFWorkbook}. + * + * @param path The file that has the workbook. + * @param output Where the HTML output will be written. + * + * @return An object for converting the workbook to HTML. + */ + public static ToHtml create(String path, Appendable output) + throws IOException { + return create(new FileInputStream(path), output); + } + + /** + * Creates a new converter to HTML for the given workbook. This attempts to + * detect whether the input is XML (so it should create an {@link + * XSSFWorkbook} or not (so it should create an {@link HSSFWorkbook}). + * + * @param in The input stream that has the workbook. + * @param output Where the HTML output will be written. + * + * @return An object for converting the workbook to HTML. + */ + public static ToHtml create(InputStream in, Appendable output) + throws IOException { + try { + Workbook wb = WorkbookFactory.create(in); + return create(wb, output); + } catch (InvalidFormatException e){ + throw new IllegalArgumentException("Cannot create workbook from stream", e); + } + } + + private ToHtml(Workbook wb, Appendable output) { + if (wb == null) + throw new NullPointerException("wb"); + if (output == null) + throw new NullPointerException("output"); + this.wb = wb; + this.output = output; + setupColorMap(); + } + + private void setupColorMap() { + if (wb instanceof HSSFWorkbook) + helper = new HSSFHtmlHelper((HSSFWorkbook) wb); + else if (wb instanceof XSSFWorkbook) + helper = new XSSFHtmlHelper((XSSFWorkbook) wb); + else + throw new IllegalArgumentException( + "unknown workbook type: " + wb.getClass().getSimpleName()); + } + + /** + * Run this class as a program + * + * @param args The command line arguments. + * + * @throws Exception Exception we don't recover from. + */ + public static void main(String[] args) throws Exception { + if(args.length < 2){ + System.err.println("usage: ToHtml inputWorkbook outputHtmlFile"); + return; + } + + ToHtml toHtml = create(args[0], new PrintWriter(new FileWriter(args[1]))); + toHtml.setCompleteHTML(true); + toHtml.printPage(); + } + + public void setCompleteHTML(boolean completeHTML) { + this.completeHTML = completeHTML; + } + + public void printPage() throws IOException { + try { + ensureOut(); + if (completeHTML) { + out.format( + "%n"); + out.format("%n"); + out.format("%n"); + out.format("%n"); + out.format("%n"); + } + + print(); + + if (completeHTML) { + out.format("%n"); + out.format("%n"); + } + } finally { + if (out != null) + out.close(); + if (output instanceof Closeable) { + Closeable closeable = (Closeable) output; + closeable.close(); + } + } + } + + public void print() { + printInlineStyle(); + printSheets(); + } + + private void printInlineStyle() { + //out.format("%n"); + out.format("%n"); + } + + private void ensureOut() { + if (out == null) + out = new Formatter(output); + } + + public void printStyles() { + ensureOut(); + + // First, copy the base css + BufferedReader in = null; + try { + in = new BufferedReader(new InputStreamReader( + getClass().getResourceAsStream("excelStyle.css"))); + String line; + while ((line = in.readLine()) != null) { + out.format("%s%n", line); + } + } catch (IOException e) { + throw new IllegalStateException("Reading standard css", e); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + //noinspection ThrowFromFinallyBlock + throw new IllegalStateException("Reading standard css", e); + } + } + } + + // now add css for each used style + Set seen = new HashSet(); + for (int i = 0; i < wb.getNumberOfSheets(); i++) { + Sheet sheet = wb.getSheetAt(i); + Iterator rows = sheet.rowIterator(); + while (rows.hasNext()) { + Row row = rows.next(); + for (Cell cell : row) { + CellStyle style = cell.getCellStyle(); + if (!seen.contains(style)) { + printStyle(style); + seen.add(style); + } + } + } + } + } + + private void printStyle(CellStyle style) { + out.format(".%s .%s {%n", DEFAULTS_CLASS, styleName(style)); + styleContents(style); + out.format("}%n"); + } + + private void styleContents(CellStyle style) { + styleOut("text-align", style.getAlignment(), ALIGN); + styleOut("vertical-align", style.getAlignment(), VERTICAL_ALIGN); + fontStyle(style); + borderStyles(style); + helper.colorStyles(style, out); + } + + private void borderStyles(CellStyle style) { + styleOut("border-left", style.getBorderLeft(), BORDER); + styleOut("border-right", style.getBorderRight(), BORDER); + styleOut("border-top", style.getBorderTop(), BORDER); + styleOut("border-bottom", style.getBorderBottom(), BORDER); + } + + private void fontStyle(CellStyle style) { + Font font = wb.getFontAt(style.getFontIndex()); + + if (font.getBoldweight() >= HSSFFont.BOLDWEIGHT_NORMAL) + out.format(" font-weight: bold;%n"); + if (font.getItalic()) + out.format(" font-style: italic;%n"); + + int fontheight = font.getFontHeightInPoints(); + if (fontheight == 9) { + //fix for stupid ol Windows + fontheight = 10; + } + out.format(" font-size: %dpt;%n", fontheight); + + // Font color is handled with the other colors + } + + private String styleName(CellStyle style) { + if (style == null) + style = wb.getCellStyleAt((short) 0); + StringBuilder sb = new StringBuilder(); + Formatter fmt = new Formatter(sb); + fmt.format("style_%02x", style.getIndex()); + return fmt.toString(); + } + + private void styleOut(String attr, K key, Map mapping) { + String value = mapping.get(key); + if (value != null) { + out.format(" %s: %s;%n", attr, value); + } + } + + private static int ultimateCellType(Cell c) { + int type = c.getCellType(); + if (type == Cell.CELL_TYPE_FORMULA) + type = c.getCachedFormulaResultType(); + return type; + } + + private void printSheets() { + ensureOut(); + Sheet sheet = wb.getSheetAt(0); + printSheet(sheet); + } + + public void printSheet(Sheet sheet) { + ensureOut(); + out.format("%n", DEFAULTS_CLASS); + printCols(sheet); + printSheetContent(sheet); + out.format("
%n"); + } + + private void printCols(Sheet sheet) { + out.format("%n"); + ensureColumnBounds(sheet); + for (int i = firstColumn; i < endColumn; i++) { + out.format("%n"); + } + } + + private void ensureColumnBounds(Sheet sheet) { + if (gotBounds) + return; + + Iterator iter = sheet.rowIterator(); + firstColumn = (iter.hasNext() ? Integer.MAX_VALUE : 0); + endColumn = 0; + while (iter.hasNext()) { + Row row = iter.next(); + short firstCell = row.getFirstCellNum(); + if (firstCell >= 0) { + firstColumn = Math.min(firstColumn, firstCell); + endColumn = Math.max(endColumn, row.getLastCellNum()); + } + } + gotBounds = true; + } + + private void printColumnHeads() { + out.format("%n"); + out.format(" %n", COL_HEAD_CLASS); + out.format(" ◊%n", COL_HEAD_CLASS); + //noinspection UnusedDeclaration + StringBuilder colName = new StringBuilder(); + for (int i = firstColumn; i < endColumn; i++) { + colName.setLength(0); + int cnum = i; + do { + colName.insert(0, (char) ('A' + cnum % 26)); + cnum /= 26; + } while (cnum > 0); + out.format(" %s%n", COL_HEAD_CLASS, colName); + } + out.format(" %n"); + out.format("%n"); + } + + private void printSheetContent(Sheet sheet) { + printColumnHeads(); + + out.format("%n"); + Iterator rows = sheet.rowIterator(); + while (rows.hasNext()) { + Row row = rows.next(); + + out.format(" %n"); + out.format(" %d%n", ROW_HEAD_CLASS, + row.getRowNum() + 1); + for (int i = firstColumn; i < endColumn; i++) { + String content = " "; + String attrs = ""; + CellStyle style = null; + if (i >= row.getFirstCellNum() && i < row.getLastCellNum()) { + Cell cell = row.getCell(i); + if (cell != null) { + style = cell.getCellStyle(); + attrs = tagStyle(cell, style); + //Set the value that is rendered for the cell + //also applies the format + CellFormat cf = CellFormat.getInstance( + style.getDataFormatString()); + CellFormatResult result = cf.apply(cell); + content = result.text; + if (content.equals("")) + content = " "; + } + } + out.format(" %s%n", styleName(style), + attrs, content); + } + out.format(" %n"); + } + out.format("%n"); + } + + private String tagStyle(Cell cell, CellStyle style) { + if (style.getAlignment() == ALIGN_GENERAL) { + switch (ultimateCellType(cell)) { + case HSSFCell.CELL_TYPE_STRING: + return "style=\"text-align: left;\""; + case HSSFCell.CELL_TYPE_BOOLEAN: + case HSSFCell.CELL_TYPE_ERROR: + return "style=\"text-align: center;\""; + case HSSFCell.CELL_TYPE_NUMERIC: + default: + // "right" is the default + break; + } + } + return ""; + } +} \ No newline at end of file diff --git a/src/examples/src/org/apache/poi/ss/examples/html/XSSFHtmlHelper.java b/src/examples/src/org/apache/poi/ss/examples/html/XSSFHtmlHelper.java new file mode 100644 index 0000000000..36fca3a9b9 --- /dev/null +++ b/src/examples/src/org/apache/poi/ss/examples/html/XSSFHtmlHelper.java @@ -0,0 +1,64 @@ +/* ==================================================================== + 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.ss.examples.html; + +import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.xssf.usermodel.XSSFCellStyle; +import org.apache.poi.xssf.usermodel.XSSFColor; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.util.Formatter; +import java.util.Hashtable; + +/** + * Implementation of {@link HtmlHelper} for XSSF files. + * + * @author Ken Arnold, Industrious Media LLC + */ +public class XSSFHtmlHelper implements HtmlHelper { + private final XSSFWorkbook wb; + + private static final Hashtable colors = HSSFColor.getIndexHash(); + + public XSSFHtmlHelper(XSSFWorkbook wb) { + this.wb = wb; + } + + public void colorStyles(CellStyle style, Formatter out) { + XSSFCellStyle cs = (XSSFCellStyle) style; + styleColor(out, "background-color", cs.getFillForegroundXSSFColor()); + styleColor(out, "text-color", cs.getFont().getXSSFColor()); + } + + private void styleColor(Formatter out, String attr, XSSFColor color) { + if (color == null || color.isAuto()) + return; + + byte[] rgb = color.getRgb(); + if (rgb == null) { + return; + } + + // This is done twice -- rgba is new with CSS 3, and browser that don't + // support it will ignore the rgba specification and stick with the + // solid color, which is declared first + out.format(" %s: #%02x%02x%02x;%n", attr, rgb[0], rgb[1], rgb[2]); + out.format(" %s: rgba(0x%02x, 0x%02x, 0x%02x, 0x%02x);%n", attr, + rgb[0], rgb[1], rgb[2], rgb[3]); + } +} \ No newline at end of file diff --git a/src/examples/src/org/apache/poi/ss/examples/html/excelStyle.css b/src/examples/src/org/apache/poi/ss/examples/html/excelStyle.css new file mode 100644 index 0000000000..e428918b30 --- /dev/null +++ b/src/examples/src/org/apache/poi/ss/examples/html/excelStyle.css @@ -0,0 +1,54 @@ +/* + * This is the default style sheet for html generated by ToHtml + * + * @author Ken Arnold, Industrious Media LLC + */ +.excelDefaults { + background-color: white; + color: black; + text-decoration: none; + direction: ltr; + text-transform: none; + text-indent: 0; + letter-spacing: 0; + word-spacing: 0; + white-space: normal; + unicode-bidi: normal; + vertical-align: 0; + background-image: none; + text-shadow: none; + list-style-image: none; + list-style-type: none; + padding: 0; + margin: 0; + border-collapse: collapse; + white-space: pre; + vertical-align: bottom; + font-style: normal; + font-family: sans-serif; + font-variant: normal; + font-weight: normal; + font-size: 10pt; + text-align: right; +} + +.excelDefaults td { + padding: 1px 5px; + border: 1px solid silver; +} + +.excelDefaults .colHeader { + background-color: silver; + font-weight: bold; + border: 1px solid black; + text-align: center; + padding: 1px 5px; +} + +.excelDefaults .rowHeader { + background-color: silver; + font-weight: bold; + border: 1px solid black; + text-align: right; + padding: 1px 5px; +} diff --git a/src/examples/src/org/apache/poi/ss/examples/html/package.html b/src/examples/src/org/apache/poi/ss/examples/html/package.html new file mode 100644 index 0000000000..b041119bb0 --- /dev/null +++ b/src/examples/src/org/apache/poi/ss/examples/html/package.html @@ -0,0 +1,2 @@ +This package contains an example that uses POI to convert a workbook into +an HTML representation of the data. It can use both XSSF and HSSF workbooks. \ No newline at end of file diff --git a/src/java/org/apache/poi/ss/format/CellDateFormatter.java b/src/java/org/apache/poi/ss/format/CellDateFormatter.java new file mode 100644 index 0000000000..5007305e21 --- /dev/null +++ b/src/java/org/apache/poi/ss/format/CellDateFormatter.java @@ -0,0 +1,213 @@ +/* ==================================================================== + 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.ss.format; + +import java.text.AttributedCharacterIterator; +import java.text.CharacterIterator; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.Formatter; +import java.util.regex.Matcher; + +/** + * Formats a date value. + * + * @author Ken Arnold, Industrious Media LLC + */ +public class CellDateFormatter extends CellFormatter { + private boolean amPmUpper; + private boolean showM; + private boolean showAmPm; + private final DateFormat dateFmt; + private String sFmt; + + private static final long EXCEL_EPOCH_TIME; + private static final Date EXCEL_EPOCH_DATE; + + private static final CellFormatter SIMPLE_DATE = new CellDateFormatter( + "mm/d/y"); + + static { + Calendar c = Calendar.getInstance(); + c.set(1904, 0, 1, 0, 0, 0); + EXCEL_EPOCH_DATE = c.getTime(); + EXCEL_EPOCH_TIME = c.getTimeInMillis(); + } + + private class DatePartHandler implements CellFormatPart.PartHandler { + private int mStart = -1; + private int mLen; + private int hStart = -1; + private int hLen; + + public String handlePart(Matcher m, String part, CellFormatType type, + StringBuffer desc) { + + int pos = desc.length(); + char firstCh = part.charAt(0); + switch (firstCh) { + case 's': + case 'S': + if (mStart >= 0) { + for (int i = 0; i < mLen; i++) + desc.setCharAt(mStart + i, 'm'); + mStart = -1; + } + return part.toLowerCase(); + + case 'h': + case 'H': + mStart = -1; + hStart = pos; + hLen = part.length(); + return part.toLowerCase(); + + case 'd': + case 'D': + mStart = -1; + if (part.length() <= 2) + return part.toLowerCase(); + else + return part.toLowerCase().replace('d', 'E'); + + case 'm': + case 'M': + mStart = pos; + mLen = part.length(); + return part.toUpperCase(); + + case 'y': + case 'Y': + mStart = -1; + if (part.length() == 3) + part = "yyyy"; + return part.toLowerCase(); + + case '0': + mStart = -1; + int sLen = part.length(); + sFmt = "%0" + (sLen + 2) + "." + sLen + "f"; + return part.replace('0', 'S'); + + case 'a': + case 'A': + case 'p': + case 'P': + if (part.length() > 1) { + // am/pm marker + mStart = -1; + showAmPm = true; + showM = Character.toLowerCase(part.charAt(1)) == 'm'; + // For some reason "am/pm" becomes AM or PM, but "a/p" becomes a or p + amPmUpper = showM || Character.isUpperCase(part.charAt(0)); + + return "a"; + } + //noinspection fallthrough + + default: + return null; + } + } + + public void finish(StringBuffer toAppendTo) { + if (hStart >= 0 && !showAmPm) { + for (int i = 0; i < hLen; i++) { + toAppendTo.setCharAt(hStart + i, 'H'); + } + } + } + } + + /** + * Creates a new date formatter with the given specification. + * + * @param format The format. + */ + public CellDateFormatter(String format) { + super(format); + DatePartHandler partHandler = new DatePartHandler(); + StringBuffer descBuf = CellFormatPart.parseFormat(format, + CellFormatType.DATE, partHandler); + partHandler.finish(descBuf); + dateFmt = new SimpleDateFormat(descBuf.toString()); + } + + /** {@inheritDoc} */ + public void formatValue(StringBuffer toAppendTo, Object value) { + if (value == null) + value = 0.0; + if (value instanceof Number) { + Number num = (Number) value; + double v = num.doubleValue(); + if (v == 0.0) + value = EXCEL_EPOCH_DATE; + else + value = new Date((long) (EXCEL_EPOCH_TIME + v)); + } + + AttributedCharacterIterator it = dateFmt.formatToCharacterIterator( + value); + boolean doneAm = false; + boolean doneMillis = false; + + it.first(); + for (char ch = it.first(); + ch != CharacterIterator.DONE; + ch = it.next()) { + if (it.getAttribute(DateFormat.Field.MILLISECOND) != null) { + if (!doneMillis) { + Date dateObj = (Date) value; + int pos = toAppendTo.length(); + Formatter formatter = new Formatter(toAppendTo); + long msecs = dateObj.getTime() % 1000; + formatter.format(LOCALE, sFmt, msecs / 1000.0); + toAppendTo.delete(pos, pos + 2); + doneMillis = true; + } + } else if (it.getAttribute(DateFormat.Field.AM_PM) != null) { + if (!doneAm) { + if (showAmPm) { + if (amPmUpper) { + toAppendTo.append(Character.toUpperCase(ch)); + if (showM) + toAppendTo.append('M'); + } else { + toAppendTo.append(Character.toLowerCase(ch)); + if (showM) + toAppendTo.append('m'); + } + } + doneAm = true; + } + } else { + toAppendTo.append(ch); + } + } + } + + /** + * {@inheritDoc} + *

+ * For a date, this is "mm/d/y". + */ + public void simpleValue(StringBuffer toAppendTo, Object value) { + SIMPLE_DATE.formatValue(toAppendTo, value); + } +} \ No newline at end of file diff --git a/src/java/org/apache/poi/ss/format/CellElapsedFormatter.java b/src/java/org/apache/poi/ss/format/CellElapsedFormatter.java new file mode 100644 index 0000000000..07ebadf2a0 --- /dev/null +++ b/src/java/org/apache/poi/ss/format/CellElapsedFormatter.java @@ -0,0 +1,215 @@ +/* ==================================================================== + 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.ss.format; + +import java.util.ArrayList; +import java.util.Formatter; +import java.util.List; +import java.util.ListIterator; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * This class implements printing out an elapsed time format. + * + * @author Ken Arnold, Industrious Media LLC + */ +public class CellElapsedFormatter extends CellFormatter { + private final List specs; + private TimeSpec topmost; + private final String printfFmt; + + private static final Pattern PERCENTS = Pattern.compile("%"); + + private static final double HOUR__FACTOR = 1.0 / 24.0; + private static final double MIN__FACTOR = HOUR__FACTOR / 60.0; + private static final double SEC__FACTOR = MIN__FACTOR / 60.0; + + private static class TimeSpec { + final char type; + final int pos; + final int len; + final double factor; + double modBy; + + public TimeSpec(char type, int pos, int len, double factor) { + this.type = type; + this.pos = pos; + this.len = len; + this.factor = factor; + modBy = 0; + } + + public long valueFor(double elapsed) { + double val; + if (modBy == 0) + val = elapsed / factor; + else + val = elapsed / factor % modBy; + if (type == '0') + return Math.round(val); + else + return (long) val; + } + } + + private class ElapsedPartHandler implements CellFormatPart.PartHandler { + // This is the one class that's directly using printf, so it can't use + // the default handling for quoted strings and special characters. The + // only special character for this is '%', so we have to handle all the + // quoting in this method ourselves. + + public String handlePart(Matcher m, String part, CellFormatType type, + StringBuffer desc) { + + int pos = desc.length(); + char firstCh = part.charAt(0); + switch (firstCh) { + case '[': + if (part.length() < 3) + break; + if (topmost != null) + throw new IllegalArgumentException( + "Duplicate '[' times in format"); + part = part.toLowerCase(); + int specLen = part.length() - 2; + topmost = assignSpec(part.charAt(1), pos, specLen); + return part.substring(1, 1 + specLen); + + case 'h': + case 'm': + case 's': + case '0': + part = part.toLowerCase(); + assignSpec(part.charAt(0), pos, part.length()); + return part; + + case '\n': + return "%n"; + + case '\"': + part = part.substring(1, part.length() - 1); + break; + + case '\\': + part = part.substring(1); + break; + + case '*': + if (part.length() > 1) + part = CellFormatPart.expandChar(part); + break; + + // An escape we can let it handle because it can't have a '%' + case '_': + return null; + } + // Replace ever "%" with a "%%" so we can use printf + return PERCENTS.matcher(part).replaceAll("%%"); + } + } + + /** + * Creates a elapsed time formatter. + * + * @param pattern The pattern to parse. + */ + public CellElapsedFormatter(String pattern) { + super(pattern); + + specs = new ArrayList(); + + StringBuffer desc = CellFormatPart.parseFormat(pattern, + CellFormatType.ELAPSED, new ElapsedPartHandler()); + + ListIterator it = specs.listIterator(specs.size()); + while (it.hasPrevious()) { + TimeSpec spec = it.previous(); + desc.replace(spec.pos, spec.pos + spec.len, "%0" + spec.len + "d"); + if (spec.type != topmost.type) { + spec.modBy = modFor(spec.type, spec.len); + } + } + + printfFmt = desc.toString(); + } + + private TimeSpec assignSpec(char type, int pos, int len) { + TimeSpec spec = new TimeSpec(type, pos, len, factorFor(type, len)); + specs.add(spec); + return spec; + } + + private static double factorFor(char type, int len) { + switch (type) { + case 'h': + return HOUR__FACTOR; + case 'm': + return MIN__FACTOR; + case 's': + return SEC__FACTOR; + case '0': + return SEC__FACTOR / Math.pow(10, len); + default: + throw new IllegalArgumentException( + "Uknown elapsed time spec: " + type); + } + } + + private static double modFor(char type, int len) { + switch (type) { + case 'h': + return 24; + case 'm': + return 60; + case 's': + return 60; + case '0': + return Math.pow(10, len); + default: + throw new IllegalArgumentException( + "Uknown elapsed time spec: " + type); + } + } + + /** {@inheritDoc} */ + public void formatValue(StringBuffer toAppendTo, Object value) { + double elapsed = ((Number) value).doubleValue(); + + if (elapsed < 0) { + toAppendTo.append('-'); + elapsed = -elapsed; + } + + Object[] parts = new Long[specs.size()]; + for (int i = 0; i < specs.size(); i++) { + parts[i] = specs.get(i).valueFor(elapsed); + } + + Formatter formatter = new Formatter(toAppendTo); + formatter.format(printfFmt, parts); + } + + /** + * {@inheritDoc} + *

+ * For a date, this is "mm/d/y". + */ + public void simpleValue(StringBuffer toAppendTo, Object value) { + formatValue(toAppendTo, value); + } +} \ No newline at end of file diff --git a/src/java/org/apache/poi/ss/format/CellFormat.java b/src/java/org/apache/poi/ss/format/CellFormat.java new file mode 100644 index 0000000000..c7c22f004e --- /dev/null +++ b/src/java/org/apache/poi/ss/format/CellFormat.java @@ -0,0 +1,313 @@ +/* ==================================================================== + 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.ss.format; + +import org.apache.poi.ss.usermodel.Cell; + +import javax.swing.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.WeakHashMap; +import java.util.logging.Level; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Format a value according to the standard Excel behavior. This "standard" is + * not explicitly documented by Microsoft, so the behavior is determined by + * experimentation; see the tests. + *

+ * An Excel format has up to four parts, separated by semicolons. Each part + * specifies what to do with particular kinds of values, depending on the number + * of parts given:

One part (example: [Green]#.##)
If the + * value is a number, display according to this one part (example: green text, + * with up to two decimal points). If the value is text, display it as is. + *
Two parts (example: [Green]#.##;[Red]#.##)
If the value is a + * positive number or zero, display according to the first part (example: green + * text, with up to two decimal points); if it is a negative number, display + * according to the second part (example: red text, with up to two decimal + * points). If the value is text, display it as is.
Three parts (example: + * [Green]#.##;[Black]#.##;[Red]#.##)
If the value is a positive + * number, display according to the first part (example: green text, with up to + * two decimal points); if it is zero, display according to the second part + * (example: black text, with up to two decimal points); if it is a negative + * number, display according to the third part (example: red text, with up to + * two decimal points). If the value is text, display it as is.
Four parts + * (example: [Green]#.##;[Black]#.##;[Red]#.##;[@])
If the value is + * a positive number, display according to the first part (example: green text, + * with up to two decimal points); if it is zero, display according to the + * second part (example: black text, with up to two decimal points); if it is a + * negative number, display according to the third part (example: red text, with + * up to two decimal points). If the value is text, display according to the + * fourth part (example: text in the cell's usual color, with the text value + * surround by brackets).
+ *

+ * In addition to these, there is a general format that is used when no format + * is specified. This formatting is presented by the {@link #GENERAL_FORMAT} + * object. + * + * @author Ken Arnold, Industrious Media LLC + */ +@SuppressWarnings({"Singleton"}) +public class CellFormat { + private final String format; + private final CellFormatPart posNumFmt; + private final CellFormatPart zeroNumFmt; + private final CellFormatPart negNumFmt; + private final CellFormatPart textFmt; + + private static final Pattern ONE_PART = Pattern.compile( + CellFormatPart.FORMAT_PAT.pattern() + "(;|$)", + Pattern.COMMENTS | Pattern.CASE_INSENSITIVE); + + private static final CellFormatPart DEFAULT_TEXT_FORMAT = + new CellFormatPart("@"); + + /** + * Format a value as it would be were no format specified. This is also + * used when the format specified is General. + */ + public static final CellFormat GENERAL_FORMAT = new CellFormat("General") { + @Override + public CellFormatResult apply(Object value) { + String text; + if (value == null) { + text = ""; + } else if (value instanceof Number) { + text = CellNumberFormatter.SIMPLE_NUMBER.format(value); + } else { + text = value.toString(); + } + return new CellFormatResult(true, text, null); + } + }; + + /** Maps a format string to its parsed version for efficiencies sake. */ + private static final Map formatCache = + new WeakHashMap(); + + /** + * Returns a {@link CellFormat} that applies the given format. Two calls + * with the same format may or may not return the same object. + * + * @param format The format. + * + * @return A {@link CellFormat} that applies the given format. + */ + public static CellFormat getInstance(String format) { + CellFormat fmt = formatCache.get(format); + if (fmt == null) { + if (format.equals("General")) + fmt = GENERAL_FORMAT; + else + fmt = new CellFormat(format); + formatCache.put(format, fmt); + } + return fmt; + } + + /** + * Creates a new object. + * + * @param format The format. + */ + private CellFormat(String format) { + this.format = format; + Matcher m = ONE_PART.matcher(format); + List parts = new ArrayList(); + + while (m.find()) { + try { + String valueDesc = m.group(); + + // Strip out the semicolon if it's there + if (valueDesc.endsWith(";")) + valueDesc = valueDesc.substring(0, valueDesc.length() - 1); + + parts.add(new CellFormatPart(valueDesc)); + } catch (RuntimeException e) { + CellFormatter.logger.log(Level.WARNING, + "Invalid format: " + CellFormatter.quote(m.group()), e); + parts.add(null); + } + } + + switch (parts.size()) { + case 1: + posNumFmt = zeroNumFmt = negNumFmt = parts.get(0); + textFmt = DEFAULT_TEXT_FORMAT; + break; + case 2: + posNumFmt = zeroNumFmt = parts.get(0); + negNumFmt = parts.get(1); + textFmt = DEFAULT_TEXT_FORMAT; + break; + case 3: + posNumFmt = parts.get(0); + zeroNumFmt = parts.get(1); + negNumFmt = parts.get(2); + textFmt = DEFAULT_TEXT_FORMAT; + break; + case 4: + default: + posNumFmt = parts.get(0); + zeroNumFmt = parts.get(1); + negNumFmt = parts.get(2); + textFmt = parts.get(3); + break; + } + } + + /** + * Returns the result of applying the format to the given value. If the + * value is a number (a type of {@link Number} object), the correct number + * format type is chosen; otherwise it is considered a text object. + * + * @param value The value + * + * @return The result, in a {@link CellFormatResult}. + */ + public CellFormatResult apply(Object value) { + if (value instanceof Number) { + Number num = (Number) value; + double val = num.doubleValue(); + if (val > 0) + return posNumFmt.apply(value); + else if (val < 0) + return negNumFmt.apply(-val); + else + return zeroNumFmt.apply(value); + } else { + return textFmt.apply(value); + } + } + + /** + * Fetches the appropriate value from the cell, and returns the result of + * applying it to the appropriate format. For formula cells, the computed + * value is what is used. + * + * @param c The cell. + * + * @return The result, in a {@link CellFormatResult}. + */ + public CellFormatResult apply(Cell c) { + switch (ultimateType(c)) { + case Cell.CELL_TYPE_BLANK: + return apply(""); + case Cell.CELL_TYPE_BOOLEAN: + return apply(c.getStringCellValue()); + case Cell.CELL_TYPE_NUMERIC: + return apply(c.getNumericCellValue()); + case Cell.CELL_TYPE_STRING: + return apply(c.getStringCellValue()); + default: + return apply("?"); + } + } + + /** + * Uses the result of applying this format to the value, setting the text + * and color of a label before returning the result. + * + * @param label The label to apply to. + * @param value The value to process. + * + * @return The result, in a {@link CellFormatResult}. + */ + public CellFormatResult apply(JLabel label, Object value) { + CellFormatResult result = apply(value); + label.setText(result.text); + if (result.textColor != null) { + label.setForeground(result.textColor); + } + return result; + } + + /** + * Fetches the appropriate value from the cell, and uses the result, setting + * the text and color of a label before returning the result. + * + * @param label The label to apply to. + * @param c The cell. + * + * @return The result, in a {@link CellFormatResult}. + */ + public CellFormatResult apply(JLabel label, Cell c) { + switch (ultimateType(c)) { + case Cell.CELL_TYPE_BLANK: + return apply(label, ""); + case Cell.CELL_TYPE_BOOLEAN: + return apply(label, c.getStringCellValue()); + case Cell.CELL_TYPE_NUMERIC: + return apply(label, c.getNumericCellValue()); + case Cell.CELL_TYPE_STRING: + return apply(label, c.getStringCellValue()); + default: + return apply(label, "?"); + } + } + + /** + * Returns the ultimate cell type, following the results of formulas. If + * the cell is a {@link Cell#CELL_TYPE_FORMULA}, this returns the result of + * {@link Cell#getCachedFormulaResultType()}. Otherwise this returns the + * result of {@link Cell#getCellType()}. + * + * @param cell The cell. + * + * @return The ultimate type of this cell. + */ + public static int ultimateType(Cell cell) { + int type = cell.getCellType(); + if (type == Cell.CELL_TYPE_FORMULA) + return cell.getCachedFormulaResultType(); + else + return type; + } + + /** + * Returns true if the other object is a {@link CellFormat} object + * with the same format. + * + * @param obj The other object. + * + * @return true if the two objects are equal. + */ + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj instanceof CellFormat) { + CellFormat that = (CellFormat) obj; + return format.equals(that.format); + } + return false; + } + + /** + * Returns a hash code for the format. + * + * @return A hash code for the format. + */ + @Override + public int hashCode() { + return format.hashCode(); + } +} \ No newline at end of file diff --git a/src/java/org/apache/poi/ss/format/CellFormatCondition.java b/src/java/org/apache/poi/ss/format/CellFormatCondition.java new file mode 100644 index 0000000000..23fd2f2e7a --- /dev/null +++ b/src/java/org/apache/poi/ss/format/CellFormatCondition.java @@ -0,0 +1,121 @@ +/* ==================================================================== + 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.ss.format; + +import java.util.HashMap; +import java.util.Map; + +/** + * This object represents a condition in a cell format. + * + * @author Ken Arnold, Industrious Media LLC + */ +public abstract class CellFormatCondition { + private static final int LT = 0; + private static final int LE = 1; + private static final int GT = 2; + private static final int GE = 3; + private static final int EQ = 4; + private static final int NE = 5; + + private static final Map TESTS; + + static { + TESTS = new HashMap(); + TESTS.put("<", LT); + TESTS.put("<=", LE); + TESTS.put(">", GT); + TESTS.put(">=", GE); + TESTS.put("=", EQ); + TESTS.put("==", EQ); + TESTS.put("!=", NE); + TESTS.put("<>", NE); + } + + /** + * Returns an instance of a condition object. + * + * @param opString The operator as a string. One of "<", + * "<=", ">", ">=", + * "=", "==", "!=", or + * "<>". + * @param constStr The constant (such as "12"). + * + * @return A condition object for the given condition. + */ + public static CellFormatCondition getInstance(String opString, + String constStr) { + + if (!TESTS.containsKey(opString)) + throw new IllegalArgumentException("Unknown test: " + opString); + int test = TESTS.get(opString); + + final double c = Double.parseDouble(constStr); + + switch (test) { + case LT: + return new CellFormatCondition() { + public boolean pass(double value) { + return value < c; + } + }; + case LE: + return new CellFormatCondition() { + public boolean pass(double value) { + return value <= c; + } + }; + case GT: + return new CellFormatCondition() { + public boolean pass(double value) { + return value > c; + } + }; + case GE: + return new CellFormatCondition() { + public boolean pass(double value) { + return value >= c; + } + }; + case EQ: + return new CellFormatCondition() { + public boolean pass(double value) { + return value == c; + } + }; + case NE: + return new CellFormatCondition() { + public boolean pass(double value) { + return value != c; + } + }; + default: + throw new IllegalArgumentException( + "Cannot create for test number " + test + "(\"" + opString + + "\")"); + } + } + + /** + * Returns true if the given value passes the constraint's test. + * + * @param value The value to compare against. + * + * @return true if the given value passes the constraint's test. + */ + public abstract boolean pass(double value); +} \ No newline at end of file diff --git a/src/java/org/apache/poi/ss/format/CellFormatPart.java b/src/java/org/apache/poi/ss/format/CellFormatPart.java new file mode 100644 index 0000000000..cedc94fe27 --- /dev/null +++ b/src/java/org/apache/poi/ss/format/CellFormatPart.java @@ -0,0 +1,494 @@ +/* ==================================================================== + 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.ss.format; + +import org.apache.poi.hssf.util.HSSFColor; + +import javax.swing.*; +import java.awt.*; +import java.util.Map; +import java.util.TreeMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static org.apache.poi.ss.format.CellFormatter.logger; +import static org.apache.poi.ss.format.CellFormatter.quote; + +/** + * Objects of this class represent a single part of a cell format expression. + * Each cell can have up to four of these for positive, zero, negative, and text + * values. + *

+ * Each format part can contain a color, a condition, and will always contain a + * format specification. For example "[Red][>=10]#" has a color + * ([Red]), a condition (>=10) and a format specification + * (#). + *

+ * This class also contains patterns for matching the subparts of format + * specification. These are used internally, but are made public in case other + * code has use for them. + * + * @author Ken Arnold, Industrious Media LLC + */ +public class CellFormatPart { + private final Color color; + private CellFormatCondition condition; + private final CellFormatter format; + + private static final Map NAMED_COLORS; + + static { + NAMED_COLORS = new TreeMap( + String.CASE_INSENSITIVE_ORDER); + + Map colors = HSSFColor.getIndexHash(); + for (Object val : colors.values()) { + HSSFColor color = (HSSFColor) val; + Class type = color.getClass(); + String name = type.getSimpleName(); + if (name.equals(name.toUpperCase())) { + short[] rgb = color.getTriplet(); + Color c = new Color(rgb[0], rgb[1], rgb[2]); + NAMED_COLORS.put(name, c); + if (name.indexOf('_') > 0) + NAMED_COLORS.put(name.replace('_', ' '), c); + if (name.indexOf("_PERCENT") > 0) + NAMED_COLORS.put(name.replace("_PERCENT", "%").replace('_', + ' '), c); + } + } + } + + /** Pattern for the color part of a cell format part. */ + public static final Pattern COLOR_PAT; + /** Pattern for the condition part of a cell format part. */ + public static final Pattern CONDITION_PAT; + /** Pattern for the format specification part of a cell format part. */ + public static final Pattern SPECIFICATION_PAT; + /** Pattern for an entire cell single part. */ + public static final Pattern FORMAT_PAT; + + /** Within {@link #FORMAT_PAT}, the group number for the matched color. */ + public static final int COLOR_GROUP; + /** + * Within {@link #FORMAT_PAT}, the group number for the operator in the + * condition. + */ + public static final int CONDITION_OPERATOR_GROUP; + /** + * Within {@link #FORMAT_PAT}, the group number for the value in the + * condition. + */ + public static final int CONDITION_VALUE_GROUP; + /** + * Within {@link #FORMAT_PAT}, the group number for the format + * specification. + */ + public static final int SPECIFICATION_GROUP; + + static { + // A condition specification + String condition = "([<>=]=?|!=|<>) # The operator\n" + + " \\s*([0-9]+(?:\\.[0-9]*)?)\\s* # The constant to test against\n"; + + String color = + "\\[(black|blue|cyan|green|magenta|red|white|yellow|color [0-9]+)\\]"; + + // A number specification + // Note: careful that in something like ##, that the trailing comma is not caught up in the integer part + + // A part of a specification + String part = "\\\\. # Quoted single character\n" + + "|\"([^\\\\\"]|\\\\.)*\" # Quoted string of characters (handles escaped quotes like \\\") \n" + + "|_. # Space as wide as a given character\n" + + "|\\*. # Repeating fill character\n" + + "|@ # Text: cell text\n" + + "|([0?\\#](?:[0?\\#,]*)) # Number: digit + other digits and commas\n" + + "|e[-+] # Number: Scientific: Exponent\n" + + "|m{1,5} # Date: month or minute spec\n" + + "|d{1,4} # Date: day/date spec\n" + + "|y{2,4} # Date: year spec\n" + + "|h{1,2} # Date: hour spec\n" + + "|s{1,2} # Date: second spec\n" + + "|am?/pm? # Date: am/pm spec\n" + + "|\\[h{1,2}\\] # Elapsed time: hour spec\n" + + "|\\[m{1,2}\\] # Elapsed time: minute spec\n" + + "|\\[s{1,2}\\] # Elapsed time: second spec\n" + + "|[^;] # A character\n" + ""; + + String format = "(?:" + color + ")? # Text color\n" + + "(?:\\[" + condition + "\\])? # Condition\n" + + "((?:" + part + ")+) # Format spec\n"; + + int flags = Pattern.COMMENTS | Pattern.CASE_INSENSITIVE; + COLOR_PAT = Pattern.compile(color, flags); + CONDITION_PAT = Pattern.compile(condition, flags); + SPECIFICATION_PAT = Pattern.compile(part, flags); + FORMAT_PAT = Pattern.compile(format, flags); + + // Calculate the group numbers of important groups. (They shift around + // when the pattern is changed; this way we figure out the numbers by + // experimentation.) + + COLOR_GROUP = findGroup(FORMAT_PAT, "[Blue]@", "Blue"); + CONDITION_OPERATOR_GROUP = findGroup(FORMAT_PAT, "[>=1]@", ">="); + CONDITION_VALUE_GROUP = findGroup(FORMAT_PAT, "[>=1]@", "1"); + SPECIFICATION_GROUP = findGroup(FORMAT_PAT, "[Blue][>1]\\a ?", "\\a ?"); + } + + interface PartHandler { + String handlePart(Matcher m, String part, CellFormatType type, + StringBuffer desc); + } + + /** + * Create an object to represent a format part. + * + * @param desc The string to parse. + */ + public CellFormatPart(String desc) { + Matcher m = FORMAT_PAT.matcher(desc); + if (!m.matches()) { + throw new IllegalArgumentException("Unrecognized format: " + quote( + desc)); + } + color = getColor(m); + condition = getCondition(m); + format = getFormatter(m); + } + + /** + * Returns true if this format part applies to the given value. If + * the value is a number and this is part has a condition, returns + * true only if the number passes the condition. Otherwise, this + * allways return true. + * + * @param valueObject The value to evaluate. + * + * @return true if this format part applies to the given value. + */ + public boolean applies(Object valueObject) { + if (condition == null || !(valueObject instanceof Number)) { + if (valueObject == null) + throw new NullPointerException("valueObject"); + return true; + } else { + Number num = (Number) valueObject; + return condition.pass(num.doubleValue()); + } + } + + /** + * Returns the number of the first group that is the same as the marker + * string. The search starts with group 1. + * + * @param pat The pattern to use. + * @param str The string to match against the pattern. + * @param marker The marker value to find the group of. + * + * @return The matching group number. + * + * @throws IllegalArgumentException No group matches the marker. + */ + private static int findGroup(Pattern pat, String str, String marker) { + Matcher m = pat.matcher(str); + if (!m.find()) + throw new IllegalArgumentException( + "Pattern \"" + pat.pattern() + "\" doesn't match \"" + str + + "\""); + for (int i = 1; i <= m.groupCount(); i++) { + String grp = m.group(i); + if (grp != null && grp.equals(marker)) + return i; + } + throw new IllegalArgumentException( + "\"" + marker + "\" not found in \"" + pat.pattern() + "\""); + } + + /** + * Returns the color specification from the matcher, or null if + * there is none. + * + * @param m The matcher for the format part. + * + * @return The color specification or null. + */ + private static Color getColor(Matcher m) { + String cdesc = m.group(COLOR_GROUP); + if (cdesc == null || cdesc.length() == 0) + return null; + Color c = NAMED_COLORS.get(cdesc); + if (c == null) + logger.warning("Unknown color: " + quote(cdesc)); + return c; + } + + /** + * Returns the condition specification from the matcher, or null if + * there is none. + * + * @param m The matcher for the format part. + * + * @return The condition specification or null. + */ + private CellFormatCondition getCondition(Matcher m) { + String mdesc = m.group(CONDITION_OPERATOR_GROUP); + if (mdesc == null || mdesc.length() == 0) + return null; + return CellFormatCondition.getInstance(m.group( + CONDITION_OPERATOR_GROUP), m.group(CONDITION_VALUE_GROUP)); + } + + /** + * Returns the formatter object implied by the format specification for the + * format part. + * + * @param matcher The matcher for the format part. + * + * @return The formatter. + */ + private CellFormatter getFormatter(Matcher matcher) { + String fdesc = matcher.group(SPECIFICATION_GROUP); + CellFormatType type = formatType(fdesc); + return type.formatter(fdesc); + } + + /** + * Returns the type of format. + * + * @param fdesc The format specification + * + * @return The type of format. + */ + private CellFormatType formatType(String fdesc) { + fdesc = fdesc.trim(); + if (fdesc.equals("") || fdesc.equalsIgnoreCase("General")) + return CellFormatType.GENERAL; + + Matcher m = SPECIFICATION_PAT.matcher(fdesc); + boolean couldBeDate = false; + boolean seenZero = false; + while (m.find()) { + String repl = m.group(0); + if (repl.length() > 0) { + switch (repl.charAt(0)) { + case '@': + return CellFormatType.TEXT; + case 'd': + case 'D': + case 'y': + case 'Y': + return CellFormatType.DATE; + case 'h': + case 'H': + case 'm': + case 'M': + case 's': + case 'S': + // These can be part of date, or elapsed + couldBeDate = true; + break; + case '0': + // This can be part of date, elapsed, or number + seenZero = true; + break; + case '[': + return CellFormatType.ELAPSED; + case '#': + case '?': + return CellFormatType.NUMBER; + } + } + } + + // Nothing definitive was found, so we figure out it deductively + if (couldBeDate) + return CellFormatType.DATE; + if (seenZero) + return CellFormatType.NUMBER; + return CellFormatType.TEXT; + } + + /** + * Returns a version of the original string that has any special characters + * quoted (or escaped) as appropriate for the cell format type. The format + * type object is queried to see what is special. + * + * @param repl The original string. + * @param type The format type representation object. + * + * @return A version of the string with any special characters replaced. + * + * @see CellFormatType#isSpecial(char) + */ + static String quoteSpecial(String repl, CellFormatType type) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < repl.length(); i++) { + char ch = repl.charAt(i); + if (ch == '\'' && type.isSpecial('\'')) { + sb.append('\u0000'); + continue; + } + + boolean special = type.isSpecial(ch); + if (special) + sb.append("'"); + sb.append(ch); + if (special) + sb.append("'"); + } + return sb.toString(); + } + + /** + * Apply this format part to the given value. This returns a {@link + * CellFormatResult} object with the results. + * + * @param value The value to apply this format part to. + * + * @return A {@link CellFormatResult} object containing the results of + * applying the format to the value. + */ + public CellFormatResult apply(Object value) { + boolean applies = applies(value); + String text; + Color textColor; + if (applies) { + text = format.format(value); + textColor = color; + } else { + text = format.simpleFormat(value); + textColor = null; + } + return new CellFormatResult(applies, text, textColor); + } + + /** + * Apply this format part to the given value, applying the result to the + * given label. + * + * @param label The label + * @param value The value to apply this format part to. + * + * @return true if the + */ + public CellFormatResult apply(JLabel label, Object value) { + CellFormatResult result = apply(value); + label.setText(result.text); + if (result.textColor != null) { + label.setForeground(result.textColor); + } + return result; + } + + public static StringBuffer parseFormat(String fdesc, CellFormatType type, + PartHandler partHandler) { + + // Quoting is very awkward. In the Java classes, quoting is done + // between ' chars, with '' meaning a single ' char. The problem is that + // in Excel, it is legal to have two adjacent escaped strings. For + // example, consider the Excel format "\a\b#". The naive (and easy) + // translation into Java DecimalFormat is "'a''b'#". For the number 17, + // in Excel you would get "ab17", but in Java it would be "a'b17" -- the + // '' is in the middle of the quoted string in Java. So the trick we + // use is this: When we encounter a ' char in the Excel format, we + // output a \u0000 char into the string. Now we know that any '' in the + // output is the result of two adjacent escaped strings. So after the + // main loop, we have to do two passes: One to eliminate any '' + // sequences, to make "'a''b'" become "'ab'", and another to replace any + // \u0000 with '' to mean a quote char. Oy. + // + // For formats that don't use "'" we don't do any of this + Matcher m = SPECIFICATION_PAT.matcher(fdesc); + StringBuffer fmt = new StringBuffer(); + while (m.find()) { + String part = group(m, 0); + if (part.length() > 0) { + String repl = partHandler.handlePart(m, part, type, fmt); + if (repl == null) { + switch (part.charAt(0)) { + case '\"': + repl = quoteSpecial(part.substring(1, + part.length() - 1), type); + break; + case '\\': + repl = quoteSpecial(part.substring(1), type); + break; + case '_': + repl = " "; + break; + case '*': //!! We don't do this for real, we just put in 3 of them + repl = expandChar(part); + break; + default: + repl = part; + break; + } + } + m.appendReplacement(fmt, Matcher.quoteReplacement(repl)); + } + } + m.appendTail(fmt); + + if (type.isSpecial('\'')) { + // Now the next pass for quoted characters: Remove '' chars, making "'a''b'" into "'ab'" + int pos = 0; + while ((pos = fmt.indexOf("''", pos)) >= 0) { + fmt.delete(pos, pos + 2); + } + + // Now the final pass for quoted chars: Replace any \u0000 with '' + pos = 0; + while ((pos = fmt.indexOf("\u0000", pos)) >= 0) { + fmt.replace(pos, pos + 1, "''"); + } + } + + return fmt; + } + + /** + * Expands a character. This is only partly done, because we don't have the + * correct info. In Excel, this would be expanded to fill the rest of the + * cell, but we don't know, in general, what the "rest of the cell" is. + * + * @param part The character to be repeated is the second character in this + * string. + * + * @return The character repeated three times. + */ + static String expandChar(String part) { + String repl; + char ch = part.charAt(1); + repl = "" + ch + ch + ch; + return repl; + } + + /** + * Returns the string from the group, or "" if the group is + * null. + * + * @param m The matcher. + * @param g The group number. + * + * @return The group or "". + */ + public static String group(Matcher m, int g) { + String str = m.group(g); + return (str == null ? "" : str); + } +} \ No newline at end of file diff --git a/src/java/org/apache/poi/ss/format/CellFormatResult.java b/src/java/org/apache/poi/ss/format/CellFormatResult.java new file mode 100644 index 0000000000..3c45de3de6 --- /dev/null +++ b/src/java/org/apache/poi/ss/format/CellFormatResult.java @@ -0,0 +1,58 @@ +/* ==================================================================== + 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.ss.format; + +import java.awt.*; + +/** + * This object contains the result of applying a cell format or cell format part + * to a value. + * + * @author Ken Arnold, Industrious Media LLC + * @see CellFormatPart#apply(Object) + * @see CellFormat#apply(Object) + */ +public class CellFormatResult { + /** + * This is true if no condition was given that applied to the + * value, or if the condition is satisfied. If a condition is relevant, and + * when applied the value fails the test, this is false. + */ + public final boolean applies; + + /** The resulting text. This will never be null. */ + public final String text; + + /** + * The color the format sets, or null if the format sets no color. + * This will always be null if {@link #applies} is false. + */ + public final Color textColor; + + /** + * Creates a new format result object. + * + * @param applies The value for {@link #applies}. + * @param text The value for {@link #text}. + * @param textColor The value for {@link #textColor}. + */ + public CellFormatResult(boolean applies, String text, Color textColor) { + this.applies = applies; + this.text = text; + this.textColor = (applies ? textColor : null); + } +} \ No newline at end of file diff --git a/src/java/org/apache/poi/ss/format/CellFormatType.java b/src/java/org/apache/poi/ss/format/CellFormatType.java new file mode 100644 index 0000000000..363af1c483 --- /dev/null +++ b/src/java/org/apache/poi/ss/format/CellFormatType.java @@ -0,0 +1,74 @@ +package org.apache.poi.ss.format; + +/** + * The different kinds of formats that the formatter understands. + * + * @author Ken Arnold, Industrious Media LLC + */ +public enum CellFormatType { + + /** The general (default) format; also used for "General". */ + GENERAL { + CellFormatter formatter(String pattern) { + return new CellGeneralFormatter(); + } + boolean isSpecial(char ch) { + return false; + } + }, + /** A numeric format. */ + NUMBER { + boolean isSpecial(char ch) { + return false; + } + CellFormatter formatter(String pattern) { + return new CellNumberFormatter(pattern); + } + }, + /** A date format. */ + DATE { + boolean isSpecial(char ch) { + return ch == '\'' || (ch <= '\u007f' && Character.isLetter(ch)); + } + CellFormatter formatter(String pattern) { + return new CellDateFormatter(pattern); + } + }, + /** An elapsed time format. */ + ELAPSED { + boolean isSpecial(char ch) { + return false; + } + CellFormatter formatter(String pattern) { + return new CellElapsedFormatter(pattern); + } + }, + /** A text format. */ + TEXT { + boolean isSpecial(char ch) { + return false; + } + CellFormatter formatter(String pattern) { + return new CellTextFormatter(pattern); + } + }; + + /** + * Returns true if the format is special and needs to be quoted. + * + * @param ch The character to test. + * + * @return true if the format is special and needs to be quoted. + */ + abstract boolean isSpecial(char ch); + + /** + * Returns a new formatter of the appropriate type, for the given pattern. + * The pattern must be appropriate for the type. + * + * @param pattern The pattern to use. + * + * @return A new formatter of the appropriate type, for the given pattern. + */ + abstract CellFormatter formatter(String pattern); +} \ No newline at end of file diff --git a/src/java/org/apache/poi/ss/format/CellFormatter.java b/src/java/org/apache/poi/ss/format/CellFormatter.java new file mode 100644 index 0000000000..a125181200 --- /dev/null +++ b/src/java/org/apache/poi/ss/format/CellFormatter.java @@ -0,0 +1,102 @@ +/* ==================================================================== + 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.ss.format; + +import java.util.Locale; +import java.util.logging.Logger; + +/** + * This is the abstract supertype for the various cell formatters. + * + * @@author Ken Arnold, Industrious Media LLC + */ +public abstract class CellFormatter { + /** The original specified format. */ + protected final String format; + + /** + * This is the locale used to get a consistent format result from which to + * work. + */ + public static final Locale LOCALE = Locale.US; + + /** + * Creates a new formatter object, storing the format in {@link #format}. + * + * @param format The format. + */ + public CellFormatter(String format) { + this.format = format; + } + + /** The logger to use in the formatting code. */ + static final Logger logger = Logger.getLogger( + CellFormatter.class.getName()); + + /** + * Format a value according the format string. + * + * @param toAppendTo The buffer to append to. + * @param value The value to format. + */ + public abstract void formatValue(StringBuffer toAppendTo, Object value); + + /** + * Format a value according to the type, in the most basic way. + * + * @param toAppendTo The buffer to append to. + * @param value The value to format. + */ + public abstract void simpleValue(StringBuffer toAppendTo, Object value); + + /** + * Formats the value, returning the resulting string. + * + * @param value The value to format. + * + * @return The value, formatted. + */ + public String format(Object value) { + StringBuffer sb = new StringBuffer(); + formatValue(sb, value); + return sb.toString(); + } + + /** + * Formats the value in the most basic way, returning the resulting string. + * + * @param value The value to format. + * + * @return The value, formatted. + */ + public String simpleFormat(Object value) { + StringBuffer sb = new StringBuffer(); + simpleValue(sb, value); + return sb.toString(); + } + + /** + * Returns the input string, surrounded by quotes. + * + * @param str The string to quote. + * + * @return The input string, surrounded by quotes. + */ + static String quote(String str) { + return '"' + str + '"'; + } +} \ No newline at end of file diff --git a/src/java/org/apache/poi/ss/format/CellGeneralFormatter.java b/src/java/org/apache/poi/ss/format/CellGeneralFormatter.java new file mode 100644 index 0000000000..e2adc61c0c --- /dev/null +++ b/src/java/org/apache/poi/ss/format/CellGeneralFormatter.java @@ -0,0 +1,84 @@ +/* ==================================================================== + 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.ss.format; + +import java.util.Formatter; + +/** + * A formatter for the default "General" cell format. + * + * @author Ken Arnold, Industrious Media LLC + */ +public class CellGeneralFormatter extends CellFormatter { + /** Creates a new general formatter. */ + public CellGeneralFormatter() { + super("General"); + } + + /** + * The general style is not quite the same as any other, or any combination + * of others. + * + * @param toAppendTo The buffer to append to. + * @param value The value to format. + */ + public void formatValue(StringBuffer toAppendTo, Object value) { + if (value instanceof Number) { + double val = ((Number) value).doubleValue(); + if (val == 0) { + toAppendTo.append('0'); + return; + } + + String fmt; + double exp = Math.log10(Math.abs(val)); + boolean stripZeros = true; + if (exp > 10 || exp < -9) + fmt = "%1.5E"; + else if ((long) val != val) + fmt = "%1.9f"; + else { + fmt = "%1.0f"; + stripZeros = false; + } + + Formatter formatter = new Formatter(toAppendTo); + formatter.format(LOCALE, fmt, value); + if (stripZeros) { + // strip off trailing zeros + int removeFrom; + if (fmt.endsWith("E")) + removeFrom = toAppendTo.lastIndexOf("E") - 1; + else + removeFrom = toAppendTo.length() - 1; + while (toAppendTo.charAt(removeFrom) == '0') { + toAppendTo.deleteCharAt(removeFrom--); + } + if (toAppendTo.charAt(removeFrom) == '.') { + toAppendTo.deleteCharAt(removeFrom--); + } + } + } else { + toAppendTo.append(value.toString()); + } + } + + /** Equivalent to {@link #formatValue(StringBuffer,Object)}. {@inheritDoc}. */ + public void simpleValue(StringBuffer toAppendTo, Object value) { + formatValue(toAppendTo, value); + } +} \ No newline at end of file diff --git a/src/java/org/apache/poi/ss/format/CellNumberFormatter.java b/src/java/org/apache/poi/ss/format/CellNumberFormatter.java new file mode 100644 index 0000000000..8276afda49 --- /dev/null +++ b/src/java/org/apache/poi/ss/format/CellNumberFormatter.java @@ -0,0 +1,1085 @@ +/* ==================================================================== + 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.ss.format; + +import org.apache.poi.ss.format.CellFormatPart.PartHandler; + +import java.text.DecimalFormat; +import java.text.FieldPosition; +import java.util.BitSet; +import java.util.Collections; +import java.util.Formatter; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; +import java.util.Set; +import java.util.TreeSet; +import java.util.regex.Matcher; + +/** + * This class implements printing out a value using a number format. + * + * @author Ken Arnold, Industrious Media LLC + */ +public class CellNumberFormatter extends CellFormatter { + private final String desc; + private String printfFmt; + private double scale; + private Special decimalPoint; + private Special slash; + private Special exponent; + private Special numerator; + private Special afterInteger; + private Special afterFractional; + private boolean integerCommas; + private final List specials; + private List integerSpecials; + private List fractionalSpecials; + private List numeratorSpecials; + private List denominatorSpecials; + private List exponentSpecials; + private List exponentDigitSpecials; + private int maxDenominator; + private String numeratorFmt; + private String denominatorFmt; + private boolean improperFraction; + private DecimalFormat decimalFmt; + + static final CellFormatter SIMPLE_NUMBER = new CellFormatter("General") { + public void formatValue(StringBuffer toAppendTo, Object value) { + if (value == null) + return; + if (value instanceof Number) { + Number num = (Number) value; + if (num.doubleValue() % 1.0 == 0) + SIMPLE_INT.formatValue(toAppendTo, value); + else + SIMPLE_FLOAT.formatValue(toAppendTo, value); + } else { + CellTextFormatter.SIMPLE_TEXT.formatValue(toAppendTo, value); + } + } + + public void simpleValue(StringBuffer toAppendTo, Object value) { + formatValue(toAppendTo, value); + } + }; + + private static final CellFormatter SIMPLE_INT = new CellNumberFormatter( + "#"); + private static final CellFormatter SIMPLE_FLOAT = new CellNumberFormatter( + "#.#"); + + /** + * This class is used to mark where the special characters in the format + * are, as opposed to the other characters that are simply printed. + */ + static class Special { + final char ch; + int pos; + + Special(char ch, int pos) { + this.ch = ch; + this.pos = pos; + } + + @Override + public String toString() { + return "'" + ch + "' @ " + pos; + } + } + + /** + * This class represents a single modification to a result string. The way + * this works is complicated, but so is numeric formatting. In general, for + * most formats, we use a DecimalFormat object that will put the string out + * in a known format, usually with all possible leading and trailing zeros. + * We then walk through the result and the orginal format, and note any + * modifications that need to be made. Finally, we go through and apply + * them all, dealing with overlapping modifications. + */ + static class StringMod implements Comparable { + final Special special; + final int op; + CharSequence toAdd; + Special end; + boolean startInclusive; + boolean endInclusive; + + public static final int BEFORE = 1; + public static final int AFTER = 2; + public static final int REPLACE = 3; + + private StringMod(Special special, CharSequence toAdd, int op) { + this.special = special; + this.toAdd = toAdd; + this.op = op; + } + + public StringMod(Special start, boolean startInclusive, Special end, + boolean endInclusive, char toAdd) { + this(start, startInclusive, end, endInclusive); + this.toAdd = toAdd + ""; + } + + public StringMod(Special start, boolean startInclusive, Special end, + boolean endInclusive) { + special = start; + this.startInclusive = startInclusive; + this.end = end; + this.endInclusive = endInclusive; + op = REPLACE; + toAdd = ""; + } + + public int compareTo(StringMod that) { + int diff = special.pos - that.special.pos; + if (diff != 0) + return diff; + else + return op - that.op; + } + + @Override + public boolean equals(Object that) { + try { + return compareTo((StringMod) that) == 0; + } catch (RuntimeException ignored) { + // NullPointerException or CastException + return false; + } + } + + @Override + public int hashCode() { + return special.hashCode() + op; + } + } + + private class NumPartHandler implements PartHandler { + private char insertSignForExponent; + + public String handlePart(Matcher m, String part, CellFormatType type, + StringBuffer desc) { + int pos = desc.length(); + char firstCh = part.charAt(0); + switch (firstCh) { + case 'e': + case 'E': + // See comment in writeScientific -- exponent handling is complex. + // (1) When parsing the format, remove the sign from after the 'e' and + // put it before the first digit of the exponent. + if (exponent == null && specials.size() > 0) { + specials.add(exponent = new Special('.', pos)); + insertSignForExponent = part.charAt(1); + return part.substring(0, 1); + } + break; + + case '0': + case '?': + case '#': + if (insertSignForExponent != '\0') { + specials.add(new Special(insertSignForExponent, pos)); + desc.append(insertSignForExponent); + insertSignForExponent = '\0'; + pos++; + } + for (int i = 0; i < part.length(); i++) { + char ch = part.charAt(i); + specials.add(new Special(ch, pos + i)); + } + break; + + case '.': + if (decimalPoint == null && specials.size() > 0) + specials.add(decimalPoint = new Special('.', pos)); + break; + + case '/': + //!! This assumes there is a numerator and a denominator, but these are actually optional + if (slash == null && specials.size() > 0) { + numerator = previousNumber(); + // If the first number in the whole format is the numerator, the + // entire number should be printed as an improper fraction + if (numerator == firstDigit(specials)) + improperFraction = true; + specials.add(slash = new Special('.', pos)); + } + break; + + case '%': + // don't need to remember because we don't need to do anything with these + scale *= 100; + break; + + default: + return null; + } + return part; + } + } + + /** + * Creates a new cell number formatter. + * + * @param format The format to parse. + */ + public CellNumberFormatter(String format) { + super(format); + + scale = 1; + + specials = new LinkedList(); + + NumPartHandler partHandler = new NumPartHandler(); + StringBuffer descBuf = CellFormatPart.parseFormat(format, + CellFormatType.NUMBER, partHandler); + + // These are inconsistent settings, so ditch 'em + if ((decimalPoint != null || exponent != null) && slash != null) { + slash = null; + numerator = null; + } + + interpretCommas(descBuf); + + int precision; + int fractionPartWidth = 0; + if (decimalPoint == null) { + precision = 0; + } else { + precision = interpretPrecision(); + fractionPartWidth = 1 + precision; + if (precision == 0) { + // This means the format has a ".", but that output should have no decimals after it. + // We just stop treating it specially + specials.remove(decimalPoint); + decimalPoint = null; + } + } + + if (precision == 0) + fractionalSpecials = Collections.emptyList(); + else + fractionalSpecials = specials.subList(specials.indexOf( + decimalPoint) + 1, fractionalEnd()); + if (exponent == null) + exponentSpecials = Collections.emptyList(); + else { + int exponentPos = specials.indexOf(exponent); + exponentSpecials = specialsFor(exponentPos, 2); + exponentDigitSpecials = specialsFor(exponentPos + 2); + } + + if (slash == null) { + numeratorSpecials = Collections.emptyList(); + denominatorSpecials = Collections.emptyList(); + } else { + if (numerator == null) + numeratorSpecials = Collections.emptyList(); + else + numeratorSpecials = specialsFor(specials.indexOf(numerator)); + + denominatorSpecials = specialsFor(specials.indexOf(slash) + 1); + if (denominatorSpecials.isEmpty()) { + // no denominator follows the slash, drop the fraction idea + numeratorSpecials = Collections.emptyList(); + } else { + maxDenominator = maxValue(denominatorSpecials); + numeratorFmt = singleNumberFormat(numeratorSpecials); + denominatorFmt = singleNumberFormat(denominatorSpecials); + } + } + + integerSpecials = specials.subList(0, integerEnd()); + + if (exponent == null) { + StringBuffer fmtBuf = new StringBuffer("%"); + + int integerPartWidth = calculateIntegerPartWidth(); + int totalWidth = integerPartWidth + fractionPartWidth; + + fmtBuf.append('0').append(totalWidth).append('.').append(precision); + + fmtBuf.append("f"); + printfFmt = fmtBuf.toString(); + } else { + StringBuffer fmtBuf = new StringBuffer(); + boolean first = true; + List specialList = integerSpecials; + if (integerSpecials.size() == 1) { + // If we don't do this, we get ".6e5" instead of "6e4" + fmtBuf.append("0"); + first = false; + } else + for (Special s : specialList) { + if (isDigitFmt(s)) { + fmtBuf.append(first ? '#' : '0'); + first = false; + } + } + if (fractionalSpecials.size() > 0) { + fmtBuf.append('.'); + for (Special s : fractionalSpecials) { + if (isDigitFmt(s)) { + if (!first) + fmtBuf.append('0'); + first = false; + } + } + } + fmtBuf.append('E'); + placeZeros(fmtBuf, exponentSpecials.subList(2, + exponentSpecials.size())); + decimalFmt = new DecimalFormat(fmtBuf.toString()); + } + + if (exponent != null) + scale = + 1; // in "e" formats,% and trailing commas have no scaling effect + + desc = descBuf.toString(); + } + + private static void placeZeros(StringBuffer sb, List specials) { + for (Special s : specials) { + if (isDigitFmt(s)) + sb.append('0'); + } + } + + private static Special firstDigit(List specials) { + for (Special s : specials) { + if (isDigitFmt(s)) + return s; + } + return null; + } + + static StringMod insertMod(Special special, CharSequence toAdd, int where) { + return new StringMod(special, toAdd, where); + } + + static StringMod deleteMod(Special start, boolean startInclusive, + Special end, boolean endInclusive) { + + return new StringMod(start, startInclusive, end, endInclusive); + } + + static StringMod replaceMod(Special start, boolean startInclusive, + Special end, boolean endInclusive, char withChar) { + + return new StringMod(start, startInclusive, end, endInclusive, + withChar); + } + + private static String singleNumberFormat(List numSpecials) { + return "%0" + numSpecials.size() + "d"; + } + + private static int maxValue(List s) { + return (int) Math.round(Math.pow(10, s.size()) - 1); + } + + private List specialsFor(int pos, int takeFirst) { + if (pos >= specials.size()) + return Collections.emptyList(); + ListIterator it = specials.listIterator(pos + takeFirst); + Special last = it.next(); + int end = pos + takeFirst; + while (it.hasNext()) { + Special s = it.next(); + if (!isDigitFmt(s) || s.pos - last.pos > 1) + break; + end++; + last = s; + } + return specials.subList(pos, end + 1); + } + + private List specialsFor(int pos) { + return specialsFor(pos, 0); + } + + private static boolean isDigitFmt(Special s) { + return s.ch == '0' || s.ch == '?' || s.ch == '#'; + } + + private Special previousNumber() { + ListIterator it = specials.listIterator(specials.size()); + while (it.hasPrevious()) { + Special s = it.previous(); + if (isDigitFmt(s)) { + Special numStart = s; + Special last = s; + while (it.hasPrevious()) { + s = it.previous(); + if (last.pos - s.pos > 1) // it has to be continuous digits + break; + if (isDigitFmt(s)) + numStart = s; + else + break; + last = s; + } + return numStart; + } + } + return null; + } + + private int calculateIntegerPartWidth() { + ListIterator it = specials.listIterator(); + int digitCount = 0; + while (it.hasNext()) { + Special s = it.next(); + //!! Handle fractions: The previous set of digits before that is the numerator, so we should stop short of that + if (s == afterInteger) + break; + else if (isDigitFmt(s)) + digitCount++; + } + return digitCount; + } + + private int interpretPrecision() { + if (decimalPoint == null) { + return -1; + } else { + int precision = 0; + ListIterator it = specials.listIterator(specials.indexOf( + decimalPoint)); + if (it.hasNext()) + it.next(); // skip over the decimal point itself + while (it.hasNext()) { + Special s = it.next(); + if (isDigitFmt(s)) + precision++; + else + break; + } + return precision; + } + } + + private void interpretCommas(StringBuffer sb) { + // In the integer part, commas at the end are scaling commas; other commas mean to show thousand-grouping commas + ListIterator it = specials.listIterator(integerEnd()); + + boolean stillScaling = true; + integerCommas = false; + while (it.hasPrevious()) { + Special s = it.previous(); + if (s.ch != ',') { + stillScaling = false; + } else { + if (stillScaling) { + scale /= 1000; + } else { + integerCommas = true; + } + } + } + + if (decimalPoint != null) { + it = specials.listIterator(fractionalEnd()); + while (it.hasPrevious()) { + Special s = it.previous(); + if (s.ch != ',') { + break; + } else { + scale /= 1000; + } + } + } + + // Now strip them out -- we only need their interpretation, not their presence + it = specials.listIterator(); + int removed = 0; + while (it.hasNext()) { + Special s = it.next(); + s.pos -= removed; + if (s.ch == ',') { + removed++; + it.remove(); + sb.deleteCharAt(s.pos); + } + } + } + + private int integerEnd() { + if (decimalPoint != null) + afterInteger = decimalPoint; + else if (exponent != null) + afterInteger = exponent; + else if (numerator != null) + afterInteger = numerator; + else + afterInteger = null; + return afterInteger == null ? specials.size() : specials.indexOf( + afterInteger); + } + + private int fractionalEnd() { + int end; + if (exponent != null) + afterFractional = exponent; + else if (numerator != null) + afterInteger = numerator; + else + afterFractional = null; + end = afterFractional == null ? specials.size() : specials.indexOf( + afterFractional); + return end; + } + + /** {@inheritDoc} */ + public void formatValue(StringBuffer toAppendTo, Object valueObject) { + double value = ((Number) valueObject).doubleValue(); + value *= scale; + + // the '-' sign goes at the front, always, so we pick it out + boolean negative = value < 0; + if (negative) + value = -value; + + // Split out the fractional part if we need to print a fraction + double fractional = 0; + if (slash != null) { + if (improperFraction) { + fractional = value; + value = 0; + } else { + fractional = value % 1.0; + //noinspection SillyAssignment + value = (long) value; + } + } + + Set mods = new TreeSet(); + StringBuffer output = new StringBuffer(desc); + + if (exponent != null) { + writeScientific(value, output, mods); + } else if (improperFraction) { + writeFraction(value, null, fractional, output, mods); + } else { + StringBuffer result = new StringBuffer(); + Formatter f = new Formatter(result); + f.format(LOCALE, printfFmt, value); + + if (numerator == null) { + writeFractional(result, output); + writeInteger(result, output, integerSpecials, mods, + integerCommas); + } else { + writeFraction(value, result, fractional, output, mods); + } + } + + // Now strip out any remaining '#'s and add any pending text ... + ListIterator it = specials.listIterator(); + Iterator changes = mods.iterator(); + StringMod nextChange = (changes.hasNext() ? changes.next() : null); + int adjust = 0; + BitSet deletedChars = new BitSet(); // records chars already deleted + while (it.hasNext()) { + Special s = it.next(); + int adjustedPos = s.pos + adjust; + if (!deletedChars.get(s.pos) && output.charAt(adjustedPos) == '#') { + output.deleteCharAt(adjustedPos); + adjust--; + deletedChars.set(s.pos); + } + while (nextChange != null && s == nextChange.special) { + int lenBefore = output.length(); + int modPos = s.pos + adjust; + int posTweak = 0; + switch (nextChange.op) { + case StringMod.AFTER: + // ignore adding a comma after a deleted char (which was a '#') + if (nextChange.toAdd.equals(",") && deletedChars.get(s.pos)) + break; + posTweak = 1; + //noinspection fallthrough + case StringMod.BEFORE: + output.insert(modPos + posTweak, nextChange.toAdd); + break; + + case StringMod.REPLACE: + int delPos = + s.pos; // delete starting pos in original coordinates + if (!nextChange.startInclusive) { + delPos++; + modPos++; + } + + // Skip over anything already deleted + while (deletedChars.get(delPos)) { + delPos++; + modPos++; + } + + int delEndPos = + nextChange.end.pos; // delete end point in original + if (nextChange.endInclusive) + delEndPos++; + + int modEndPos = + delEndPos + adjust; // delete end point in current + + if (modPos < modEndPos) { + if (nextChange.toAdd == "") + output.delete(modPos, modEndPos); + else { + char fillCh = nextChange.toAdd.charAt(0); + for (int i = modPos; i < modEndPos; i++) + output.setCharAt(i, fillCh); + } + deletedChars.set(delPos, delEndPos); + } + break; + + default: + throw new IllegalStateException( + "Unknown op: " + nextChange.op); + } + adjust += output.length() - lenBefore; + + if (changes.hasNext()) + nextChange = changes.next(); + else + nextChange = null; + } + } + + // Finally, add it to the string + if (negative) + toAppendTo.append('-'); + toAppendTo.append(output); + } + + private void writeScientific(double value, StringBuffer output, + Set mods) { + + StringBuffer result = new StringBuffer(); + FieldPosition fractionPos = new FieldPosition( + DecimalFormat.FRACTION_FIELD); + decimalFmt.format(value, result, fractionPos); + writeInteger(result, output, integerSpecials, mods, integerCommas); + writeFractional(result, output); + + /* + * Exponent sign handling is complex. + * + * In DecimalFormat, you never put the sign in the format, and the sign only + * comes out of the format if it is negative. + * + * In Excel, you always say whether to always show the sign ("e+") or only + * show negative signs ("e-"). + * + * Also in Excel, where you put the sign in the format is NOT where it comes + * out in the result. In the format, the sign goes with the "e"; in the + * output it goes with the exponent value. That is, if you say "#e-|#" you + * get "1e|-5", not "1e-|5". This makes sense I suppose, but it complicates + * things. + * + * Finally, everything else in this formatting code assumes that the base of + * the result is the original format, and that starting from that situation, + * the indexes of the original special characters can be used to place the new + * characters. As just described, this is not true for the exponent's sign. + *

+ * So here is how we handle it: + * + * (1) When parsing the format, remove the sign from after the 'e' and put it + * before the first digit of the exponent (where it will be shown). + * + * (2) Determine the result's sign. + * + * (3) If it's missing, put the sign into the output to keep the result + * lined up with the output. (In the result, "after the 'e'" and "before the + * first digit" are the same because the result has no extra chars to be in + * the way.) + * + * (4) In the output, remove the sign if it should not be shown ("e-" was used + * and the sign is negative) or set it to the correct value. + */ + + // (2) Determine the result's sign. + int ePos = fractionPos.getEndIndex(); + int signPos = ePos + 1; + char expSignRes = result.charAt(signPos); + if (expSignRes != '-') { + // not a sign, so it's a digit, and therefore a positive exponent + expSignRes = '+'; + // (3) If it's missing, put the sign into the output to keep the result + // lined up with the output. + result.insert(signPos, '+'); + } + + // Now the result lines up like it is supposed to with the specials' indexes + ListIterator it = exponentSpecials.listIterator(1); + Special expSign = it.next(); + char expSignFmt = expSign.ch; + + // (4) In the output, remove the sign if it should not be shown or set it to + // the correct value. + if (expSignRes == '-' || expSignFmt == '+') + mods.add(replaceMod(expSign, true, expSign, true, expSignRes)); + else + mods.add(deleteMod(expSign, true, expSign, true)); + + StringBuffer exponentNum = new StringBuffer(result.substring( + signPos + 1)); + writeInteger(exponentNum, output, exponentDigitSpecials, mods, false); + } + + private void writeFraction(double value, StringBuffer result, + double fractional, StringBuffer output, Set mods) { + + // Figure out if we are to suppress either the integer or fractional part. + // With # the suppressed part is removed; with ? it is replaced with spaces. + if (!improperFraction) { + // If fractional part is zero, and numerator doesn't have '0', write out + // only the integer part and strip the rest. + if (fractional == 0 && !hasChar('0', numeratorSpecials)) { + writeInteger(result, output, integerSpecials, mods, false); + + Special start = integerSpecials.get(integerSpecials.size() - 1); + Special end = denominatorSpecials.get( + denominatorSpecials.size() - 1); + if (hasChar('?', integerSpecials, numeratorSpecials, + denominatorSpecials)) { + //if any format has '?', then replace the fraction with spaces + mods.add(replaceMod(start, false, end, true, ' ')); + } else { + // otherwise, remove the fraction + mods.add(deleteMod(start, false, end, true)); + } + + // That's all, just return + return; + } else { + // New we check to see if we should remove the integer part + boolean allZero = (value == 0 && fractional == 0); + boolean willShowFraction = fractional != 0 || hasChar('0', + numeratorSpecials); + boolean removeBecauseZero = allZero && (hasOnly('#', + integerSpecials) || !hasChar('0', numeratorSpecials)); + boolean removeBecauseFraction = + !allZero && value == 0 && willShowFraction && !hasChar( + '0', integerSpecials); + if (removeBecauseZero || removeBecauseFraction) { + Special start = integerSpecials.get( + integerSpecials.size() - 1); + if (hasChar('?', integerSpecials, numeratorSpecials)) { + mods.add(replaceMod(start, true, numerator, false, + ' ')); + } else { + mods.add(deleteMod(start, true, numerator, false)); + } + } else { + // Not removing the integer part -- print it out + writeInteger(result, output, integerSpecials, mods, false); + } + } + } + + // Calculate and print the actual fraction (improper or otherwise) + try { + int n; + int d; + // the "fractional % 1" captures integer values in improper fractions + if (fractional == 0 || (improperFraction && fractional % 1 == 0)) { + // 0 as a fraction is reported by excel as 0/1 + n = (int) Math.round(fractional); + d = 1; + } else { + Fraction frac = new Fraction(fractional, maxDenominator); + n = frac.getNumerator(); + d = frac.getDenominator(); + } + if (improperFraction) + n += Math.round(value * d); + writeSingleInteger(numeratorFmt, n, output, numeratorSpecials, + mods); + writeSingleInteger(denominatorFmt, d, output, denominatorSpecials, + mods); + } catch (RuntimeException ignored) { + ignored.printStackTrace(); + } + } + + private static boolean hasChar(char ch, List... numSpecials) { + for (List specials : numSpecials) { + for (Special s : specials) { + if (s.ch == ch) { + return true; + } + } + } + return false; + } + + private static boolean hasOnly(char ch, List... numSpecials) { + for (List specials : numSpecials) { + for (Special s : specials) { + if (s.ch != ch) { + return false; + } + } + } + return true; + } + + private void writeSingleInteger(String fmt, int num, StringBuffer output, + List numSpecials, Set mods) { + + StringBuffer sb = new StringBuffer(); + Formatter formatter = new Formatter(sb); + formatter.format(LOCALE, fmt, num); + writeInteger(sb, output, numSpecials, mods, false); + } + + private void writeInteger(StringBuffer result, StringBuffer output, + List numSpecials, Set mods, + boolean showCommas) { + + int pos = result.indexOf(".") - 1; + if (pos < 0) { + if (exponent != null && numSpecials == integerSpecials) + pos = result.indexOf("E") - 1; + else + pos = result.length() - 1; + } + + int strip; + for (strip = 0; strip < pos; strip++) { + char resultCh = result.charAt(strip); + if (resultCh != '0' && resultCh != ',') + break; + } + + ListIterator it = numSpecials.listIterator(numSpecials.size()); + boolean followWithComma = false; + Special lastOutputIntegerDigit = null; + int digit = 0; + while (it.hasPrevious()) { + char resultCh; + if (pos >= 0) + resultCh = result.charAt(pos); + else { + // If result is shorter than field, pretend there are leading zeros + resultCh = '0'; + } + Special s = it.previous(); + followWithComma = showCommas && digit > 0 && digit % 3 == 0; + boolean zeroStrip = false; + if (resultCh != '0' || s.ch == '0' || s.ch == '?' || pos >= strip) { + zeroStrip = s.ch == '?' && pos < strip; + output.setCharAt(s.pos, (zeroStrip ? ' ' : resultCh)); + lastOutputIntegerDigit = s; + } + if (followWithComma) { + mods.add(insertMod(s, zeroStrip ? " " : ",", StringMod.AFTER)); + followWithComma = false; + } + digit++; + --pos; + } + StringBuffer extraLeadingDigits = new StringBuffer(); + if (pos >= 0) { + // We ran out of places to put digits before we ran out of digits; put this aside so we can add it later + ++pos; // pos was decremented at the end of the loop above when the iterator was at its end + extraLeadingDigits = new StringBuffer(result.substring(0, pos)); + if (showCommas) { + while (pos > 0) { + if (digit > 0 && digit % 3 == 0) + extraLeadingDigits.insert(pos, ','); + digit++; + --pos; + } + } + mods.add(insertMod(lastOutputIntegerDigit, extraLeadingDigits, + StringMod.BEFORE)); + } + } + + private void writeFractional(StringBuffer result, StringBuffer output) { + int digit; + int strip; + ListIterator it; + if (fractionalSpecials.size() > 0) { + digit = result.indexOf(".") + 1; + if (exponent != null) + strip = result.indexOf("e") - 1; + else + strip = result.length() - 1; + while (strip > digit && result.charAt(strip) == '0') + strip--; + it = fractionalSpecials.listIterator(); + while (it.hasNext()) { + Special s = it.next(); + char resultCh = result.charAt(digit); + if (resultCh != '0' || s.ch == '0' || digit < strip) + output.setCharAt(s.pos, resultCh); + else if (s.ch == '?') { + // This is when we're in trailing zeros, and the format is '?'. We still strip out remaining '#'s later + output.setCharAt(s.pos, ' '); + } + digit++; + } + } + } + + /** + * {@inheritDoc} + *

+ * For a number, this is "#" for integer values, and "#.#" + * for floating-point values. + */ + public void simpleValue(StringBuffer toAppendTo, Object value) { + SIMPLE_NUMBER.formatValue(toAppendTo, value); + } + + /** + * Based on org.apache.commons.math.fraction.Fraction from Apache Commons-Math. + * YK: The only reason of having this inner class is to avoid dependency on the Commons-Math jar. + */ + private static class Fraction { + /** The denominator. */ + private final int denominator; + + /** The numerator. */ + private final int numerator; + + /** + * Create a fraction given the double value and either the maximum error + * allowed or the maximum number of denominator digits. + * + * @param value the double value to convert to a fraction. + * @param epsilon maximum error allowed. The resulting fraction is within + * epsilon of value, in absolute terms. + * @param maxDenominator maximum denominator value allowed. + * @param maxIterations maximum number of convergents + * @throws RuntimeException if the continued fraction failed to + * converge. + */ + private Fraction(double value, double epsilon, int maxDenominator, int maxIterations) + { + long overflow = Integer.MAX_VALUE; + double r0 = value; + long a0 = (long)Math.floor(r0); + if (a0 > overflow) { + throw new IllegalArgumentException("Overflow trying to convert "+value+" to fraction ("+a0+"/"+1l+")"); + } + + // check for (almost) integer arguments, which should not go + // to iterations. + if (Math.abs(a0 - value) < epsilon) { + this.numerator = (int) a0; + this.denominator = 1; + return; + } + + long p0 = 1; + long q0 = 0; + long p1 = a0; + long q1 = 1; + + long p2; + long q2; + + int n = 0; + boolean stop = false; + do { + ++n; + double r1 = 1.0 / (r0 - a0); + long a1 = (long)Math.floor(r1); + p2 = (a1 * p1) + p0; + q2 = (a1 * q1) + q0; + if ((p2 > overflow) || (q2 > overflow)) { + throw new RuntimeException("Overflow trying to convert "+value+" to fraction ("+p2+"/"+q2+")"); + } + + double convergent = (double)p2 / (double)q2; + if (n < maxIterations && Math.abs(convergent - value) > epsilon && q2 < maxDenominator) { + p0 = p1; + p1 = p2; + q0 = q1; + q1 = q2; + a0 = a1; + r0 = r1; + } else { + stop = true; + } + } while (!stop); + + if (n >= maxIterations) { + throw new RuntimeException("Unable to convert "+value+" to fraction after "+maxIterations+" iterations"); + } + + if (q2 < maxDenominator) { + this.numerator = (int) p2; + this.denominator = (int) q2; + } else { + this.numerator = (int) p1; + this.denominator = (int) q1; + } + + } + + /** + * Create a fraction given the double value and maximum denominator. + *

+ * References: + *

+ *

+ * @param value the double value to convert to a fraction. + * @param maxDenominator The maximum allowed value for denominator + * @throws RuntimeException if the continued fraction failed to + * converge + */ + public Fraction(double value, int maxDenominator) + { + this(value, 0, maxDenominator, 100); + } + + /** + * Access the denominator. + * @return the denominator. + */ + public int getDenominator() { + return denominator; + } + + /** + * Access the numerator. + * @return the numerator. + */ + public int getNumerator() { + return numerator; + } + + } + +} \ No newline at end of file diff --git a/src/java/org/apache/poi/ss/format/CellTextFormatter.java b/src/java/org/apache/poi/ss/format/CellTextFormatter.java new file mode 100644 index 0000000000..ebefa9847a --- /dev/null +++ b/src/java/org/apache/poi/ss/format/CellTextFormatter.java @@ -0,0 +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.ss.format; + +import org.apache.poi.ss.format.CellFormatPart.PartHandler; + +import java.util.regex.Matcher; + +/** + * This class implements printing out text. + * + * @author Ken Arnold, Industrious Media LLC + */ +public class CellTextFormatter extends CellFormatter { + private final int[] textPos; + private final String desc; + + static final CellFormatter SIMPLE_TEXT = new CellTextFormatter("@"); + + public CellTextFormatter(String format) { + super(format); + + final int[] numPlaces = new int[1]; + + desc = CellFormatPart.parseFormat(format, CellFormatType.TEXT, + new PartHandler() { + public String handlePart(Matcher m, String part, + CellFormatType type, StringBuffer desc) { + if (part.equals("@")) { + numPlaces[0]++; + return "\u0000"; + } + return null; + } + }).toString(); + + // Remember the "@" positions in last-to-first order (to make insertion easier) + textPos = new int[numPlaces[0]]; + int pos = desc.length() - 1; + for (int i = 0; i < textPos.length; i++) { + textPos[i] = desc.lastIndexOf("\u0000", pos); + pos = textPos[i] - 1; + } + } + + /** {@inheritDoc} */ + public void formatValue(StringBuffer toAppendTo, Object obj) { + int start = toAppendTo.length(); + String text = obj.toString(); + toAppendTo.append(desc); + for (int i = 0; i < textPos.length; i++) { + int pos = start + textPos[i]; + toAppendTo.replace(pos, pos + 1, text); + } + } + + /** + * {@inheritDoc} + *

+ * For text, this is just printing the text. + */ + public void simpleValue(StringBuffer toAppendTo, Object value) { + SIMPLE_TEXT.formatValue(toAppendTo, value); + } +} \ No newline at end of file diff --git a/src/java/org/apache/poi/ss/format/package.html b/src/java/org/apache/poi/ss/format/package.html new file mode 100644 index 0000000000..d5ab99fb60 --- /dev/null +++ b/src/java/org/apache/poi/ss/format/package.html @@ -0,0 +1,3 @@ + +This package contains classes that implement cell formatting + diff --git a/src/ooxml/testcases/org/apache/poi/ss/format/TestCellFormatPart.java b/src/ooxml/testcases/org/apache/poi/ss/format/TestCellFormatPart.java new file mode 100644 index 0000000000..bd518369d2 --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/ss/format/TestCellFormatPart.java @@ -0,0 +1,126 @@ +/* ==================================================================== + 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.ss.format; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.xssf.XSSFITestDataProvider; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** Test the individual CellFormatPart types. */ +public class TestCellFormatPart extends CellFormatTestBase { + private static final Pattern NUMBER_EXTRACT_FMT = Pattern.compile( + "([-+]?[0-9]+)(\\.[0-9]+)?.*(?:(e).*?([+-]?[0-9]+))", + Pattern.CASE_INSENSITIVE); + + public TestCellFormatPart() { + super(XSSFITestDataProvider.instance); + } + + public void testGeneralFormat() throws Exception { + runFormatTests("GeneralFormatTests.xlsx", new CellValue() { + public Object getValue(Cell cell) { + int type = CellFormat.ultimateType(cell); + if (type == Cell.CELL_TYPE_BOOLEAN) + return cell.getBooleanCellValue() ? "TRUE" : "FALSE"; + else if (type == Cell.CELL_TYPE_NUMERIC) + return cell.getNumericCellValue(); + else + return cell.getStringCellValue(); + } + }); + } + + public void testNumberFormat() throws Exception { + runFormatTests("NumberFormatTests.xlsx", new CellValue() { + public Object getValue(Cell cell) { + return cell.getNumericCellValue(); + } + }); + } + + public void testNumberApproxFormat() throws Exception { + runFormatTests("NumberFormatApproxTests.xlsx", new CellValue() { + public Object getValue(Cell cell) { + return cell.getNumericCellValue(); + } + + @Override + void equivalent(String expected, String actual, + CellFormatPart format) { + double expectedVal = extractNumber(expected); + double actualVal = extractNumber(actual); + // equal within 1% + double delta = expectedVal / 100; + assertEquals("format \"" + format + "\"," + expected + " ~= " + + actual, expectedVal, actualVal, delta); + } + }); + } + + public void testDateFormat() throws Exception { + runFormatTests("DateFormatTests.xlsx", new CellValue() { + public Object getValue(Cell cell) { + return cell.getDateCellValue(); + } + }); + } + + public void testElapsedFormat() throws Exception { + runFormatTests("ElapsedFormatTests.xlsx", new CellValue() { + public Object getValue(Cell cell) { + return cell.getNumericCellValue(); + } + }); + } + + public void testTextFormat() throws Exception { + runFormatTests("TextFormatTests.xlsx", new CellValue() { + public Object getValue(Cell cell) { + if (CellFormat.ultimateType(cell) == Cell.CELL_TYPE_BOOLEAN) + return cell.getBooleanCellValue() ? "TRUE" : "FALSE"; + else + return cell.getStringCellValue(); + } + }); + } + + public void testConditions() throws Exception { + runFormatTests("FormatConditionTests.xlsx", new CellValue() { + Object getValue(Cell cell) { + return cell.getNumericCellValue(); + } + }); + } + + private double extractNumber(String str) { + Matcher m = NUMBER_EXTRACT_FMT.matcher(str); + if (!m.find()) + throw new IllegalArgumentException( + "Cannot find numer in \"" + str + "\""); + + StringBuffer sb = new StringBuffer(); + // The groups in the pattern are the parts of the number + for (int i = 1; i <= m.groupCount(); i++) { + String part = m.group(i); + if (part != null) + sb.append(part); + } + return Double.valueOf(sb.toString()); + } +} \ No newline at end of file diff --git a/src/testcases/org/apache/poi/ss/format/CellFormatTestBase.java b/src/testcases/org/apache/poi/ss/format/CellFormatTestBase.java new file mode 100644 index 0000000000..6b5c61bc5e --- /dev/null +++ b/src/testcases/org/apache/poi/ss/format/CellFormatTestBase.java @@ -0,0 +1,293 @@ +/* ==================================================================== + 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.ss.format; + +import junit.framework.TestCase; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.ITestDataProvider; + +import javax.swing.*; +import java.awt.*; +import java.util.*; + +import static java.awt.Color.*; +import java.io.IOException; + +/** + * This class is a base class for spreadsheet-based tests, such as are used for + * cell formatting. This reads tests from the spreadsheet, as well as reading + * flags that can be used to paramterize these tests. + *

+ * Each test has four parts: The expected result (column A), the format string + * (column B), the value to format (column C), and a comma-separated list of + * categores that this test falls in. Normally all tests are run, but if the + * flag "Categories" is not empty, only tests that have at least one category + * listed in "Categories" are run. + */ +@SuppressWarnings( + {"JUnitTestCaseWithNoTests", "JUnitTestClassNamingConvention"}) +public class CellFormatTestBase extends TestCase { + private final ITestDataProvider _testDataProvider; + + protected Workbook workbook; + + private String testFile; + private Map testFlags; + private boolean tryAllColors; + private JLabel label; + + private static final String[] COLOR_NAMES = + {"Black", "Red", "Green", "Blue", "Yellow", "Cyan", "Magenta", + "White"}; + private static final Color[] COLORS = + {BLACK, RED, GREEN, BLUE, YELLOW, CYAN, MAGENTA, WHITE}; + + public static final Color TEST_COLOR = ORANGE.darker(); + + protected CellFormatTestBase(ITestDataProvider testDataProvider) { + _testDataProvider = testDataProvider; + } + + abstract static class CellValue { + abstract Object getValue(Cell cell); + + @SuppressWarnings({"UnusedDeclaration"}) + Color getColor(Cell cell) { + return TEST_COLOR; + } + + void equivalent(String expected, String actual, CellFormatPart format) { + assertEquals("format \"" + format + "\"", '"' + expected + '"', + '"' + actual + '"'); + } + } + + protected void runFormatTests(String workbookName, CellValue valueGetter) + throws IOException { + + openWorkbook(workbookName); + + readFlags(workbook); + + Set runCategories = new TreeSet( + String.CASE_INSENSITIVE_ORDER); + String runCategoryList = flagString("Categories", ""); + if (runCategoryList != null) { + runCategories.addAll(Arrays.asList(runCategoryList.split( + "\\s*,\\s*"))); + runCategories.remove(""); // this can be found and means nothing + } + + Sheet sheet = workbook.getSheet("Tests"); + int end = sheet.getLastRowNum(); + // Skip the header row, therefore "+ 1" + for (int r = sheet.getFirstRowNum() + 1; r <= end; r++) { + Row row = sheet.getRow(r); + if (row == null) + continue; + int cellnum = 0; + String expectedText = row.getCell(cellnum).getStringCellValue(); + String format = row.getCell(1).getStringCellValue(); + String testCategoryList = row.getCell(3).getStringCellValue(); + boolean byCategory = runByCategory(runCategories, testCategoryList); + if ((!expectedText.isEmpty() || !format.isEmpty()) && byCategory) { + Cell cell = row.getCell(2); + tryFormat(r, expectedText, format, valueGetter, cell); + } + } + } + + /** + * Open a given workbook. + * + * @param workbookName The workbook name. This is presumed to live in the + * "spreadsheets" directory under the directory named in + * the Java property "POI.testdata.path". + * + * @throws IOException + */ + protected void openWorkbook(String workbookName) + throws IOException { + workbook = _testDataProvider.openSampleWorkbook(workbookName); + workbook.setMissingCellPolicy(Row.CREATE_NULL_AS_BLANK); + testFile = workbookName; + } + + /** + * Read the flags from the workbook. Flags are on the sheet named "Flags", + * and consist of names in column A and values in column B. These are put + * into a map that can be queried later. + * + * @param wb The workbook to look in. + */ + private void readFlags(Workbook wb) { + Sheet flagSheet = wb.getSheet("Flags"); + testFlags = new TreeMap(String.CASE_INSENSITIVE_ORDER); + if (flagSheet != null) { + int end = flagSheet.getLastRowNum(); + // Skip the header row, therefore "+ 1" + for (int r = flagSheet.getFirstRowNum() + 1; r <= end; r++) { + Row row = flagSheet.getRow(r); + if (row == null) + continue; + String flagName = row.getCell(0).getStringCellValue(); + String flagValue = row.getCell(1).getStringCellValue(); + if (flagName.length() > 0) { + testFlags.put(flagName, flagValue); + } + } + } + + tryAllColors = flagBoolean("AllColors", true); + } + + /** + * Returns true if any of the categories for this run are contained + * in the test's listed categories. + * + * @param categories The categories of tests to be run. If this is + * empty, then all tests will be run. + * @param testCategories The categories that this test is in. This is a + * comma-separated list. If any tests in + * this list are in categories, the test will + * be run. + * + * @return true if the test should be run. + */ + private boolean runByCategory(Set categories, + String testCategories) { + + if (categories.isEmpty()) + return true; + // If there are specified categories, find out if this has one of them + for (String category : testCategories.split("\\s*,\\s*")) { + if (categories.contains(category)) { + return true; + } + } + return false; + } + + private void tryFormat(int row, String expectedText, String desc, + CellValue getter, Cell cell) { + + Object value = getter.getValue(cell); + Color testColor = getter.getColor(cell); + if (testColor == null) + testColor = TEST_COLOR; + + if (label == null) + label = new JLabel(); + label.setForeground(testColor); + label.setText("xyzzy"); + + System.out.printf("Row %d: \"%s\" -> \"%s\": expected \"%s\"", row + 1, + String.valueOf(value), desc, expectedText); + System.out.flush(); + String actualText = tryColor(desc, null, getter, value, expectedText, + testColor); + System.out.printf(", actual \"%s\")%n", actualText); + System.out.flush(); + + if (tryAllColors && testColor != TEST_COLOR) { + for (int i = 0; i < COLOR_NAMES.length; i++) { + String cname = COLOR_NAMES[i]; + tryColor(desc, cname, getter, value, expectedText, COLORS[i]); + } + } + } + + private String tryColor(String desc, String cname, CellValue getter, + Object value, String expectedText, Color expectedColor) { + + if (cname != null) + desc = "[" + cname + "]" + desc; + Color origColor = label.getForeground(); + CellFormatPart format = new CellFormatPart(desc); + if (!format.apply(label, value).applies) { + // If this doesn't apply, no color change is expected + expectedColor = origColor; + } + + String actualText = label.getText(); + Color actualColor = label.getForeground(); + getter.equivalent(expectedText, actualText, format); + assertEquals(cname == null ? "no color" : "color " + cname, + expectedColor, actualColor); + return actualText; + } + + /** + * Returns the value for the given flag. The flag has the value of + * true if the text value is "true", "yes", or + * "on" (ignoring case). + * + * @param flagName The name of the flag to fetch. + * @param expected The value for the flag that is expected when the tests + * are run for a full test. If the current value is not the + * expected one, you will get a warning in the test output. + * This is so that you do not accidentally leave a flag set + * to a value that prevents running some tests, thereby + * letting you accidentally release code that is not fully + * tested. + * + * @return The value for the flag. + */ + protected boolean flagBoolean(String flagName, boolean expected) { + String value = testFlags.get(flagName); + boolean isSet; + if (value == null) + isSet = false; + else { + isSet = value.equalsIgnoreCase("true") || value.equalsIgnoreCase( + "yes") || value.equalsIgnoreCase("on"); + } + warnIfUnexpected(flagName, expected, isSet); + return isSet; + } + + /** + * Returns the value for the given flag. + * + * @param flagName The name of the flag to fetch. + * @param expected The value for the flag that is expected when the tests + * are run for a full test. If the current value is not the + * expected one, you will get a warning in the test output. + * This is so that you do not accidentally leave a flag set + * to a value that prevents running some tests, thereby + * letting you accidentally release code that is not fully + * tested. + * + * @return The value for the flag. + */ + protected String flagString(String flagName, String expected) { + String value = testFlags.get(flagName); + if (value == null) + value = ""; + warnIfUnexpected(flagName, expected, value); + return value; + } + + private void warnIfUnexpected(String flagName, Object expected, + Object actual) { + if (!actual.equals(expected)) { + System.err.println( + "WARNING: " + testFile + ": " + "Flag " + flagName + + " = \"" + actual + "\" [not \"" + expected + "\"]"); + } + } +} \ No newline at end of file diff --git a/src/testcases/org/apache/poi/ss/format/TestCellFormat.java b/src/testcases/org/apache/poi/ss/format/TestCellFormat.java new file mode 100644 index 0000000000..3e0b1507fe --- /dev/null +++ b/src/testcases/org/apache/poi/ss/format/TestCellFormat.java @@ -0,0 +1,32 @@ +/* ==================================================================== + 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.ss.format; + +import org.apache.poi.ss.format.CellFormat; + +import javax.swing.*; + +import junit.framework.TestCase; + +public class TestCellFormat extends TestCase { + public void testSome() { + JLabel l = new JLabel(); + CellFormat fmt = CellFormat.getInstance( + "\"$\"#,##0.00_);[Red]\\(\"$\"#,##0.00\\)"); + fmt.apply(l, 1.1); + } +} \ No newline at end of file diff --git a/src/testcases/org/apache/poi/ss/format/TestCellFormatCondition.java b/src/testcases/org/apache/poi/ss/format/TestCellFormatCondition.java new file mode 100644 index 0000000000..f1ede1193c --- /dev/null +++ b/src/testcases/org/apache/poi/ss/format/TestCellFormatCondition.java @@ -0,0 +1,64 @@ +/* ==================================================================== + 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.ss.format; + +import junit.framework.TestCase; +import org.apache.poi.ss.format.CellFormatCondition; + +public class TestCellFormatCondition extends TestCase { + public void testSVConditions() { + CellFormatCondition lt = CellFormatCondition.getInstance("<", "1.5"); + assertTrue(lt.pass(1.4)); + assertFalse(lt.pass(1.5)); + assertFalse(lt.pass(1.6)); + + CellFormatCondition le = CellFormatCondition.getInstance("<=", "1.5"); + assertTrue(le.pass(1.4)); + assertTrue(le.pass(1.5)); + assertFalse(le.pass(1.6)); + + CellFormatCondition gt = CellFormatCondition.getInstance(">", "1.5"); + assertFalse(gt.pass(1.4)); + assertFalse(gt.pass(1.5)); + assertTrue(gt.pass(1.6)); + + CellFormatCondition ge = CellFormatCondition.getInstance(">=", "1.5"); + assertFalse(ge.pass(1.4)); + assertTrue(ge.pass(1.5)); + assertTrue(ge.pass(1.6)); + + CellFormatCondition eqs = CellFormatCondition.getInstance("=", "1.5"); + assertFalse(eqs.pass(1.4)); + assertTrue(eqs.pass(1.5)); + assertFalse(eqs.pass(1.6)); + + CellFormatCondition eql = CellFormatCondition.getInstance("==", "1.5"); + assertFalse(eql.pass(1.4)); + assertTrue(eql.pass(1.5)); + assertFalse(eql.pass(1.6)); + + CellFormatCondition neo = CellFormatCondition.getInstance("<>", "1.5"); + assertTrue(neo.pass(1.4)); + assertFalse(neo.pass(1.5)); + assertTrue(neo.pass(1.6)); + + CellFormatCondition nen = CellFormatCondition.getInstance("!=", "1.5"); + assertTrue(nen.pass(1.4)); + assertFalse(nen.pass(1.5)); + assertTrue(nen.pass(1.6)); + } +} \ No newline at end of file diff --git a/test-data/spreadsheet/DateFormatTests.xlsx b/test-data/spreadsheet/DateFormatTests.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a6099be4dad55ee195ce73b18882cca4a197925d GIT binary patch literal 45480 zcmeFYbzD_lw_DW#F_kWflG1OWj70qF+m?rx0`1fT&J007Vd0tp8sp-2Gm z^&S8a0*gp`QjQL8<_>N~>fTP~t_B=l_I9)db4VFYpx{5&$*8xCut_bWsbeIh4JnQNsGYQ*p$Rer=^fAb?!DWW!}@Q;j^_~tX6_$0~Y>{ug6+#ckSPX%dnfdt_YR2rs`cJd?-R~jPhhi9}u z3WudbDt-r_^}Hwp3N#mKjvC^aS-vR^ZhcDik>4DZ@HW;v@QEBlvN`>*zpCE7>v-6b zJMSRd65Y%*R6L|Xsy+7=rLFr zG-W&Y7Kcj~F7=Lo;&4oW3ne6rwd*4nJV9$^0|(NQ0GAP?(2zQvUUQ+{dsx)RyrJMY+OponNV=Fo_p>Akr1LN9DeEzxfxvNm0SHD&4n&O{S zd}GN|91(Y-HdjD1T^C){Uu=KFwQXwED!XVb<)@MADGHx`Yf~`NEdTu5M~XM+Q@go{ zf-!6+^$+hANUYYS9^IF-?+SwM?zb>ulC< zaFAI+#~-xj|7h!g#0MDWUFtyr0CE5W$;*!OPjmNlbg?yYbhN!oK7TWP)H~A$Y5&hI z9Z6$0pfQDQSjsFj=Y^Yd zQP0!Mc-6$ZZ`SgD@f;3pG{R%f51Nje77xkIb4nhQl~BLV@{Y1Er?nf^!)wov9|`om z{%G?+%=c_6fAcKXtg&gWV@AP#CIkb)ZSf)6(>D3<<`swp&;}d6xJ|mIwiA?YkNNA%`*T_w1zj7S$-x>78dXFWhe4g^mYX zN#4hcwJ=xlGm&9YU=C?QkUVHveT?a;bb)4<^<2~nKOw+MgT%_Flgw3VPi!6BL#3B>=hSWDPkYcQ(*%KkIDGC98S?I-Pmmt`*x!(yNP&^|Od z8Dqs_zS?uh?&X&9dj0gm>m??ty!=$(%pXt5Z;~6A-b@nUf`0B*-lOw6K9U{mP4* zg0ibL4BTdd%V4vOuhA71_p=^m;eiL`PqhK0BrJ(#yBygU|?y zDV*BGApe>7Y|X&0>PL2A7hB|&rMHOum*|^0N}s7SMTcPZD;O!7dyUc**h+A;oXW^ zBYNda%d2Ei*bg7SQ%ZUN$o{6b-g^22TQF7aR@xH}-ETFki#T*k=zl+RpPIO8SyFp{^NkiK`n za7x>J`bDn}cPRXeEWy2=f#4Mu}m^`7UM{+GUg?_5z2x7NJXe(q6ot!K9qGPQmQ!j|jQa)bQ8Yq+@$5^g?f~xuW&4 z(nyL|%`|agmmm^d3!z?HyXO!GTt^|B~C^=$f2ZOGl0vQBP>iQufH{vLh z_U6Rb6I4*$htbCx^11cg45TZ@%LWc!53wLo^+8_9ea)xfVEl>G6UVyi z$*wn6+ZI&pW*PTgoNKWfXcbVKXw+F;&3xxQT*!OWKu z_SMbQ1JU{HOkuIdO~B>7J?_Dgx8vXWZNEMF5qYKgHWhM>M7UCy9QT5NOE2ovJ z?B5t>sfE~7(8ShR8u?`=b(%5?-+g{UhKvh?Pexa}fxl18RlbiGE3e+juT^>ObI@sd zET2t&8|S+yuN7l=*vgo*S{_vSU0A@O<2Yc$Onqy=;oU)bnym9onR3p2a@TyFjdylS zb=`>dS{g}~fZATg$##YwH+B8#7gB*Fl7ej+7(O^wI6Y~}SrrO~_aR0kCyO)xzfDp8~&G_Fh^Y;@tBAoCEe z)1mZ5jjkZOgY}t`=y1B?G|PxxJs$BR{+~Buk%OkxxoQa-W<_|zWkI)T;alqS^V8o3 z^vNHtj+d%rl`?bHDaOg2)5RK&>7N|CCWKjcNc-K@=iA2{)vw^wSjCGI=ri_{ zeu>)n{dBaQH^&RssAz2sjRd=il(#DKoa^F8;q3;V5UU{pd!04UrhbhzRBvoVM$y-+4yb6H6HII z;HPUH)O$aex^whYplwkvZnwJO*REO-{Q1HYd)vof4&<;^{Wy#%4=h;=&2VI1Wdxrt zWr^pEQ>~ug#t0dugO8MM+UHnaui787h(M~2*2ccz{BnPb(WZ#PdqyJAB9bkUm>`(H zo}%O%^Koyz`t$0Om#Rnnf;2&k*u4+@q|o>3wq7K^HG17HSx5ACLEfrUv^BbYgg8J5>NDT80Gk)msJteYhuSc{?WMZyuFqM`89;;-4$>Uh@MRLXmVcL?xhKq zyba3hm;nx!L1xCA_gcYD_i&$U)>vS_vdDXV1@>^_@ZEg zVwe@&*6~evP1_`-{Ol+2de?-+pH`>qVQ5^O4nv#flKo2)d088jw)9jSy|F!gf9j_w z1Z87VSZdU&6p%N5?wz4k2ohW#TJMsoJ%&(L-17A^VZF;&k6T+ky=&dyhTB9+x4LkD zp<96quMod?xF76hiu=B!ftZu^mA9OI&wZYVFcLjyi_O-Pia zvr{7$JfZ>^H`aSiSM58*jEM_4uZ!Pt7KSR1IF@ImBv<)yXriu=ri@vr$H}VCN1`ug zEYntd(6YsHlgx2G(r>-6ZPkvQVt?Zhq+%RPHC&goZ1pwfC+32k{xoS}0-TtAFJ04& zwZhoce2`Y}m?!A^t8Z88Ma?+#a8r;+A@7je3RW>Et@Hd$&r~Ar;>Q{l2TH9P8%?7w zZncnM**6TOhAaoKW@4ZGxT=oFS@6K7s-XK-?dr68k0LlnE=1@3Yei#arc?z2QC}0oHht|SP!=st&>*~cY?XX>j? z7O70$el=(_^*r$!r-$tJ*7GSoV@qn`a8M0mFlEYvay`W8{EW)FfH6!ZB+O>Mz2h`^Ptof!f0gY-a{v8uc#OkNf{Ep57=vC zSiRRCTIP12g`z2u(cWPz0lZ#6XICaKxBJ*Zn^0Z$CdTnYJhtj4$6S z=9ZyPYI!-f@j3OW5n}uWeXmUL;F({3VKwnt0 zjjR@vaiRT602L5RBEp z3Ra@X;Q#PYZvIEY?>|(DV%sd~=RQwD=`w7$!|$&sO;}`cahgi6IFU>uXY!z8s}_yd z!4B>H6xx;U3x3?m>CBKGOf9EhFT3PE%sUbwqazT@<*SUdpBBHox&^R)Tm(F~epQzO zpC1n35pcEfFD9sElcMQVTk_cCK&Ss^trcr)j)J&fN(O%v`8mHS;ztqsyLP*W*75Sa zZ!*Zz`}5G-%2}v*)+GISB)K3SMM5ft4#Brl4F~KG3D?5gFmbci8Tp5a4<2Ms7W9ji zqGVlGB$6tb9iLV9safRJh$%Tmu#F0Mm*8M;td!D^eB@;IMw<}sArlvThLLIvGmJL7 zWF3KQWgdNH^?8_ExWP9fe~3{!u|_#Ys%-httvdSlZIbOz3*n+ioKt0Q&t8m^4qS`Y z9Ed~q-<(OS??U{YcwTOyqvs~M_GC#yHRzr9#}M<*TVnUk9CZjmASn+=O1_OyXn@Ej-n%lG-($Dlt#wa(Ue(Lw>k=|8JRl0*-fu! z7fL+s4H;z2Q0yjIM#dKs`tMtvpFc0w+)xcr%)^M9?d}obX+O;N`YuTK_U+E3k7e%V zwXMa)RqW=6d?|XyZ8?TA!z$DWMmm~FvssLjb78G{6vl^2Xdj>Mu@{_>6nM2QB%{;*BI6)8j82&&Fxu-crjlG znZEJ$6fB~XcsBO*+t>6KGSNr!2chpHt1T2Mv4W{6)%hfq%%U;fB6Ju4A(VhwhGDkn z4;1ckl1mK2?ed=5A!YYi|}m6BP!~H7=FU)!383vEP>K=(n#p zG*#RaN9i%fNYyp?B5Ip`Zo{*ygS?pA(4m(yCqFir2CMnHr|-z0S#kb~WOVlJ(Zte& zfX;f&WnB*lni;f$2d3*6^iSqi3+|INs$ zQ9wk1@5NjNbM9|weGKAvdwjqZR81U@&FbUS=tS=APx$^Qr`YXzCNniGwddw(hpZ|6 z6qQTJh4+JIvf%HH`s(7%afd69Aj{g)VodFX_^Hm|=F&7npP&tH zM6y^$JMt0xy&K}NfNkt+j?4iLRTiJMO>YWULm7v&V9k)t+3@3OMmE#cB=q+Mq{q(N z!KW@QlD~KckeFTj{c{PJzgr3f`MPbD@haloSUhoilCL6iBTzDunZaE+8EcQzVLuf6 z=Dti)4Woxr)0%f{pz-F)(56}Z^XdtloEHB}`&I1QGk;G*cFraHQfy+MnjfOy{OcB( zhFt|lq`qitDUyC-9~0B*t0i@NqcW3@LeGk$XpJh~uye8|gG@or*n0K$V;RLd(Z#p9 z=R9O1G3PG}k`)A()6F>@W5fO1>Y4jB{4Hv4o|`m{qI-BtbMDFp2gQ;JF}U7-y;o(0 z7LBF%DV6(P11Eju#}r*{-MKOg-E4*`E;18ATkGEbNaxtJB zdy2e0tNp+N=cD^l*&O!5>$zP-)^?&m#Ul@ItaK6Nm#oTr9yf}weGosRu>s9GZV1pKxWmC|ZO zYSD+cl^^@0`?G?azX(25wKpYOB+by$Dbp@s(z!{~vK3zB7zQ%SNG46psZ_UUW{@S1 z!%`oFGpcXDNz-gRJu;og{H={Y6^kZYHZf#EBL(X%UCKd9ar*QIOIN%{@xw*4_x8nn ziP$BGOrXD0{2} z&GQ)W`lKs+UM|=&tVv2!w!J2ws%3a{lKBH^5xJ!tLY{@Y(7O{Tfpd;%-g$znHt%Gm zcI_5|8tPm?FY%eWktxaFlB>d^aJb%#j3G&d$=%#$?j%X7&!-K&dY_sy4?}guEvXWl z^!q;CHMarlApRG1vA&}cE~`vw)w^!rO_OM{7~!V0$={jR-LI#3Zk}|~O<0;O;@z0E zDSX`4Sbxy%^Ni44;vq3vPqB`z$b8J;XvHTNyg{94XBUr<^i1U=d?n(NMl!EuJuKksQ5s`< zUs8FnoAQUFgR@@7>yaX=R{q0ZWHJmo^~zxpIB{oZvg??7k{7lzUDEtkiY0_qwE9pg za{aysHFC#|Pa@JL9&xb5m{~2}tNZlmjQg#lj?U)1tVqxDBipL^!4%&probWd`z)uP z>6cp#Wur$D(AalvZ%1dLnFgueSXly@UJyRjH-Z^%iipsBQ=XNgqn&@fK~alzDf|@N z^rHuNgZ~E`6n|vQEDeMBWfmfTBWpzP;HEsG2u+e%rQqDFk2a6T$_kI0{U4DsTRrf4 zCny)_kBjG<_)0_Lnt)5_(&=Q~MW;jLv#|B2I?0Nl2k2ySttM?mHfrxV5dp2~Ndv+k z<#lZb@4IZJcIe&y9yX~Ni(YX#A>d-sdtc?Mm{XE!|Eb6$kD?l)TpU}3lWUQ*G~}ck zMypd=_$0F=5lfn0${`?JN-O0JywgHtBqf?LY++WSdnIbf!!Gd#C%b6JeBnD6JH_it zY4-2j?=N`mB|K!dOB)@E-pJ?~2+<@deEF$4&zSH8(W5iRbMxmL5-SWK={zHgi zUSxPZ(eAAKvx^GW=gS=CFs*x^Xm%?~U|Kz8*~4 z+(nCWc3^aF^WI9)gSMfqMldD|P5rd&!K$Ahx86tKmhRW8lig%j)H2ry)lO~*arP!K zCW?Khhjr(Xs6{CHHtn7%{SJ5fIq^tGZB(o6_K|!`sJgoL$m6z(6>%Sg07+(*@|z>f z^lJRr)fZSsu}%rpeXXZK=ncjm0y*BSCwrYa*~q3CKXK?t+u!TpO0za(hvH`^M^8do zi8fi?M9IE7Ix^4vUi9eR`QR2+x+%1i9dZ~$#?{UI{qU~v=(uW0gndHw?bclb#=4j3g`MjLkLQRT>5?9EYT~<8n}{Ck zaH#j3<(5Gzv?9l^U>~ePvK+ZTHD9xvxh*ujcnI|vY_n>%>QdtRULyZ^*BAKiHjGB{ zd_P6A6z8PkBe&!yWksuq5n^nTD#|G59twspviW`#Smz6q*ntHW49SW%ztDJ7-*LJV zo|?g*8)5d=g@%+fZ?kmT0ZzqDhhnuN;;piWeO@+)1Ol)F`@PIPK#@0=ok|%=;rBZz z$nd9M1R{{w=#AyH&b(Sv39WhV~@QuRnc*o>p|El$^{KZHh*4R#|etw zn|2lg)D=3ZNedK@Svw};Jlu(b_MO#u&5S23wF;ywltIcYKbgumc1Co(X8n14(>7KZ zN%H)u$TwSxVO@r1x%XbEcd77u8AN5rZIt-je2l<<=jZ=KI{KSpag2LKc2v@&wQ{QB zUbf`bQOi@0PEAF-CK=0Z_ng2)B{I%DoZw+qzuzoxAUl_Nme(|59V8m~iW+bDw94*B zYD_f|A!Yc?^*{20FC}m20w=;)qv1M`i3PlRwynMPOCyTmpN>z{j`OnHthYj@CPyf< z?PSqUN=EllSeQkI^T!*^FOu%jBGY|{!GEgS`e8thmY9_(Eh$BW{bMQ_vp%QjYT^jITZ+%g$}>uv7MzPbbWd)$aq2O z5cxbwl-k|9Xi^=eR#k5&?QS3A)CE1k|Yv zjB`WNN|~-Ek5u)6k$Gq3>_wk6FFeCueFS-PmTfK4ee=!qgOp!a)wlohq}Mry*YOxM zAV07c?@vQAHMTRAvNE=IxLex1N>q^_;3ASn+`Gj4(VeuTNF{469I=MwhD7Jj!_F%w z*T;48gSPDQl)v-4tEzC8gRzFzh`HQU;-Y&I;}tJE)MWo`^Je|!M|BeBmJ*iKuA)in zj&6z$y_@Bu)UqYXC#gHSEhJUZxlFC~3Yh~JJ6SGHP0x0sIrNAHQgn*KG+Y;`+^kS| zaSY8BYW#ya6@z}Aj@**{#Q#aSg|a34`PtSpv#^-T6GYa#(H`@)r%q(85A@MEP}1Jn z<~iQ|)#B#lVW!ez#-V+AW_MYOy#NqC=@&r8MR7y%3Wn!8-(0T7tb&67+rkeEgzpL+ zfb5UE@;Vp*?k*A#W9Df3+Qrey6!z&*h|~j9#lM%gDWw1}gyI9+$C`lN~ZG0N6XYxv0uY(rWAI(xNYdUvH6tAC!;- z_l-?mog`kreswqe9qrxkzb_Z_f1b3@u>b4&e^32SPxsASP3-{y3H-VY`KOt=t0@4W zz(E>EOOO!&K)oA}$kWZq4TRs`!7hK|lkZ@YKjE@J@an2kAWa7d3`rR1kh*`4<|Kzrgl(?%=q86nyahz}!JY4g7rs@)Th1D*ZPYDag$Dg#w7@0Qo&I zGk+ls!cRcB%)(km4uo02>$`=EjK-fZ5}UP~ocfHuy*Y@r z23!H#e@STvy#9MDJCH&a*azF}|Ix-7a0gr8^{)v?Dgi-H{@w#E*8kO2g81UoJ+{N0I_Rjyo zXkuY)XZ}aUpSS->^;#Ml zlmEc6fd23>7XVuMP2F8Q{x%*G(ii}^nR|gg4**h*PTnromR4@GPr0}RXeGdqWlk&S zV9N1?*4WOD_Kzx8S{HLya~BVDGY-Jjg6HWU{UAM%1mnaH1mX?*Pzahgb*Pq`j;y06yM%lU2FbeKhpJN$MjjKFAWSS`5>hg9rbo;y ztZck|`~reP!cs4!Wn^E<$*ZYrXlj9GVQOY>VQFP;rT#pEB{h1PzgxLsHiBY=y!4lR$U_sCDJ)_}-gPGEooIhZ_P-`r(0@v@zYF#cxt4$jC`jPTL%|2c zf!j(y*UEjP2V&@QP+SEVLpl7-yc;fxRog%S8U#I5RJ_t_b5Ou#zuEEWKIFjOhQkc^ z@yhDw`tLuODm@8xwGT)hQxz?#1(gf-&W18ETMEbi93ESS%o*&v`zEM5;3dy82|NtY zUQWL-xgZCeQ|7q@)5;4`=$zoc+W zxQYo=T9%$C*EVk?X;W_tXy-4d8hZ+S7UcOAh(UEJK zA9GnOJ*Jr4DUQtAC2f_oQOL}Q&b*MnV*5U&>8KItzIyby1OX^@5yHhFvJr4sDF2KW zq~x8ub*UbVO@YF+=o=%ky?e1C-$-+$eV^1tnnt2Cd0B=uf!wDazA?tmP)r?HAuYvo zYkB@|Un7NM4|}u~-TfBxqsp3s4s(yR>=Xn*xZ1t`(vKAZ+ zw?yH6xmWmpLI@zJg7cR9IXavbH&px=J%_VpXBJ_LZ<#q-1Z76p=hBs>uz#<6rzXZ_>p%t^I2 zY)6q|9jyxFVeH&rwog}aHFQA^nl>N{HNR<^2tF1YTTseI56?{AsAyuH(VuQpKRy}p zBPl;!PCv88(KzKvb$`qTQHjYW+9Z!p5&7cTpxAhPf3SsUzJAA3jwTNQK#IhO5Wr;g z`UL!;P9QXDOE~yHBOT2@_XCLkv&M;l|EO@3kz0O0HkfywpIH0suRshdO@S#`Qjg}L zD_W*CW%Rwvcu@gUZ{n>`cmt5tPPV`?a<_PdIav$8O_t z(tN2v``3#`POtvdgXuILg~Y5wQAO?1+{J2his2Q_3kP<&L90{V&V7T`7X_I&eE-3~ zwJ_)Zlke_dC2hw`{;@Kui1TXG=t1G3ZB0q8H!;AFtZ{L>n48Q%5GG&l* zw{?CX_k?g@Rn%qZV6W$CEqz<9N(}Ua_6Vztb`+aRVq2m+eTMbkj9%%d(b(j|kby5x zlg-LzZB*>#_=rz3=J-0t#KQtn{qQ#&0hpBjY!Os))yOMQE;X>hYhkdt);rfE_yc?1 zd|}X%SSD>t91A`0guB34#ui_NiKtxX@#Cq2l{9a8?2+FsuCkKY%`1A%%T2nG1{d<0 z3L{p22;iF5OAYi)QeNCx9$2ngrs^F0;k680AHql;AIf)14s)2%gDiwKHP%7WA~+j= z`x#UyxR%*uu)UbJIW5zVl@U~ZsY9n8DeU}^S#f$>eL9;|X}VZaiG4+0;KJu|#nPze zxDQdGiuz89!cgU=yJmfxri#Nk-V#aJ9`~v@3emO?!v{CQLTtCXCrk_of}$kE({-jb5pf0QxN5Da#OT! zvHUu1sQ(s=Ve|05qAIpRPmbuUqaP0fz^Dmtx^Y#2EpD{BJ+2}9p=&KW;F-Z6Nj3+! z3|#X*d9=XUfnB!e!yL&sL10BLdC*|hOx*HbY4t;3RhGYyn$xDYBx!u5R-t@}T#9^s z-;joXh|TO(l_;;XH5>O}UzPqd@`oR<1?RGoWcLujK{u+*Lm?PHK?;dviv0Vr25Gqs z#=Jv8)vNDNp8l1&RC2d+&2rtWXN9F0jo*#%5WrgAt++jv1x&68)^({leaacQ&X_rf z00=t#a;T=?LTLtak@l}-8p^B}qQyeJLCanZ6??RB!a;_*krxcel+$@!v`DOSQfUs+UCtThIVDU-jO<%t?$IY~ud zg=0=-esD3&2oE978+usMEb*qC)VnX&Ae*#R(_tEcsI z3tHV^yhangisPrTX&|5si{4bo%vK)ACHM0!^W%dM#}*y(*fhW1Hza~w6s{uxBCp(G zG48JEYTe}*_0z_UQ-dq#10J^=8XL?s7QFi{gYK*o6tTm`5Z4@?q#>^S6l2!Sx)hrk zZ8G^1`X=F77Gtj3jNJ;hI1TkTndh!z$ZIjEI|yLTM>UQR{asCTh%4n%QK{b3feFm8 zP@xVxAr{qg`A&TeYl&9X5TQ5QkJ2I!Xdo)$c-9rAiwD#=(2I8;SNkDXd>v5n;i^DI zh~vd@T;tyP<4)>@L1G3?fBD^BeqGO~CL>b*%;J?;9))_ymycuBUd`CJ%ID=!qX>7Q zU247*8z--Y(eTgpBO9HmI1cy~PedWJzZs&lU-5|wG**xZCk_~;rc%x4W{VN839`uO z(_v{?)Y@irIe!?&K6d7g*;V3Ok1juE3X9?9d;C*UiD)z2BSroo%WOt`EkA&J&Rwc# z6tb`}9LmV!rPaTn_2U_Au?A+T4C#(NzrlU6P+ckN;x~FM)qhJIb$`XDUmB{|8TRpN zr)GWch(xv_X@H!rO+&C@07LB}VYAhQcR(wKE1g5ju!I3qrpkspmGCAJuO`AJmTa!S zE%_#v?fXe(XNrR~4)K~zlH2ONHrz|1ET~SGxeSrBhSf|Ji;3#sxZB>(w#i~0nSl9X zKAe|r$(^M_=x`$24eAv4kNq1);emL3kNx?TBfDr@+aQiZHN+E4x$ipYHYTE|iKq0A zbP>SCi;T3$lv^@=8$<58rqsvwD3VZ;@TQc+^-~AlcB)(==<&-w?Es+^0r4^w74ZLD zX%t5dtp9{d>nVj1+YnJYL&L~j6z8jCnnYw%l)Pob1RrIU)KOAkmic>B7Ke>BXxWKT zcZr4a7wQozere&yoE=c>J}K8M=3^ckq49w|ynf;L2A03ciT&-ct$3v*awF+l;^4mZ zx>018_(EVEoE6eOlyeUjxMuW_Gm?{!iqYmuISwv`0Pf=`3VT9s({D=OWGIej#5xw+ zkdSnVId2G1n8S3>3I_!jHTyeqD8I#2JSskRCJUn=i5`6I#_+EE=)jnzgP^RlO4(A} zrnE}ehB{TbN1y70$zET}gSAbW4p-KnlV8t#5=)iQBl_3N=G-k~!g(K09P-iLWEs4a z&t;lpiwm^<-8Q+uNkfBEcq_X~>h??)9@f5_tNYss79++GI3){CD6to15dasB0Rq6w z?LWO@E(GH! zD}XCqwQ}}g>gad#)nV61Q0vNL<=uAOaX(1AI-t0bzi=rIs2@Pn;<_GLt)lZrJCeh4 z`>%2%I>;cW!;$M02D;07MiF8xvwYnYUPDW}ueu;D@0!GsVKmn&oTrYP^J>zQr%lY) zgTtbhhWLe2F*Z^UL;K#??6@<%{bDN__Lw5XD^1C*yWR;>7}_t-M;9@qHe~XNl7YsY zt;zHi%;=mmq+C5){yVe0+hY@`TP^Qq%$T(@epuheLyYlkqhsBl6_EqwGuaQGz2YZR z&Tw2}QOz2|*1K4TE!vhY9V|KaPS6-=|9~0J3_1IEUj#w3W4F8BRl-GKEl?>*+iN}l z`>*kAV%I>U#VxaK(|@|6Sh(Uf(I@;$vFxB_f!`xRIo4}hgGs5BMu{hkUfbHmOh~kl zZMN={2XYHT3X721)wt=1OyRbMY3RUgT0;nf(3}#^I_VG}E93&p_Cb<()*L(xLVXI5>z!*0wwRNS2e6N7-R8n$Krm>xLU;8py%W~^u zj|1m4>UEcc4{%Fz4F^F=2M$3$4&}tzawd6ipWgYH;&A62@HymaLgua zK;l2UqWE|h;a|N`9CZ1KRs;~CyncB@IE4WE<7^SYSpJT!_%A`POEB84k|2PeJMpj> z>bu|~4(H#dfuG{SLT+gSr=HQk1$VmPOVkz(2tX=4J`mCg4MYGOR$zy{8v-{(;9|7j zK?MPfgEP5*8loV*sQ?h;hC)&D#KfRs=#zo=AR&J6fa4X*E&>QU0)tjIIBoc!MKD>o z3@(26USaMng-iUcXEG4{+3Q*LdVrr+wB7U)=cKH3ee?7O46Z?<`8_r&Bco@Ljkhs~O z;lI+i=+!^K-|UoNOxP}EY41}vNbpu$3hN$VFO7oS-C?RL$MSR9V=CZ8AfTq=y0s^K96qvYPa05mgsV?h29^J zTOs}};lJoFbND75`Iw`IUw1<(Y!}*y__tn)GV_N&$`f0CvUP4^Bdi*t&RRO+eVx2b z?O<(9CjGdmYAmp6%pS*wC`Fo8Xs(54`(|5vGDO>M|UVV`>yAbcop_%&_o$G`aiwCmVA7})9=&ORJmyI#jLI_ zUNOV=gL%wTfk9^)bjU8TR^JBCQFE$rHBRU&eyX;VvX5>bXWcESb@^D!1ys%q7yFK%F81ZN zp}qU|X%N1a#m=Snh6XWNX!r23+KXAZV;;Ce#Wy#bd~NcB=>H3^&I5etUGuy@8JQH%BLEAdqotv%!-|9D*{jTr?9%WKPAKkL zSY3%9X7i+5JdK}LGmHd^rcAi+6MH#8rPuG1(^R1AC3)TFF)v&j7kF>!Fo0>^J&?eL zc+eV7D|bJG{<=)c+I3T7b{-1sZOUc#O=;NQ>n|7Y)tw^uZgs@ zp5E}0b3?^(cXQE4K{nUiIVU9z)>2kB*QEaDjjU30f1z#1$kpnbATqf#i% zpdl8-;ZyORIB|!OEhJi}e(L-N{k0fT?bMS-TO)j%475-F?(XZS_y;Zrw@+F^-y|pw zhj2DVmuudylD|M@SeHfWRgZc4vX3vXd|qY9G_m5Ip!)0b+nG~or7Wf|zdGoT-7*{p ze()!ivZc=+$j7Y6tLBiPt_Xc0DA^{iJ(x&zjh$~!PHM9kuco*NguUF63B=H8SKR*n z_3Vd;!dCNM$B=E1(U&*m&lbOV>yzigLOPI2;j}Z;7tNgHRsP3zGHHjaUb+hJ*S_9m|B{jNLrGez%5(iG!kldmj(7;n< z;gZU@2w*Q4OnRZD6SsymP@>ku+whb?hzyv2lf&UGfuXs-9)r{AcWvPafC)^McuAnM zUNPS#E*Wr(BQ5;@>q2}GV}db3=11kMk41%uK$fknYB8~op-3F(Rbtalp85&lLEd;- zW@wCf&%r#+c$bzzeXGS7#kb(XqV(OtImVY31W@bu7*0hM;G2u&hXpGw_A`K0K}#jt zZnF5?AeQ|%Mm>g9kf!EX$EvXne@>0r0EU3695kpy-KO06y{x+qrTWw z%t?yVemdr^&h9RJ5t@XzbTr|Yj@QUJZQ>V|4h!ww*D@_04wuWH#Wz@;!8Of+H8}mY z=(9SSTR7pJYAW?y2|vn*X3F0bpf%A%ikl(;au~86yJPP>e`56VvCKF-#Sr=c_h7ZH znto@n&eFd4wu6ms3@%M@IY%x zIkdwUt!eE>+$iz~m4iLn#qHSbS119f)HU2IJhkPtn?nlFo;k0F`)^h{BEi62I85_P zBnKSGqtEfjZGYf1_(ZArx)l5g=oW^YaO_#}-)!-)kQ^EWFeMJMh{c@??+E;FXr=!x zTrJCUfHT+#$IS@YYglW>PlT!~zr@Q{x2wLD#B=;jThq*L2Bu_ZKLhEOw10JFDd`&- zE6@hyz^HaZ2rlCb$-sqv|1EtkRp8{$nhD&{!0V7vm<}YZPk6OI9^+tP*ibLC8`ru) z`N9a_Rugi<|2mC(S;DKXASsa{7CFA{BY@nkq;bHQxK*!dxJ7aO-C#9y~0mAk@VapT2ZbkvSW`8=cibzL=zQuXOBaO9;O`o9(>Q~vTt_qqkuL3V1punW7c(F zN9+~21Q_a_p{o)Q&oGMh;|NI8S8;5(ETo|)hdq2i_+}wSR4RWF7Dt6Xv@{&s@wn_@ ziE8`i>%!F&h(u9^-mA!aG^DWMiw0PE(IGYGR0jq4@^E1}XMN(0r2~#=)|VMZ{S#!O zV*E{zlN1OTx4_BWV?)c^38?sh-UJz3d4@fJzUZf}p1vQ~9AliXk?_GI;96u;U_hJ_ zW;ATnP_UnaIq%24UPBCb1X;D;#AYy16c_*#k9)R&UZ&)e8t`NH%04q02%bqYDY zXKJd@iw4iYg2MnxNNnguCsTgY%!$3jTVa}S?L#Eu6k=pvHA7dOH(eD4;)9&T)`q~` zlSW0;9-sNbHG8oMDRTGAm<|S4swArbhPFA2`I44K{>hbGtnM)L`TQ2>gN(sSfW{Eq zR$?v+oB^}(gHr?my8&n*k^3~i5a4N0un3412hT$3ePnOI1ivR`FKjm}Q!3rkg*4&eI!Mb=G)sO`1bVF1QVhtTySKV@iD zcqFH&72oJK6hBN+L>l6|hel=kD!A7fc0lnBE`e54#-CtXW#Hwja@IH>r^l-omPm_w z^FBb_D|cfzgfCl2+zgl8j~W4l1nQA{Bo!>eqC~{+YcCzLmampHRg7-j4@5OwUixmE zdKG-o4T-f1c+_ds7-*&ce1XK4vIh^&f72MaZf0YI%wE}r0$Y7mcT*rLw~>qCMSO5Q zs3qesZU9qpUjN+1r?BDc-gLjj%eSv?5ULMT8wjx7&k@O7FV506tHq^(>FfYE3?LuM zFA+c~xaml?iU6Qj;2ALCwD|s=6`*;7*Z}ZU{Kc>Mt3YrX25J}q(11tj_|F(_bHT~4 zC5Ro~1CjsrPEbN&`Ri32%j?5&yYa_eW`+b%)W~j?F8A+k<|7mdrEG^eAA2frNbz3g z;bKE*di}+OtY{f}8Lm7v`wy zf(18wda_?P44)gKD8^)d*cw=>9}F}}%*dyb`~CWzl}s4_G`V2b+u~-<+~P+|XTj;i z2??c^rcPa`bA}xMOk*KgDTh_*`1jnW`z4pE{-?u^WVS~2EkUBj8#hE?+?sR~r|^;! z^{@6y(`)S#!-Al8;mo_Q;=`YVdze=716{n~{f~>62ED=PhRMDgQTa<@MR}0eN3#Vz zoRio01al%s|NHy!WI_ecs!X2)4@n&ShOFHRzZp-TU%w1+MFU|hj{Ot}fYK%a1LmCX zCkG4mFM|6(ID4Nt>P`9CLRP`=BhsMA{Tp91IAa@c91RzE4-M3m!wp~p;Mu_c!`!=v zL$&|!!_!t&Vw9rDOeIuecIB{R%v35#Ol3!i`IO`^jp<-A7&Da^l4h4;M@({*d; z{Z^MzOetwtmp9DnI=$71&aUK7hVhn#cAW!~QdBM>Pr6ywh(MxN`7>ITzh+hC01A>+dsn?5_T5zGWQh$JGr*Qz@G8K_EsDu+#P;P)s!em@6Qs1p0iY%hv7&ff6v z(Hf&&=T)^Q5}cq^Rk@VU^y-F<6^N4Kz|!fn%XXf^jB7T%1O-V#>}ocZ(I>Ar65DhW zj0fx-GA5S^xH#sXXW^IHb}*g}x!2r05{&xiFd5o8_hsNR|45BMiW|&zv7I30P6Sko zg^(+qMp3>|_nJEn=DZ-U`D!kzlyDA#JIMpHf5t?q-E*B&e+`(xR$h;HU9i)1$Wg3a z(BYvL_A2oz_$-hl0RRSH(UO3-4+SLBev{eM0w`LVyB3VnXm^TE0iTF#AYN|)>?U5M3*lPbzT%i4_EzbXEBc;uNLna zldszZrGVy58XYK4fyVkXuC|P<0GJs+k6qLBd-KY)HN(8(*Cf8ashFV!17f9>lEecau5cvg4Air{4r0EW5LiJKhdVs%;qUhMlm z8ieWV0lkh!jvFLpRPKF4laD+YmX}H#2bRCK-uo`Ly3HZGpI^Ja1m`h@By;7H;S0Mc zLBD`F=?^5g2%Mi%&#LKwX&}DEz8fG2jlmDMvVhKwVry zIlQ)CV>C)ci$WA+6g2P=prtZn@|d=-#hBgcDo@T0k+)K?Jj^7O-RN6DK`7QmrZc@@ z+)=U762X?sFpvk3J$nuKdx`J!BwRha zaJ=OO!&>=SHkHgXn6$wgE7Gp?*ZZ)wBgK2)Lman$c)xPe%@?SgoA3RB`Z5V(J%O^4 zyonmgExIR3vzqFlZmKdCZ|hb(K|d9dz`-9VH;Amp8ts3=3<9Q_h>J^&##7fSAH0s(4AcCgO@7yr(jU4qsNjR?;ThtQ+oyWpVCS z;`9R<{Zfayeb``jqkRl={IYLLroJK)?^_cD8kmR>aZ4g2&&?e`Bwan^^i2z5cgR(O zg@ru!wbK4{(SZ=A{wV{0?_LpN0XTDKbD-9sg!3?}*lVbT6gu4+j*HnxW)-#0M)YuP$A2JCRfMrT}XxWGNs5s+Ey@gQLACijP{JijypCLAw zNv`hy0=rs_7Y~KAwj?&$X&pDZuwL;_mZzKc9TlO~X6pL#fAl&Ql*x93%Qlbue|c0l>Bjr6l5pQRsvN##{8WiD`6+B2LvDB9f__A2#zZzDFv8@ zOV$3jejeG+mybp});y*a)IQodQ27Xla*0+%%h&@}DpI3b-Ol0Z5yN@8~t?<0fQ0R7%RUnL>n@Ur36c`C~IDKU;>ej4MclE-R7*xvTVv? z^;L%5=LcHlfP7N8V9#)EBChX)Xp{3wcu1X?vQ) zKSREeT>*qrMY~qGM4x*9+8ZO2hr@!qV#73y^b}8pxtV@F_A_GK9Gp{Po6*TZ>mjOw zx0ZQE+{dIp8DV^{kA0Bko2bKqDL_)!M6 zf7xurcTLg{)H=3&SQlv}*dfx#f8Pp9mer{7CFWkRrwsw~A9e;A_76YF^;|FgIdJ#i zzZb0@y>}$|^0(J_k9;V04h&d@!gK3Kbiq~Z71QLkQZPVuIGaBJ5zGQBUDjZid%cu~ z6qJ6*@IT`lv@T2Kb3R!XzE0Ltapa?s-{055O~ZOpKXP9_9l7@@vYa}XX>-18WO8fp zjw^G8lO^Mu)F6YX5NK7H8Z5J(ULvGbc1+>Il!6TnUsSt`&FA?%Uqrg35Tmg9X1>-2$&Ua23j+A6|Q}tewVX&`xDhZCi>V6ad0^z zAgn^r!XmrH--6!~Z*>?E2(cbLmF+25;QH^AI$YR8*^b(;8g{Y?Q1VmkT63;8n#)@0 zMekeA7PiNQ;U?eJ@l*UG6b~Nc^q4QB=D+I~NVdP7LL|a7-dtPRN(?PiRsp(BtZ zjle4zB7s{z7RFzuGwiSi{^SS)Mpi)T>~HRF?Iv@RzDiz#lO!#;Q@jicKGcuk4z=1Y zXb-P3mM<-}^>lOpmmlwtAo5_K@yTx1D!)LAWWDHY0jtC3T21IJ+__ijzCSbinm@N( z+5d=+LZ1b{<^vwc_JSOZ6A8Ku4=TOH4 z*i4M-MObMpklPwLd#rV(}sUmsO}8vIPftYobj)r$MZrxbq9s zt;l~XS&y~0xvGYC=TIY5ORD-6SZ{C|Dvtb`*_3f_88XlIlOp2s@QQ*DOU~g2)XFGx zHv=f35k%{cI`I=l1al|`5NanX(;}T;(*=5?4a}9=nNKLIBaFfEEEn!Qe#DA+M)kFB z-QuR}W=VCxcM|B6`iw!5ndHb*n0reC>@!M~QwCupEBm5cy#BnMQPE?U=Fynx6hB$K zqhRR6kh}gVufLwv>lhk;Q36@Irfs%p9q54Bo)bW?B*9+K35%Q$E1$lU0P#8PLpFG; zxC^;j0dbO5gCp$1p)kkQe-`eKTGr%~`ZIc;X_i$3TbmKuWWrCyJBIKX(K7#!cX@>q zEXxkjW?;$<)PGeJ?vUYQ;*;~7;vb!0BeXdnJ@%?QYQl!_?&~K?oU@0nH6=`))V1`E zRt0iA#hpN^aBGu%t|dwGPtLy#ebP18?^ccd>Ms=b?2VHxSI>HIZ*<41vVq&ncokpw^L|N}?8ItP;Q$ zPAw^73nm*1e!|FXSrd-H_vsR$tf3 zUA&L|S&l@C9a;oTPO&BN{xP)_{0 z>V23Qt9oow_s&*F4s-904+f!r_$5F?-xWv2U#9go^)PLei{>Y~h3r>{mO9M$@#vHizs0OB z50Cd2mDP;v_;0uYZ)IRjk@wK1u&%1(%ZmWtbkEKq-}?&-#_kL2b&8P2 zg3B|+>-teeTTn~M@VoyisI&P9Y|KoNOmX$t-<|)(fP>sc{UFO9C^6pt2kNg$1U7Ob zh|_x+*%}Dw|AE?5iB#DC_C`9opsTBdgUG?3*z2IAkLEzGc#`JCi2L)A@3A+Qdzoq4 z8>)W!=d^6+mH)tHr3w2m(SV>n*Sbez1`+04RQ%K^N(`2`hSM_;-Cj z0h_C6u3Ot?SN_}XZ_aDHo)_#)&-1LjPksBGT2|J(rgnJ1;;NMwwW_4Yz3NN8dm$^O zhC23X2ytZH!&`&KhX|gh&eq-jf%>&Wm>L(CA?%(U@p^G=3>UH>j&X`Oc`C#QAe}CG-o^UH z?28<;@2$wXwZr~o@5bPFT@TE?x+BI({(%->NBXHQfvG=Gl`&n&IzxhQHT)(X8tFlr z!NgE7SYey`B8<1j?g#3pGvVW6XONgAGNh`)F4B1`BTP>9l_-tC-Q@79PCr-r4%bT) zaZB`eT=qKZ1>U?_Ej6~RqwRH{=npWvmwLOBzrA+k+X+(l@CkC_j6KVUF@*H~@mCiP z4I#ICk5X_et3OFhV6c^zr7G+aD7vBApDQzMqbSMOHI`67lX%-30ExNbe1I{rOZrg; zol_UMo4T7}wD?f;`tN-857Y*jiSWTWAMnme)?bK?dTYOE17a@s=wSv}W*5M?@JLQW z4o+$NiYSY>{3frr3?!><^FzV*BV^rh!x;a9im_bFB;xAB7waErO$buS>qQpCG)d@K zx@#45L%A?@mkpFfvMd-9>FjD5a8IG z+VjQSzW8f>l#%*eYHs(^?6MSHEW<$wQ2@u+zrw z7h7hulKiDz8;aQbg5Q(7(3t6H7;f;-eC91d$gA9i!_?ig3att97Z+bm(lBxeFNq>* zP90ye$U!=b9YdvTg)IkRRnJkxmowyfQ@Q|N)`9rTPwms0#grf$C{p+Xb-f0Wy>>i9 zX{5dEQEHzAFm^>~*C`bCeXL+nuclw~({4@68c4}V3m&yGu` z9VW<-ZXP0&J-?3rU;Y>y=Wg4%crR?#Qq`TU9v?Bgqf^y+v&3CxW@B`$C@byvfm^9b z8$vex@y90YZ4)HQVC?~&eGVlcp^z{CC?(4el`v?k&=$ns+p5S3u4iG{s~NiWxsFh( z(kxN~+D$DP>zu%v%%sXWS(^M%rKi`ihajA1@D8lu{f*+{Jb{$r0jUdT} zfQ58qSc5J7(>w!)*Mc`tm4fs)bQ_el|E2ao@kQae>-&a9mPtd6vAzlT%b-qEjZcw# zXJxTy+x)WI7D$yC)gsRxUaX#;;yU4OQ%jk;DsBS7Trz z&^Jxii%`j}NzHGER8)Dg$eDO2^65kT>Dg$EZOZ4=6DJiWNZynx$HK0?EbT!Vz)>Ae zEYfrY?FPA0xpvTazh=YT&xa7+Xj;o)IruTUdZR1@4M{+yiLtC0zrA>8^)ALBE$O7} z{3bFI2ADz--4UP8{}C%e$=Vh+|A45EkKUPU)%$e~aRucI;6clOadlg_t;gX>qpbVO zExOZn`!Ir;2{O8%(tUEM1CfxhVwZX4bbx3X9rIC%`poRr6hFh~^&`JnYqb#t|zBmEzcR(cu{(TjB84JvC%8pgIyjDuptTNpSJ=pcL!;{mhJ9OiZ^T}k!! zDF^%0>Vb@6?F1!Jx9E4f3Et{M`R$lT>=)tvSxxh-bhB9@KjtCdtKgsF6Th0De`D_S zaNXA_+laKcUl*wS64t}@r}#Q1!kn0^j_unHWLF6DTRpdpmDSdc{}o3ZbXBxmXR=k~ zRgiH@kgWuKCjfbkL>)K~0jxucc4^wlcsJR|_D+2C3q}CBcgAx!V(;>hRvWSPMd25+ zB!iK3UF#f^IFC}N5&OgIvmOwBW*&f?fh3UMHFZ(E<;=ht_z2XXF5xYQ9U!-jxdvQC zV*kyHaJ-u8K0`v+5Asu|w~MV97sKc2#ZDQ|GL3UjO8!)S(6pG?-ue?zb`Udn(VOpt8sRvp-YD|v(=8&M8 z2yv`7S^DY&Dn1l&Zju{l9AK9UC?OowlCjoT*7Y+3pAHU=v(^F2{&p&qB;vhGpbNOQ z47RthL(TCAIJYz1F`Iyl*S`f=RwyT3Nj*<*oPCq_SgW6{)P*vU3{kodQiX{PShxVe z{RWa0_Ozcp4K{~YBemoxg7W_lxM~%84dkf$rRx<=HjF$l!Mo$>X?Y_{KjmNrrRL)C zqd|IRTeU|*?<%%k+?#BE^G^MB*1qEl;62L()_$-b zn5Y-qf}d}}exR2&6=Rv%J5A~rM(YU+s%q}^`%+f@2kXt;zQ||p0_9${ znX=qp`b4XXM<6%lS7F|0t}_tYIO$I^X5iEgsaI9)+Onb#17VpbR?M)W!;#)Tz#@EY zD&$%CwW}3D{_XscUv!!>u)t|aV%8bQYA2s`@H^>|XuG1d;I3RrYxE>|ES~LdyymD` zmK7pQv!M|%0Thh=?XQ}Dx({T@mA+|PI=+5&4I6ugihsD^%<37@Uwi_ui&3>NVU)-S zm|l^+N^UU9Ml2^-bKY*2aS`HH0!~+)Qe1u)t$Nh9z9+qAo@69S;3C6e;m!) z@~S^_Bz!vib>!E5d+@{sI)$~T8nDwWFGr+%4=b5uC8S0iuR1UKl@h7h?x~h}cH@Iw z;_bd9n*)QplvGkf&C`LfYklI)apyrVe#uyBUYpH}Zy)NH%zUorB4(r61cMb5ERy;FT1 z=?fnm*@Pw|92KV`FB*9UAT}bz?#upmAK|12G!}>z@_erZ-~w(xP}~0<-SEHlI;~WQ ztHdQcjG(|m*_{8HdrSsySMHy>q|GDhX3cD2jj4JcT>8kV=-}l7OdHd>iAWKCZ$!+$I5cw;k-uJF64j;H5#&Nzpa82gF#;@ zasp4sTPp|xr6oju4oRdA;^kfE?_Cr{EAEv-#6x|U@6sUC+HO2akwX|d4ses&m)_ZgM$9E@J#ZHJyO=92KX#XZ{LS@f7IQ zW3ySBdp|i8=95a#Fvw>D^!CqKFTak@SK?BL7f2@K*LW-G*qig*TN*3ak=I=Fjt`Wz z)_1~g=?#6nHR27>RhbEwYfoDZ`ERduw}0uz2Y?QxLEE@rdi4wDZRVOM+V%ui0HIC1 zjT1Hcg+OalM$J@WCHGb<=mOIysam1NT@$MqDgqhD@yN0_XQ zeWvq#oL5A)nD+dA`wNDvO8*A6P@JbM zG`X(R#aqQ9PGAki7F^EYnPt;Mk_60hsJ9S408ApGVK_uFlw;Zqj$N4*lG#v1svQmEBFAJE559shwRXgN)6t35 zte_I1k0|Uwt`$P=o)Y0TgKY3Eidcb1Oqs3+*^osg;>&!1VqakJG)c*bNx}mG-!0p; za>2uoRJ1R@p;PkD4OVkbu~npq-|xY$g)eBY_nNo<_9A!TQf!Bgaw}q14qhZS1$p*= ziL;B&qVk&LgC-NlxksSrYnvf=MY{>SuLBMT{kLX((_&x7Cc`@FKu^tvW7NC1Fs2 zRg>e9P-FiuS>G&#}X;o?x%`v7Wuzhtq|O zWjiity5dYJzoCDAg)D?7R$CC7)8sF?#nNSx?oN59BcZh%%tHn3r?KeVJzzL6CpFU{ zcdBB9>zmWd7=}m0Jl9@Z`W`)T9=1`k+O3FmDYYp3I{F2oiSq{8NT5gnC^hCx6X3bu zgk;4>s6r{Z$zD}vN74=>uE9s6;mw*g&?E4tZe>vF)n|wPwz`d@>ryQlk%I#?`!;RA zsjW#e#p@^94C3r3K%AmPb8;~d5um90_=-BVQo97Snq_vvyA&?QZZE<9dRmf!{5_Q2 zBsP87Q-n-Jx^)4q7hW}@<~|b zuT;K@5vQ`@!8_Zvuy=U+BHtGb?_=e_=i8bke+<^8ab7@VY?6T&f-zNO)KD<2Rd6u8@^;eG-*~b~oLjHSi@o*PsHlYML^Jj22Wb{DewMzDl0PS_;`HaCd^tyJp%P<~5(2%EvOW zx}sD0r$<>fJ@k@4FmwCg0KH`okn46_T&g!Yv{*cuys{__kkOUaXCr{c>6*`z*l^&xTW^#gDLQBsh`S}W^oL3s z`<$Y0!$c*|Xu?D%Sro2l*NecSVHdS&d~k!$ydXie2hm=Yci0B7%V!3q(f?xQl1cfi zkwkukWH}tKh(|X#idO>t95D_K2KcxC0}gYq<0A;$80|rz%~Z1HXXq`J+z|Uw&Y{1a zktDOWfou-*gqHtlw-8mlVH0bkr|l4_i~0nGd8kCcpHm>U+8(!Z0*=B_weyVBYeOZ}WgEv1PLU0xb%QI@Sn z8->?sKQ{a_vbI~~snW&jw&eR$Ol~=%OsXWWXbq;DjJgpCPC7)VX+zn{nQ@uYL*_|q z$laYSa}3(nfj^$ml+6qbFAZX-n=|LGKu;p(5>A4&k0q<^N#K`Pr(nAO&IEb_*&~R=)+T0c0NKzC?mDs&;_-PjDB%(tCQyUEtk~ZSMYCE{&~l2 z=-S_*o3y?gDyk9|Rx!hQfjp^v*>oULHnI{Lem*+*H8Fm{g|Xl(t^j>1K(dN7a>s>JPd(@{v2xwdYyD?lqP-!+Nx8`iLP@Nvus=8AxI2LgB?N>Is_O z0Mu!#F?)YhY#{{L@6m~qGykFQn*F`fyfD1Q%bUAtprN0(33Kl$<0rOWd+7&=H6e|) z)0p@6llw!uMObRYU|D6B!#!nh&lJAY^I&ztfeyPs>v#3ESK%3#9w#TFuFm5c0@2c! zkc0fdDaKQE??Tg-? zYpi#>m*6-o{cy~hH$WY->zJGKh9Rr^OH3T_usKKZhs`Ghiq!hqrBFp13Z2GlOPR!_ zS=y;vujwubsk{H0Nj|OQx^kBbYV(IH#^pxAR^CcR5cc z2)LeUi0LMP;#|AzvfC&pyX_Xj^51yjRu=WTd7XM3NTjX{_dkUzG7Ajyd?tUm*WuyU zgJ(~i+xTno_U92nogL|3P6y;u#wX7d?{)Dnk8DNSEy9dC3w4EZ@zV1u>PUQ+wZ(%qd)a6gh$sR zg~$i#u@lYU<5d;V*=HsX>rYx`j0dzX9w zXi3y;Ok*z)oKUm!>VEVtyf@`tY8mgPLxZBQhOT%r)+ZZ)NyouzJ@p~8cLtboCrX`e8z(|+&Wj!73PakGFBauhJ zmzfPwo`y}czm0_DZtt0!A@2OavEBx0gc8rcRsav zXY@@;M@%Z9iqb(pO6;4=2LC&lEu!9wwlhokHnX`)M%m@OX5v6V69SP67c-gE0`eeZ zLiKO}%;3|2ZnfFh!WYcL+4YXGQVIswkEcIBGjYPd`i91=D!q_0KMZ3wq~Tro3|F^0 z&x7HE2cKXv6@nohWcxR{YYc`Mjw(%hX*;N3RFM;RNddlUm5wYUNSkVdCzb4@SymgF zSZ2+SJdh0e7r*MZ&6>5Sta9}}HPvt265Br!XYnQ_|hOWIc+b-Ih9qs!1RZeP^9jnwP6KVBWz>BF8w;LIu~tY*y|8}9B{GK({2cSw=OvJw}K zj6Om_82{r7F7ejd;JqXW1MGMD%C*x~+A!PJ25qdl>1S>d^5=Q?>?ZFQ$JCpSoPA&! z9YecgfPTkKy9%G|lALF+9ha=55{#kr*-Pbsi|})*ooW0YRnF&RTc+XKYvm-2(D-KA z3%YaaX`2I{s?C&3HNgWd4BP6lk#mmxM26$Z`?qD!Cvh=&qE%%?dnT_IqD=)2lN{I0 zd^AZDS-te_eEyYLy>Nz0o(k|BX&igSBzH(6+Ki>@15ivM93zHY*aeJ$=J^)bHV2t0 zh-kZta1qW{kmpAZVsK7$etpMz2Gt&XT`TI3f~M?UB0ry~sqPWl_{)ENXd^O|?zOu8 z5Eu6NNv;X__@6f+0Do$mq;k3{WkUd_monnc$&a$@@o}OB#aKPdNjbi z+8u(`7jLHUghgBhb`3;o%$h}1i>Fgk6Rd1#fvh*su1E{sSJPK!TAzq_3s$xOhlQ#@ z-Ig^U+!r~;5amoSGMBm~j!!XmqW9PF)2 z%Z!N=LK13Z{|i=E#ysv0ju~CTq<3wG(!h45*Ngd}geNPQA*KH4WbsA-NevbyG-3=A z7DAQ1r6boZJEBhZvBFRvXNbtTT?4k?5S=I<^Us8>h-h{=+7R9gECN9LWbnGrHwg}K z=o#-9U;32~oMr^KT+6irA`1(L7*974u!5woWnZRCC^kmziIt{<`}%PeHNio2PP%Bc;EyI3@oAY)mB2QzAVGZSr?`_=N~ zKL0>L3NtiLuL?=2tdU+!9~tq$|3~ZXzk$BHjs9TmQ}nE?ttqRNd+tqkDljs2-4ra0CdlQv}%c2)p0;yjgy&2F`H z-sMy6RRw#Uv@jr|=HcW1`=kA~Nkl}-W@~m_M_a4e@FKhmaku;%O9X#K z{Xag9KD!BIhHCzx2?OC@cCo`o+2E8;a+COSzui=Y!FdY@UEa3VTxRJ4>*8^p#von9 zq#^wCe`fW+q2gquwf@ddllHM)p#pGp8m{dMk$ z4%C>E{u%6CwG}C%A)oui-Ntu)QPbrA_eJ>sZA)w zgK9IQk2lbdVF>r|ww_r(7h_2tPI1Wm=juM}R+ufSA-xZ12H>Mzw&$U3EaQE-d*1+r zl4#?!^FYAhpl#(A_ez_iBO{jOyVFh{$;&vhQ?GUCZTa(~&OblL3})`+Ro0XvNpzRm z?Kl)SgkOQs$!bCP4$Zb6&2DH)F;i4Rgtv-q zt9oH{F|?=NCwEoHdCK}yktyvt6nR>x7ukOD{@bnvuTFb`;W);k*VyyEiZ~sAK5ysF zkhX|R&$>SH!?(NtIkC`oO*lxkwjS(H{@${tH~n!QJC<5@`kUo+QdaHkmAd;Ch)p!2 z)VE<)W87o4_(a&ghT-a22^A{@>jDOu)*?-Z=wCNKf^<%SdXqDydrkw*Z-NC3qEx&N zsH#JdOqKBuWG0HkIO zjh(QVY7TT%){GBYCfHYEOcM^41G+Hb?z{PkQ`h&a%}$0?X}bF&>F!2Ws4+Y8GUj?{ zHL;;MlIele5u?G-NoRElQ4iwy^_>N6(zugLz>_Lkq9XwB7k4qO@<`9djcQs_glTAL z^xzBsoKGqAl89sd{G(kjh~@isM~Y3EI*Y}2C&z+ld{6%-|39VeS|EQoxJuzfsGkMLe6NF5bU3vicz+@K8H6$Au2>;tndbXGMx}>ri7z0 z@KED6GP1h*_ldeb_SoSJ<2g-(vbMjfe2WQ!Jo#9LBH3!ozU3k<(;ndEaq?6UTs^+eLrgeRC z3i`h|UXPc3M$F30N*au=MN;xRQ1~fBc6$a=x^5tlIB}m&j*9lrw@wK_nEHYG?HTI( zzt($#zoSM6p?2Tap)k=YlFzM&kqWjT(HwZ9^$v7|{|S>rSOh=+fz-1RWL5HPkP@r) z6{(>sucHy~(D#q|Y(+d$WH%p2W}pl(k3{(nhvsvkM-Y1{Iq((oixt`#!AnhdeS74P zwD*sbNB&e@Ct4FQOt-~k5n2`KK+=W}l65F7N2v7~A|&!{ZGpQ7`s4#5EL ziJ;xxcc$3^9r_gt;{*iryk^=&D@nJo#ur7w3i*0C2rSi9D_hYRzd(r6lxqpn8Uxv0 zppNuSWuSRu*0uBk#xVww)XSt`Ij{@m$w4M!np16{S>?=_QeL7r0iVAJ7S=M#`<1il z6i`cJ_?~4|I?D;6#i^An#3jun0^f#|rFYYwFs=_U4zwXgeCEznWxwCp_ zg#%S3&nM6&LGhJZVsMtfV9#o0>%(yiyWwLXE~WbbRIDVgM)*|q9eTVEqA2^m=@bPh z$p%p5fXGkPX1>4s;&j}U5#*}0O2!*1Mt4Tl#>|+qwLL<#$_k#&UP5nz!V6d};!Qom zsR2YeFK3hu?SonsQ+KdSO9>k&)E7hku$csEQ%&6&tZpVQttx%i@C^AnWD-N6JaNSN zb$OR?Pci;Dy!Y|IuzlH+m+zL$+m|p;L$1KeZOkRlC)g_q>-@tAYimI|KZ!7ix95i= z4+inMi-1gDL?`c>{Br1JAANn_7yqQ!ajkMf*udxT^*<%$E%?B;-P7$l6Q7&KD@8zc zTBTqOrN%9Fr+r+uMBnWxBj8Mz2ob@m2Os!^P)h@vO}?fmbvNe!$yT|X9P$+2br-c= zHzh1vEMyroJ&|W2Z04ag7KjZi`t~~xI)(T$in!M0YvCg2GNoulRve$}?9!+$?42IV zCW;Q#oY-Q$H4o(?_+Q-=I^bcl0WV2|HyjwVUV(^~7GZ+OtV6CvXTF~IsXTQ-YpeEu zRw%MikcYZ%wmM{CHKU7`5_>r31-z20yc61DL|BK}oZ9S*SwV3=)pv?t4%#OBtb4Va z@S-o;=Ue=(GpSMcJ?{}CjR)c)&XheZp@$Q^yjahbKvB_pVLwesb1fJ15Eo6T?EcvNt$vJc9UxD_+h{TEyJ1ou#qkv* zN!Je!Ee(jsT?v|w&dtt0?9Jsd=`$uLCtkWgn^=&PxNBxk(9P)!l^=2OGQqVm%R^_@OVtkQnK%h>W@FC)eXQfP`+u&?UA(a3;Z`Z^qNLd0yU( zOL0Puz1Dv@+KC!K4NdtQIklt?$*$d>n04}$m2rca=AAn&5`OKgEOnam)kt4%7JS;L zCr^kqmQEom4c=G5)*f@}<=zrw5krsa^G)$q$WeBck)`K*2ISn0O7l1arSYL2H^I2N zdG$nwWNkM2dR0m6PNDOJ^QD@|lDt2Q#uV61h)yu~#Z4W+y;Wn4bk@YL7ThU3117o% zA~zdL43cWqldece067Cq?!%|L<-XCcDj_nTVJr*U2*hh%+5Mz<*o^S5Wzw;WQ;nL9 z4@P)cMYNQB%b(Lg^*D~Pfx;I~LjPBL*B%Y!{`E%^m2rtwG$vi>hMYnn>gaMxj8Zz9 zm?MdqF-9&K3`3H8Q#w)9AW4&4VsH{B%uo@PVMH!7iWrw?e)sde?7csqy=*F6e5OQ*MOizENqo*NjRrw;OaLyPUuHI}y_(Kl zGUWEe62;q`N1mA7jxWXFGdt<*I^pUZl^tTLIOOpwRKPzU^#`hvth|6*=vd0o_z95p; zBbpN{=KxAn0#0&e7w~{$>#X-&eqN=$(O7?egeF0&G18?)@%JvD-P+zSYMIVY{^)%v z-(Mfi_ULJ+341u{abfeJsq|jDDkWDSy@sOGy}cwDp-xsOj(So&HnQey&|U0Me8FbZ zsx6UqnmKizB^&guah@0ZYi%z(Uu(e0AF}Z3mcWG84m}WyvpNQT+U0l%YC+Qo6K9P9IQ2CM%9D5^MqD! z#%c1V(f&r+l0$82HQF27D)!<77G#0!s&P1MbVR8jQ2ix=u~^)enTNLzDolGi%5vUg zbkThODs44re>Lr)QXU91^qO+VqS30eISpxaPuGMzZf)W60}c;$RhrcKnXFdNUt+v+xR&8E4u zXq>vl*ebFDn@LDz^(>w299hPxS_vO>1DNWeX_t+>+x)DHLzoMif%O=`niw3_)wqP> z*i+{?UGy7s0b}Zkb^#PQ06U;712xxdUSiD9)%TYZy@dn|l5IXAd@tmUSz{$2Ju4c42E z+#I%2G>3oI^9S)~LU374XP%OcO@pYjSWEYPk{Pt*XgN0cejt_-x>z<SfXG*Hemv=fyf(m&EFUwRDDX@={J|`Fr0)Q>75R z_nEFSsEd5&^UdpY;_%R;``$^mRmUCDlV(Y$C*W(tt<$2k-Ug(0-&7-SVoXW03MTZh zqHAc;ew~ywVQWpyx>gp*%clWkdl#HyZ@DSHPP$brH=39MyV+tiTqp-W+P1uN#_oy7 zm8FgjH96}FCQo-AY)U+Uw_QJz{|n;^ZvL^(b4MP(D&al1e8oQ(g(fP9%o~mwBPaW> z79AY5dU0R$!HPv((5eIVtyRpfrpBEgvaRIuE3Lg$%ZTmm0z(m1I7ya zZ$Y2?xMl>;Bfu}Rc#yFY3Mz#zOdr=sy_>i!+WUgbsv=&V<3UTGR>_8$bs~njSSen( zi5{;xmRR9DgA?Htjc1jQh~+PN^N+!K025Ae<1#iu{vWX}26Vj|%u;~Z3R}RF9L`)k zTR;>jD?1HoqLP`5o$O>L(OiYFdDsKcUGqwF>&Tkgsk_j~12S}R=WeQEIx9I^tX7+9 z8nwB~&_=L5>o2-vAzbVsc)Yaq@g=ezCzXOxuh)oj%Vqt6vKl^ZVTy-}xl$R}3eB+z zl?O`zhps`fals|}Qr=jQ-21dTcj|GZIvVB8F>T<0bfPSXYNM28`EW`!h~*qlt%1 zf-aw|DdUH&EN=^24~sZHl;F_=tjAU=qL!i3Ht}0)FIU8t5~cWFtV{Ug*93*??ej^cIs~(xYi{kYOku zi_0%rY#y@~#0-aKIEKvb!Laoau53thLRy*g!2{D$vVyc;wiF~{Y4Zh_9=Z$l7qm6a za5QN(z`sbG7CmJ2*^Bpf5|^DbDQyv{;2Ee= zo;HPQl?`ZsSY&a5L=4qS=M&hHQ{hM{m<1V@z+?L)@%Y!`itIY}$NE|{ta=~#V&f2| zFkecUbNbFR#(}De;7AFU+GeyOt#==QF@pMxJ$<-OeFC~fp_K+oDr!lHUl0~l;LMHC zESM|I2vFy?eOt3Gzl6O!j)IhPR9(*F7ofqBhsMJsT4(!*yD@v;?$SFi^Qjh8;Y)wG zUW}vb!6A8oRqS(Bv9MsCR@YV`E=IC9f6zru?2;$Wow{BK$wyWo@50jF5fozU@bXk{RP=>wktSMTJb>e zd_ht1pBS0s#~4`bxZUx#8|=guen?J9mdZmp z(RWGa4$#F!LA(_bHyG@lnboX-n6TBG+71~+^xm=&G(~5>xC859AM#kuDzG00Vqay ze4dx1c&WF#;_6M9)Ryqz=xSVKE+i``i=aOA>6Azc(8P~#1Uu1!sF#-uud%0r~WdAfe zf)Z~JHbR_4>sn1|*=?+P5l;szqA7OYGC`eEaOoa54;|0W<`mZY7YTbq_o=O!-U8nf z=51(+I<~^T|FG}zGI3UjKZ#s$0e@k9;vR0}Q^GF(@I6f)iEm>kp%)ZZVd|ozN zIh-PFjtVm-uosq))nL&Rz|%urC|D@jFFy5IbnvBrfhv~b%jX71mEOpKO%Gu!1Gz-O zPNh(9kPVW4INW*nSxdV6os!9(wBo0@;%mn7hZF8(Z*namnF#Ymm1`PDi2jw0w6dL( z4nzDuPYG}4mL{F6;$7=3B9%^7COw+i3_^L@H)c*qwuxQR`{)bdtQs>Hc3--j==cUm zB;4qEqKJT2Ebu3*Py(g8pQ9sjkVWF~nZXN&CS&tjsFj$xqYk_@GZT#-|DpY=D9}Y>O*Wr*A ze)pZIN7EfafI+#Qwxq(yL$7YZ}Xk7n`+`xYDRz6A>&gF|n zeD)Wp)exdAU1|vU7UuY#-XREbIcCNt7k#cvMID=BMxwidt$=)xX>5U!W|{?BUsTx-V_Y4@wW!2i~SNf@_ zWxuwN&O9o8CFD(p#ANd(XRVL7dh1sDD1-O;fA1*zRT+R1Ct`F|g|%P`+Uy88WhasA zyOdQc`rC0G&%8WTz93Fn_g}B**|N_)VTW@zZ{V; zMSaioZxZWwp~Am*Tijl|R5?KQ+GT}#4~vI8+g67?HMuhza`O(7`TTtLSOVQ6|72rX zQEXMUS?00W-;!=CsJEQF7ZB?r+DlDbJ-`In#ETBHWTX3AKRHz&YGOrsx#gfHwAt41;e5=FN%g=d?FoBW`+ZGT zzephkBRrOCUe2hfU8@80Mb!tV2cleVY|ne=b~4;9 zMt;|^-mCP(v%qM+e3AXZ_LemMnUw@=Z<{Ovq4KTmx%&A0zv=z`p545PA->(B!W{#? z)~pc6rXvTPPDd5tpJrw*7TpmO*%p6@oGwekQ$F*=hSRTplfZ;P>c|KP;L)l`~6GYrV#Eb_@+%3~pRw=dI`j zcpKYS?xZd13#(|fil}lncrH2A;4{1-$R%)g@xSd@W}ZIc?^)FJ%FwbXV9AYg2!z_- z1NX1ru-0U6e|K+x+|eK(cR%Mj)3&$yUO{N%Q3ety=mOI)xW_ja9lRVkUw1D*LxZ`` z9|aM+ufq%H?hO7-^BXY)B4hyqLGd#Dr)(hEmw1XyCeGdar+O}CgdAxCdiDT4%HQeX zfQ16+`BuY^58*oA7q|fkijfEe`1U*7?TthI*#FVXzH0IJbSJqRe*HB1nSw%@X|rEI z3s%ej_!unhpFYMZ~}@O1TcKkeY}i}&{Ud3PjiBaZ+{ zD$t_xod)-{Up2V7dbwG9y5hb6ZUyM#ua^#DUZ`@HeI!`o!8d64H&^&N1mZtSyT4}u z>6EuC-phdCd}V1Bx094!Vga7~l literal 0 HcmV?d00001 diff --git a/test-data/spreadsheet/ElapsedFormatTests.xlsx b/test-data/spreadsheet/ElapsedFormatTests.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..95a093e8d4655440dba1c384fb12542587ecf7cd GIT binary patch literal 36062 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 literal 0 HcmV?d00001 diff --git a/test-data/spreadsheet/FormatChoiceTests.xls b/test-data/spreadsheet/FormatChoiceTests.xls new file mode 100644 index 0000000000000000000000000000000000000000..181676383f45f82ffeec0d1bd41bd6650fb805fc GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/test-data/spreadsheet/FormatChoiceTests.xlsx b/test-data/spreadsheet/FormatChoiceTests.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..64b5a16700c4bd68003b5ad92ec83ecf070fe181 GIT binary patch literal 46589 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≪T*zyXKP_IH>E$X$sCE4Y>AWbTh+ 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 F{{{0~uO|Qi literal 0 HcmV?d00001 diff --git a/test-data/spreadsheet/FormatConditionTests.xlsx b/test-data/spreadsheet/FormatConditionTests.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..22622586f86fc313244b68f889b643c7546d5657 GIT binary patch literal 45923 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%0Dl>rtvgkizQ>qwWPiJ;bM&}vy5 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 Y#ao)M18w!qYD8gXp#9fA`S$H!0k{kyH~;_u literal 0 HcmV?d00001 diff --git a/test-data/spreadsheet/GeneralFormatTests.xlsx b/test-data/spreadsheet/GeneralFormatTests.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4f34dada2aa2224714fd6c4631660ea0b07d04bc GIT binary patch literal 36134 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 literal 0 HcmV?d00001 diff --git a/test-data/spreadsheet/NumberFormatApproxTests.xlsx b/test-data/spreadsheet/NumberFormatApproxTests.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..db40604b441aa8bc85a7e25576ba404b9b8d9f50 GIT binary patch literal 58079 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 literal 0 HcmV?d00001 diff --git a/test-data/spreadsheet/NumberFormatTests.xlsx b/test-data/spreadsheet/NumberFormatTests.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..709a11ea677c0d13e62c47f4deead28d2818507c GIT binary patch literal 52961 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

hmpKF9 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

n1AyazlTTE` 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 literal 0 HcmV?d00001 -- 2.39.5