From 8490e7b6cf1ce03953928dcff3aedab22a453bd3 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Sat, 22 Mar 2008 15:09:37 +0000 Subject: [PATCH] Write tests for xssf StylesTable, now able to round-trip just fine git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@640005 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/xssf/model/StylesTable.java | 27 ++- .../apache/poi/xssf/usermodel/XSSFCell.java | 1 + .../poi/xssf/model/TestStylesTable.java | 172 ++++++++++++++++++ 3 files changed, 194 insertions(+), 6 deletions(-) create mode 100644 src/ooxml/testcases/org/apache/poi/xssf/model/TestStylesTable.java diff --git a/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java b/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java index 7e1cef9ef..fcb0503da 100644 --- a/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java +++ b/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java @@ -84,8 +84,15 @@ public class StylesTable implements StylesSource, XSSFModel { doc = StyleSheetDocument.Factory.newInstance(); doc.addNewStyleSheet(); - // Add a single, default cell style xf - xfs.add(CTXf.Factory.newInstance()); + // Add a single, default cell xf and cell style xf + // Excel seems to require these + CTXf[] ctxfs = new CTXf[2]; + for (int i = 0; i < ctxfs.length; i++) { + ctxfs[i] = CTXf.Factory.newInstance(); + ctxfs[i].setNumFmtId(0); + } + xfs.add(ctxfs[0]); + styleXfs.add(ctxfs[1]); } /** @@ -224,6 +231,18 @@ public class StylesTable implements StylesSource, XSSFModel { public int _getBordersSize() { return borders.size(); } + /** + * For unit testing only + */ + public int _getXfsSize() { + return xfs.size(); + } + /** + * For unit testing only + */ + public int _getStyleXfsSize() { + return styleXfs.size(); + } /** * For unit testing only! */ @@ -246,10 +265,6 @@ public class StylesTable implements StylesSource, XSSFModel { // Requests use of whitespace for easier reading options.setSavePrettyPrint(); - // XXX This should not be needed, but apparently the setSaveOuter call above does not work in XMLBeans 2.2 - options.setSaveSyntheticDocumentElement( - new QName(CTStylesheet.type.getName().getNamespaceURI(), doc.getStyleSheet().getDomNode().getNodeName())); - // Work on the current one // Need to do this, as we don't handle diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java index c899d4c13..3d15cd919 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java @@ -95,6 +95,7 @@ public class XSSFCell implements Cell { } public CellStyle getCellStyle() { + // Zero is the empty default if(this.cell.getS() > 0) { return stylesSource.getStyleAt(this.cell.getS()); } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/model/TestStylesTable.java b/src/ooxml/testcases/org/apache/poi/xssf/model/TestStylesTable.java new file mode 100644 index 000000000..be187cc77 --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/xssf/model/TestStylesTable.java @@ -0,0 +1,172 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.xssf.model; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; + +import org.apache.poi.xssf.usermodel.XSSFCellStyle; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import junit.framework.TestCase; + +public class TestStylesTable extends TestCase { + private File xml; + + protected void setUp() throws Exception { + xml = new File( + System.getProperty("HSSF.testdata.path") + + File.separator + "Formatting.xlsx" + ); + assertTrue(xml.exists()); + } + + public void testCreateNew() throws Exception { + StylesTable st = new StylesTable(); + + // Check defaults + assertNotNull(st._getRawStylesheet()); + assertEquals(1, st._getXfsSize()); + assertEquals(1, st._getStyleXfsSize()); + assertEquals(0, st._getNumberFormatSize()); + } + + public void testCreateSaveLoad() throws Exception { + StylesTable st = new StylesTable(); + + assertNotNull(st._getRawStylesheet()); + assertEquals(1, st._getXfsSize()); + assertEquals(1, st._getStyleXfsSize()); + assertEquals(0, st._getNumberFormatSize()); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + st.writeTo(baos); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + st = new StylesTable(bais); + + assertNotNull(st._getRawStylesheet()); + assertEquals(1, st._getXfsSize()); + assertEquals(1, st._getStyleXfsSize()); + assertEquals(0, st._getNumberFormatSize()); + } + + public void testLoadExisting() throws Exception { + XSSFWorkbook workbook = new XSSFWorkbook(xml.toString()); + assertNotNull(workbook.getStylesSource()); + + StylesTable st = (StylesTable)workbook.getStylesSource(); + + doTestExisting(st); + } + public void testLoadSaveLoad() throws Exception { + XSSFWorkbook workbook = new XSSFWorkbook(xml.toString()); + assertNotNull(workbook.getStylesSource()); + + StylesTable st = (StylesTable)workbook.getStylesSource(); + doTestExisting(st); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + st.writeTo(baos); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + st = new StylesTable(bais); + doTestExisting(st); + } + public void doTestExisting(StylesTable st) throws Exception { + // Check contents + assertNotNull(st._getRawStylesheet()); + assertEquals(11, st._getXfsSize()); + assertEquals(1, st._getStyleXfsSize()); + assertEquals(8, st._getNumberFormatSize()); + + assertEquals(2, st._getFontsSize()); + assertEquals(2, st._getFillsSize()); + assertEquals(1, st._getBordersSize()); + + assertEquals("yyyy/mm/dd", st.getNumberFormatAt(165)); + assertEquals("yy/mm/dd", st.getNumberFormatAt(167)); + + assertNotNull(st.getStyleAt(0)); + assertNotNull(st.getStyleAt(1)); + assertNotNull(st.getStyleAt(2)); + + assertEquals(0, st.getStyleAt(0).getDataFormat()); + assertEquals(14, st.getStyleAt(1).getDataFormat()); + assertEquals(0, st.getStyleAt(2).getDataFormat()); + assertEquals(165, st.getStyleAt(3).getDataFormat()); + + assertEquals("yyyy/mm/dd", st.getStyleAt(3).getDataFormatString()); + } + + public void testPopulateNew() throws Exception { + StylesTable st = new StylesTable(); + + assertNotNull(st._getRawStylesheet()); + assertEquals(1, st._getXfsSize()); + assertEquals(1, st._getStyleXfsSize()); + assertEquals(0, st._getNumberFormatSize()); + + long nf1 = st.putNumberFormat("yyyy-mm-dd"); + long nf2 = st.putNumberFormat("yyyy-mm-DD"); + assertEquals(nf1, st.putNumberFormat("yyyy-mm-dd")); + + st.putStyle(new XSSFCellStyle(st)); + + // Save and re-load + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + st.writeTo(baos); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + st = new StylesTable(bais); + + assertNotNull(st._getRawStylesheet()); + assertEquals(2, st._getXfsSize()); + assertEquals(1, st._getStyleXfsSize()); + assertEquals(2, st._getNumberFormatSize()); + + assertEquals("yyyy-mm-dd", st.getNumberFormatAt(nf1)); + assertEquals(nf1, st.putNumberFormat("yyyy-mm-dd")); + assertEquals(nf2, st.putNumberFormat("yyyy-mm-DD")); + } + + public void testPopulateExisting() throws Exception { + XSSFWorkbook workbook = new XSSFWorkbook(xml.toString()); + assertNotNull(workbook.getStylesSource()); + + StylesTable st = (StylesTable)workbook.getStylesSource(); + assertEquals(11, st._getXfsSize()); + assertEquals(1, st._getStyleXfsSize()); + assertEquals(8, st._getNumberFormatSize()); + + long nf1 = st.putNumberFormat("YYYY-mm-dd"); + long nf2 = st.putNumberFormat("YYYY-mm-DD"); + assertEquals(nf1, st.putNumberFormat("YYYY-mm-dd")); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + st.writeTo(baos); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + st = new StylesTable(bais); + + assertEquals(11, st._getXfsSize()); + assertEquals(1, st._getStyleXfsSize()); + assertEquals(10, st._getNumberFormatSize()); + + assertEquals("YYYY-mm-dd", st.getNumberFormatAt(nf1)); + assertEquals(nf1, st.putNumberFormat("YYYY-mm-dd")); + assertEquals(nf2, st.putNumberFormat("YYYY-mm-DD")); + } +}