diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFDataFormatter.java b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFDataFormatter.java index 425a56627d..85ceee2f9b 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFDataFormatter.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFDataFormatter.java @@ -41,409 +41,408 @@ import org.junit.Test; * Unit tests for HSSFDataFormatter.java */ public final class TestHSSFDataFormatter { - private static TimeZone userTimeZone; - + @BeforeClass public static void setTimeZone() { userTimeZone = LocaleUtil.getUserTimeZone(); LocaleUtil.setUserTimeZone(TimeZone.getTimeZone("CET")); LocaleUtil.setUserLocale(Locale.US); } - + @AfterClass public static void resetTimeZone() { LocaleUtil.setUserTimeZone(userTimeZone); LocaleUtil.setUserLocale(Locale.ROOT); } - + private final HSSFDataFormatter formatter; - private final HSSFWorkbook wb; + private final HSSFWorkbook wb; - public TestHSSFDataFormatter() { - // create the formatter to test - formatter = new HSSFDataFormatter(); + public TestHSSFDataFormatter() { + // create the formatter to test + formatter = new HSSFDataFormatter(); - // create a workbook to test with - wb = new HSSFWorkbook(); - HSSFSheet sheet = wb.createSheet(); - HSSFDataFormat format = wb.createDataFormat(); + // create a workbook to test with + wb = new HSSFWorkbook(); + HSSFSheet sheet = wb.createSheet(); + HSSFDataFormat format = wb.createDataFormat(); - // create a row and put some cells in it - HSSFRow row = sheet.createRow(0); + // create a row and put some cells in it + HSSFRow row = sheet.createRow(0); - // date value for July 8 1901 1:19 PM - double dateNum = 555.555; - // date value for July 8 1901 11:23 AM - double timeNum = 555.47431; + // date value for July 8 1901 1:19 PM + double dateNum = 555.555; + // date value for July 8 1901 11:23 AM + double timeNum = 555.47431; - //valid date formats -- all should have "Jul" in output - String[] goodDatePatterns = { - "[$-F800]dddd\\,\\ mmmm\\ dd\\,\\ yyyy", - "mmm/d/yy\\ h:mm PM;@", - "mmmm/d/yy\\ h:mm;@", - "mmmm/d;@", - "mmmm/d/yy;@", - "mmm/dd/yy;@", - "[$-409]d\\-mmm;@", - "[$-409]d\\-mmm\\-yy;@", - "[$-409]dd\\-mmm\\-yy;@", - "[$-409]mmm\\-yy;@", - "[$-409]mmmm\\-yy;@", - "[$-409]mmmm\\ d\\,\\ yyyy;@", - "[$-409]mmm/d/yy\\ h:mm:ss;@", - "[$-409]mmmm/d/yy\\ h:mm:ss am;@", - "[$-409]mmmmm;@", - "[$-409]mmmmm\\-yy;@", - "mmmm/d/yyyy;@", - "[$-409]d\\-mmm\\-yyyy;@" - }; - - //valid time formats - all should have 11:23 in output - String[] goodTimePatterns = { - "HH:MM", - "HH:MM:SS", - "HH:MM;HH:MM;HH:MM", - // This is fun - blue if positive time, - // red if negative time or green for zero! - "[BLUE]HH:MM;[RED]HH:MM;[GREEN]HH:MM", - "yyyy-mm-dd hh:mm", - "yyyy-mm-dd hh:mm:ss", - }; + //valid date formats -- all should have "Jul" in output + String[] goodDatePatterns = { + "[$-F800]dddd\\,\\ mmmm\\ dd\\,\\ yyyy", + "mmm/d/yy\\ h:mm PM;@", + "mmmm/d/yy\\ h:mm;@", + "mmmm/d;@", + "mmmm/d/yy;@", + "mmm/dd/yy;@", + "[$-409]d\\-mmm;@", + "[$-409]d\\-mmm\\-yy;@", + "[$-409]dd\\-mmm\\-yy;@", + "[$-409]mmm\\-yy;@", + "[$-409]mmmm\\-yy;@", + "[$-409]mmmm\\ d\\,\\ yyyy;@", + "[$-409]mmm/d/yy\\ h:mm:ss;@", + "[$-409]mmmm/d/yy\\ h:mm:ss am;@", + "[$-409]mmmmm;@", + "[$-409]mmmmm\\-yy;@", + "mmmm/d/yyyy;@", + "[$-409]d\\-mmm\\-yyyy;@" + }; - // valid number formats - String[] goodNumPatterns = { - "#,##0.0000", - "#,##0;[Red]#,##0", - "(#,##0.00_);(#,##0.00)", - "($#,##0.00_);[Red]($#,##0.00)", - "$#,##0.00", - "[$-809]#,##0.00", // international format - "[$-2]#,##0.00", // international format - "0000.00000%", - "0.000E+00", - "0.00E+00", - "[BLACK]0.00;[COLOR 5]##.##", - "[>999999]#,,\"M\";[>999]#,\"K\";#", // num/K/M - "[>999999]#.000,,\"M\";[>999]#.000,\"K\";#.000", // with decimals - }; + //valid time formats - all should have 11:23 in output + String[] goodTimePatterns = { + "HH:MM", + "HH:MM:SS", + "HH:MM;HH:MM;HH:MM", + // This is fun - blue if positive time, + // red if negative time or green for zero! + "[BLUE]HH:MM;[RED]HH:MM;[GREEN]HH:MM", + "yyyy-mm-dd hh:mm", + "yyyy-mm-dd hh:mm:ss", + }; - // invalid date formats -- will throw exception in DecimalFormat ctor - String[] badNumPatterns = { - "#,#$'#0.0000", - "'#','#ABC#0;##,##0", - "000 '123 4'5'6 000", - "#''0#0'1#10L16EE" - }; + // valid number formats + String[] goodNumPatterns = { + "#,##0.0000", + "#,##0;[Red]#,##0", + "(#,##0.00_);(#,##0.00)", + "($#,##0.00_);[Red]($#,##0.00)", + "$#,##0.00", + "[$-809]#,##0.00", // international format + "[$-2]#,##0.00", // international format + "0000.00000%", + "0.000E+00", + "0.00E+00", + "[BLACK]0.00;[COLOR 5]##.##", + "[>999999]#,,\"M\";[>999]#,\"K\";#", // num/K/M + "[>999999]#.000,,\"M\";[>999]#.000,\"K\";#.000", // with decimals + }; - // create cells with good date patterns - for (int i = 0; i < goodDatePatterns.length; i++) { - HSSFCell cell = row.createCell(i); - cell.setCellValue(dateNum); - HSSFCellStyle cellStyle = wb.createCellStyle(); - cellStyle.setDataFormat(format.getFormat(goodDatePatterns[i])); - cell.setCellStyle(cellStyle); - } - row = sheet.createRow(1); - - // create cells with time patterns - for (int i = 0; i < goodTimePatterns.length; i++) { - HSSFCell cell = row.createCell(i); - cell.setCellValue(timeNum); - HSSFCellStyle cellStyle = wb.createCellStyle(); - cellStyle.setDataFormat(format.getFormat(goodTimePatterns[i])); - cell.setCellStyle(cellStyle); - } - row = sheet.createRow(2); + // invalid date formats -- will throw exception in DecimalFormat ctor + String[] badNumPatterns = { + "#,#$'#0.0000", + "'#','#ABC#0;##,##0", + "000 '123 4'5'6 000", + "#''0#0'1#10L16EE" + }; - // create cells with num patterns - for (int i = 0; i < goodNumPatterns.length; i++) { - HSSFCell cell = row.createCell(i); - cell.setCellValue(-1234567890.12345); - HSSFCellStyle cellStyle = wb.createCellStyle(); - cellStyle.setDataFormat(format.getFormat(goodNumPatterns[i])); - cell.setCellStyle(cellStyle); - } - row = sheet.createRow(3); + // create cells with good date patterns + for (int i = 0; i < goodDatePatterns.length; i++) { + HSSFCell cell = row.createCell(i); + cell.setCellValue(dateNum); + HSSFCellStyle cellStyle = wb.createCellStyle(); + cellStyle.setDataFormat(format.getFormat(goodDatePatterns[i])); + cell.setCellStyle(cellStyle); + } + row = sheet.createRow(1); - // create cells with bad num patterns - for (int i = 0; i < badNumPatterns.length; i++) { - HSSFCell cell = row.createCell(i); - // If the '.' is any later, ExcelGeneralNumberFormat will render an integer, as Excel does. - cell.setCellValue(12345678.9012345); - HSSFCellStyle cellStyle = wb.createCellStyle(); - cellStyle.setDataFormat(format.getFormat(badNumPatterns[i])); - cell.setCellStyle(cellStyle); - } + // create cells with time patterns + for (int i = 0; i < goodTimePatterns.length; i++) { + HSSFCell cell = row.createCell(i); + cell.setCellValue(timeNum); + HSSFCellStyle cellStyle = wb.createCellStyle(); + cellStyle.setDataFormat(format.getFormat(goodTimePatterns[i])); + cell.setCellStyle(cellStyle); + } + row = sheet.createRow(2); - // Built in formats + // create cells with num patterns + for (int i = 0; i < goodNumPatterns.length; i++) { + HSSFCell cell = row.createCell(i); + cell.setCellValue(-1234567890.12345); + HSSFCellStyle cellStyle = wb.createCellStyle(); + cellStyle.setDataFormat(format.getFormat(goodNumPatterns[i])); + cell.setCellStyle(cellStyle); + } + row = sheet.createRow(3); - { // Zip + 4 format - row = sheet.createRow(4); - HSSFCell cell = row.createCell(0); - cell.setCellValue(123456789); - HSSFCellStyle cellStyle = wb.createCellStyle(); - cellStyle.setDataFormat(format.getFormat("00000-0000")); - cell.setCellStyle(cellStyle); - } + // create cells with bad num patterns + for (int i = 0; i < badNumPatterns.length; i++) { + HSSFCell cell = row.createCell(i); + // If the '.' is any later, ExcelGeneralNumberFormat will render an integer, as Excel does. + cell.setCellValue(12345678.9012345); + HSSFCellStyle cellStyle = wb.createCellStyle(); + cellStyle.setDataFormat(format.getFormat(badNumPatterns[i])); + cell.setCellStyle(cellStyle); + } - { // Phone number format - row = sheet.createRow(5); - HSSFCell cell = row.createCell(0); - cell.setCellValue(5551234567D); - HSSFCellStyle cellStyle = wb.createCellStyle(); - cellStyle.setDataFormat(format.getFormat("[<=9999999]###-####;(###) ###-####")); - cell.setCellStyle(cellStyle); - } + // Built in formats - { // SSN format - row = sheet.createRow(6); - HSSFCell cell = row.createCell(0); - cell.setCellValue(444551234); - HSSFCellStyle cellStyle = wb.createCellStyle(); - cellStyle.setDataFormat(format.getFormat("000-00-0000")); - cell.setCellStyle(cellStyle); - } + { // Zip + 4 format + row = sheet.createRow(4); + HSSFCell cell = row.createCell(0); + cell.setCellValue(123456789); + HSSFCellStyle cellStyle = wb.createCellStyle(); + cellStyle.setDataFormat(format.getFormat("00000-0000")); + cell.setCellStyle(cellStyle); + } - { // formula cell - row = sheet.createRow(7); - HSSFCell cell = row.createCell(0); - cell.setCellType(HSSFCell.CELL_TYPE_FORMULA); - cell.setCellFormula("SUM(12.25,12.25)/100"); - HSSFCellStyle cellStyle = wb.createCellStyle(); - cellStyle.setDataFormat(format.getFormat("##.00%;")); - cell.setCellStyle(cellStyle); - } - } + { // Phone number format + row = sheet.createRow(5); + HSSFCell cell = row.createCell(0); + cell.setCellValue(5551234567D); + HSSFCellStyle cellStyle = wb.createCellStyle(); + cellStyle.setDataFormat(format.getFormat("[<=9999999]###-####;(###) ###-####")); + cell.setCellStyle(cellStyle); + } - /** - * Test getting formatted values from numeric and date cells. - */ - @Test - public void testGetFormattedCellValueHSSFCell() { - // Valid date formats -- cell values should be date formatted & not "555.555" - HSSFRow row = wb.getSheetAt(0).getRow(0); - Iterator it = row.cellIterator(); - log("==== VALID DATE FORMATS ===="); - while (it.hasNext()) { - Cell cell = it.next(); - String fmtval = formatter.formatCellValue(cell); - log(fmtval); + { // SSN format + row = sheet.createRow(6); + HSSFCell cell = row.createCell(0); + cell.setCellValue(444551234); + HSSFCellStyle cellStyle = wb.createCellStyle(); + cellStyle.setDataFormat(format.getFormat("000-00-0000")); + cell.setCellStyle(cellStyle); + } - // should not be equal to "555.555" - assertTrue( DateUtil.isCellDateFormatted(cell) ); - assertTrue( ! "555.555".equals(fmtval)); + { // formula cell + row = sheet.createRow(7); + HSSFCell cell = row.createCell(0); + cell.setCellType(HSSFCell.CELL_TYPE_FORMULA); + cell.setCellFormula("SUM(12.25,12.25)/100"); + HSSFCellStyle cellStyle = wb.createCellStyle(); + cellStyle.setDataFormat(format.getFormat("##.00%;")); + cell.setCellStyle(cellStyle); + } + } - String fmt = cell.getCellStyle().getDataFormatString(); + /** + * Test getting formatted values from numeric and date cells. + */ + @Test + public void testGetFormattedCellValueHSSFCell() { + // Valid date formats -- cell values should be date formatted & not "555.555" + HSSFRow row = wb.getSheetAt(0).getRow(0); + Iterator it = row.cellIterator(); + log("==== VALID DATE FORMATS ===="); + while (it.hasNext()) { + Cell cell = it.next(); + String fmtval = formatter.formatCellValue(cell); + log(fmtval); - //assert the correct month form, as in the original Excel format - String monthPtrn = fmt.indexOf("mmmm") != -1 ? "MMMM" : "MMM"; - // this line is intended to compute how "July" would look like in the current locale - SimpleDateFormat sdf = new SimpleDateFormat(monthPtrn, LocaleUtil.getUserLocale()); - sdf.setTimeZone(LocaleUtil.getUserTimeZone()); - Calendar calDef = LocaleUtil.getLocaleCalendar(2010, 6, 15, 0, 0, 0); - String jul = sdf.format(calDef.getTime()); - // special case for MMMMM = 1st letter of month name - if(fmt.indexOf("mmmmm") > -1) { - jul = jul.substring(0,1); - } - // check we found july properly - assertTrue("Format came out incorrect - " + fmt, fmtval.indexOf(jul) > -1); - } + // should not be equal to "555.555" + assertTrue( DateUtil.isCellDateFormatted(cell) ); + assertTrue( ! "555.555".equals(fmtval)); - row = wb.getSheetAt(0).getRow(1); - it = row.cellIterator(); - log("==== VALID TIME FORMATS ===="); - while (it.hasNext()) { - Cell cell = it.next(); - String fmt = cell.getCellStyle().getDataFormatString(); - String fmtval = formatter.formatCellValue(cell); - log(fmtval); + String fmt = cell.getCellStyle().getDataFormatString(); - // should not be equal to "555.47431" - assertTrue( DateUtil.isCellDateFormatted(cell) ); - assertTrue( ! "555.47431".equals(fmtval)); + //assert the correct month form, as in the original Excel format + String monthPtrn = fmt.indexOf("mmmm") != -1 ? "MMMM" : "MMM"; + // this line is intended to compute how "July" would look like in the current locale + SimpleDateFormat sdf = new SimpleDateFormat(monthPtrn, LocaleUtil.getUserLocale()); + sdf.setTimeZone(LocaleUtil.getUserTimeZone()); + Calendar calDef = LocaleUtil.getLocaleCalendar(2010, 6, 15, 0, 0, 0); + String jul = sdf.format(calDef.getTime()); + // special case for MMMMM = 1st letter of month name + if(fmt.indexOf("mmmmm") > -1) { + jul = jul.substring(0,1); + } + // check we found july properly + assertTrue("Format came out incorrect - " + fmt, fmtval.indexOf(jul) > -1); + } - // check we found the time properly - assertTrue("Format came out incorrect - " + fmt + ": " + fmtval + ", but expected to find '11:23'", - fmtval.indexOf("11:23") > -1); - } - - // test number formats - row = wb.getSheetAt(0).getRow(1); - it = row.cellIterator(); - log("\n==== VALID NUMBER FORMATS ===="); - while (it.hasNext()) { - HSSFCell cell = (HSSFCell) it.next(); - final String formatted = formatter.formatCellValue(cell); - log(formatted); + row = wb.getSheetAt(0).getRow(1); + it = row.cellIterator(); + log("==== VALID TIME FORMATS ===="); + while (it.hasNext()) { + Cell cell = it.next(); + String fmt = cell.getCellStyle().getDataFormatString(); + String fmtval = formatter.formatCellValue(cell); + log(fmtval); - // should not include "12345678" - note that the input value was negative - assertTrue(formatted != null && ! formatted.contains("12345678")); - } + // should not be equal to "555.47431" + assertTrue( DateUtil.isCellDateFormatted(cell) ); + assertTrue( ! "555.47431".equals(fmtval)); - // test bad number formats - row = wb.getSheetAt(0).getRow(3); - it = row.cellIterator(); - log("\n==== INVALID NUMBER FORMATS ===="); - while (it.hasNext()) { - HSSFCell cell = (HSSFCell) it.next(); - log(formatter.formatCellValue(cell)); - // in some locales the the decimal delimiter is a comma, not a dot - char decimalSeparator = new DecimalFormatSymbols(LocaleUtil.getUserLocale()).getDecimalSeparator(); - assertEquals("12345678" + decimalSeparator + "9", formatter.formatCellValue(cell)); - } + // check we found the time properly + assertTrue("Format came out incorrect - " + fmt + ": " + fmtval + ", but expected to find '11:23'", + fmtval.indexOf("11:23") > -1); + } - // test Zip+4 format - row = wb.getSheetAt(0).getRow(4); - HSSFCell cell = row.getCell(0); - log("\n==== ZIP FORMAT ===="); - log(formatter.formatCellValue(cell)); - assertEquals("12345-6789", formatter.formatCellValue(cell)); + // test number formats + row = wb.getSheetAt(0).getRow(1); + it = row.cellIterator(); + log("\n==== VALID NUMBER FORMATS ===="); + while (it.hasNext()) { + HSSFCell cell = (HSSFCell) it.next(); + final String formatted = formatter.formatCellValue(cell); + log(formatted); - // test phone number format - row = wb.getSheetAt(0).getRow(5); - cell = row.getCell(0); - log("\n==== PHONE FORMAT ===="); - log(formatter.formatCellValue(cell)); - assertEquals("(555) 123-4567", formatter.formatCellValue(cell)); + // should not include "12345678" - note that the input value was negative + assertTrue(formatted != null && ! formatted.contains("12345678")); + } - // test SSN format - row = wb.getSheetAt(0).getRow(6); - cell = row.getCell(0); - log("\n==== SSN FORMAT ===="); - log(formatter.formatCellValue(cell)); - assertEquals("444-55-1234", formatter.formatCellValue(cell)); + // test bad number formats + row = wb.getSheetAt(0).getRow(3); + it = row.cellIterator(); + log("\n==== INVALID NUMBER FORMATS ===="); + while (it.hasNext()) { + HSSFCell cell = (HSSFCell) it.next(); + log(formatter.formatCellValue(cell)); + // in some locales the the decimal delimiter is a comma, not a dot + char decimalSeparator = new DecimalFormatSymbols(LocaleUtil.getUserLocale()).getDecimalSeparator(); + assertEquals("12345678" + decimalSeparator + "9", formatter.formatCellValue(cell)); + } - // null test-- null cell should result in empty String - assertEquals(formatter.formatCellValue(null), ""); + // test Zip+4 format + row = wb.getSheetAt(0).getRow(4); + HSSFCell cell = row.getCell(0); + log("\n==== ZIP FORMAT ===="); + log(formatter.formatCellValue(cell)); + assertEquals("12345-6789", formatter.formatCellValue(cell)); - // null test-- null cell should result in empty String - assertEquals(formatter.formatCellValue(null), ""); - } + // test phone number format + row = wb.getSheetAt(0).getRow(5); + cell = row.getCell(0); + log("\n==== PHONE FORMAT ===="); + log(formatter.formatCellValue(cell)); + assertEquals("(555) 123-4567", formatter.formatCellValue(cell)); - @Test - public void testGetFormattedCellValueHSSFCellHSSFFormulaEvaluator() { - // test formula format - HSSFRow row = wb.getSheetAt(0).getRow(7); - HSSFCell cell = row.getCell(0); - log("\n==== FORMULA CELL ===="); + // test SSN format + row = wb.getSheetAt(0).getRow(6); + cell = row.getCell(0); + log("\n==== SSN FORMAT ===="); + log(formatter.formatCellValue(cell)); + assertEquals("444-55-1234", formatter.formatCellValue(cell)); - // first without a formula evaluator - log(formatter.formatCellValue(cell) + "\t (without evaluator)"); - assertEquals("SUM(12.25,12.25)/100", formatter.formatCellValue(cell)); + // null test-- null cell should result in empty String + assertEquals(formatter.formatCellValue(null), ""); - // now with a formula evaluator - HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(wb); - log(formatter.formatCellValue(cell, evaluator) + "\t\t\t (with evaluator)"); - char decimalSeparator = new DecimalFormatSymbols(LocaleUtil.getUserLocale()).getDecimalSeparator(); - assertEquals("24" + decimalSeparator + "50%", formatter.formatCellValue(cell,evaluator)); - - } + // null test-- null cell should result in empty String + assertEquals(formatter.formatCellValue(null), ""); + } - /** - * Test using a default number format. The format should be used when a - * format pattern cannot be parsed by DecimalFormat. - */ - @Test - public void testSetDefaultNumberFormat() { - HSSFRow row = wb.getSheetAt(0).getRow(3); - Iterator it = row.cellIterator(); - DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(LocaleUtil.getUserLocale()); - Format defaultFormat = new DecimalFormat("Balance $#,#00.00 USD;Balance -$#,#00.00 USD", dfs); - formatter.setDefaultNumberFormat(defaultFormat); + @Test + public void testGetFormattedCellValueHSSFCellHSSFFormulaEvaluator() { + // test formula format + HSSFRow row = wb.getSheetAt(0).getRow(7); + HSSFCell cell = row.getCell(0); + log("\n==== FORMULA CELL ===="); - log("\n==== DEFAULT NUMBER FORMAT ===="); - while (it.hasNext()) { - Cell cell = it.next(); - cell.setCellValue(cell.getNumericCellValue() * Math.random() / 1000000 - 1000); - log(formatter.formatCellValue(cell)); - assertTrue(formatter.formatCellValue(cell).startsWith("Balance ")); - assertTrue(formatter.formatCellValue(cell).endsWith(" USD")); - } - } - - /** - * A format of "@" means use the general format - */ - @Test - public void testGeneralAtFormat() { - HSSFWorkbook workbook = HSSFTestDataSamples.openSampleWorkbook("47154.xls"); - HSSFSheet sheet = workbook.getSheetAt(0); - HSSFRow row = sheet.getRow(0); - HSSFCell cellA1 = row.getCell(0); + // first without a formula evaluator + log(formatter.formatCellValue(cell) + "\t (without evaluator)"); + assertEquals("SUM(12.25,12.25)/100", formatter.formatCellValue(cell)); - assertEquals(HSSFCell.CELL_TYPE_NUMERIC, cellA1.getCellType()); - assertEquals(2345.0, cellA1.getNumericCellValue(), 0.0001); - assertEquals("@", cellA1.getCellStyle().getDataFormatString()); + // now with a formula evaluator + HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(wb); + log(formatter.formatCellValue(cell, evaluator) + "\t\t\t (with evaluator)"); + char decimalSeparator = new DecimalFormatSymbols(LocaleUtil.getUserLocale()).getDecimalSeparator(); + assertEquals("24" + decimalSeparator + "50%", formatter.formatCellValue(cell,evaluator)); - HSSFDataFormatter f = new HSSFDataFormatter(); + } - assertEquals("2345", f.formatCellValue(cellA1)); - } - - /** - * Tests various formattings of dates and numbers - */ - @Test - public void testFromFile() { - HSSFWorkbook workbook = HSSFTestDataSamples.openSampleWorkbook("Formatting.xls"); - HSSFSheet sheet = workbook.getSheetAt(0); - - HSSFDataFormatter f = new HSSFDataFormatter(); + /** + * Test using a default number format. The format should be used when a + * format pattern cannot be parsed by DecimalFormat. + */ + @Test + public void testSetDefaultNumberFormat() { + HSSFRow row = wb.getSheetAt(0).getRow(3); + Iterator it = row.cellIterator(); + DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(LocaleUtil.getUserLocale()); + Format defaultFormat = new DecimalFormat("Balance $#,#00.00 USD;Balance -$#,#00.00 USD", dfs); + formatter.setDefaultNumberFormat(defaultFormat); - // This one is one of the nasty auto-locale changing ones... - assertEquals("dd/mm/yyyy", sheet.getRow(1).getCell(0).getStringCellValue()); - assertEquals("m/d/yy", sheet.getRow(1).getCell(1).getCellStyle().getDataFormatString()); - assertEquals("11/24/06", f.formatCellValue(sheet.getRow(1).getCell(1))); - - assertEquals("yyyy/mm/dd", sheet.getRow(2).getCell(0).getStringCellValue()); - assertEquals("yyyy/mm/dd", sheet.getRow(2).getCell(1).getCellStyle().getDataFormatString()); - assertEquals("2006/11/24", f.formatCellValue(sheet.getRow(2).getCell(1))); - - assertEquals("yyyy-mm-dd", sheet.getRow(3).getCell(0).getStringCellValue()); - assertEquals("yyyy\\-mm\\-dd", sheet.getRow(3).getCell(1).getCellStyle().getDataFormatString()); - assertEquals("2006-11-24", f.formatCellValue(sheet.getRow(3).getCell(1))); - - assertEquals("yy/mm/dd", sheet.getRow(4).getCell(0).getStringCellValue()); - assertEquals("yy/mm/dd", sheet.getRow(4).getCell(1).getCellStyle().getDataFormatString()); - assertEquals("06/11/24", f.formatCellValue(sheet.getRow(4).getCell(1))); - - // Another builtin fun one - assertEquals("dd/mm/yy", sheet.getRow(5).getCell(0).getStringCellValue()); - assertEquals("d/m/yy;@", sheet.getRow(5).getCell(1).getCellStyle().getDataFormatString()); - assertEquals("24/11/06", f.formatCellValue(sheet.getRow(5).getCell(1))); - - assertEquals("dd-mm-yy", sheet.getRow(6).getCell(0).getStringCellValue()); - assertEquals("dd\\-mm\\-yy", sheet.getRow(6).getCell(1).getCellStyle().getDataFormatString()); - assertEquals("24-11-06", f.formatCellValue(sheet.getRow(6).getCell(1))); - - - // Another builtin fun one - assertEquals("nn.nn", sheet.getRow(9).getCell(0).getStringCellValue()); - assertEquals("General", sheet.getRow(9).getCell(1).getCellStyle().getDataFormatString()); - assertEquals("10.52", f.formatCellValue(sheet.getRow(9).getCell(1))); + log("\n==== DEFAULT NUMBER FORMAT ===="); + while (it.hasNext()) { + Cell cell = it.next(); + cell.setCellValue(cell.getNumericCellValue() * Math.random() / 1000000 - 1000); + log(formatter.formatCellValue(cell)); + assertTrue(formatter.formatCellValue(cell).startsWith("Balance ")); + assertTrue(formatter.formatCellValue(cell).endsWith(" USD")); + } + } - // text isn't quite the format rule... - assertEquals("nn.nnn", sheet.getRow(10).getCell(0).getStringCellValue()); - assertEquals("0.000", sheet.getRow(10).getCell(1).getCellStyle().getDataFormatString()); - assertEquals("10.520", f.formatCellValue(sheet.getRow(10).getCell(1))); + /** + * A format of "@" means use the general format + */ + @Test + public void testGeneralAtFormat() { + HSSFWorkbook workbook = HSSFTestDataSamples.openSampleWorkbook("47154.xls"); + HSSFSheet sheet = workbook.getSheetAt(0); + HSSFRow row = sheet.getRow(0); + HSSFCell cellA1 = row.getCell(0); - // text isn't quite the format rule... - assertEquals("nn.n", sheet.getRow(11).getCell(0).getStringCellValue()); - assertEquals("0.0", sheet.getRow(11).getCell(1).getCellStyle().getDataFormatString()); - assertEquals("10.5", f.formatCellValue(sheet.getRow(11).getCell(1))); + assertEquals(HSSFCell.CELL_TYPE_NUMERIC, cellA1.getCellType()); + assertEquals(2345.0, cellA1.getNumericCellValue(), 0.0001); + assertEquals("@", cellA1.getCellStyle().getDataFormatString()); - // text isn't quite the format rule... - assertEquals("\u00a3nn.nn", sheet.getRow(12).getCell(0).getStringCellValue()); - assertEquals("\"\u00a3\"#,##0.00", sheet.getRow(12).getCell(1).getCellStyle().getDataFormatString()); - assertEquals("\u00a310.52", f.formatCellValue(sheet.getRow(12).getCell(1))); - } + HSSFDataFormatter f = new HSSFDataFormatter(); - private static void log(String msg) { -// if (false) { // successful tests should be silent -// System.out.println(msg); -// } - } + assertEquals("2345", f.formatCellValue(cellA1)); + } + + /** + * Tests various formattings of dates and numbers + */ + @Test + public void testFromFile() { + HSSFWorkbook workbook = HSSFTestDataSamples.openSampleWorkbook("Formatting.xls"); + HSSFSheet sheet = workbook.getSheetAt(0); + + HSSFDataFormatter f = new HSSFDataFormatter(); + + // This one is one of the nasty auto-locale changing ones... + assertEquals("dd/mm/yyyy", sheet.getRow(1).getCell(0).getStringCellValue()); + assertEquals("m/d/yy", sheet.getRow(1).getCell(1).getCellStyle().getDataFormatString()); + assertEquals("11/24/06", f.formatCellValue(sheet.getRow(1).getCell(1))); + + assertEquals("yyyy/mm/dd", sheet.getRow(2).getCell(0).getStringCellValue()); + assertEquals("yyyy/mm/dd", sheet.getRow(2).getCell(1).getCellStyle().getDataFormatString()); + assertEquals("2006/11/24", f.formatCellValue(sheet.getRow(2).getCell(1))); + + assertEquals("yyyy-mm-dd", sheet.getRow(3).getCell(0).getStringCellValue()); + assertEquals("yyyy\\-mm\\-dd", sheet.getRow(3).getCell(1).getCellStyle().getDataFormatString()); + assertEquals("2006-11-24", f.formatCellValue(sheet.getRow(3).getCell(1))); + + assertEquals("yy/mm/dd", sheet.getRow(4).getCell(0).getStringCellValue()); + assertEquals("yy/mm/dd", sheet.getRow(4).getCell(1).getCellStyle().getDataFormatString()); + assertEquals("06/11/24", f.formatCellValue(sheet.getRow(4).getCell(1))); + + // Another builtin fun one + assertEquals("dd/mm/yy", sheet.getRow(5).getCell(0).getStringCellValue()); + assertEquals("d/m/yy;@", sheet.getRow(5).getCell(1).getCellStyle().getDataFormatString()); + assertEquals("24/11/06", f.formatCellValue(sheet.getRow(5).getCell(1))); + + assertEquals("dd-mm-yy", sheet.getRow(6).getCell(0).getStringCellValue()); + assertEquals("dd\\-mm\\-yy", sheet.getRow(6).getCell(1).getCellStyle().getDataFormatString()); + assertEquals("24-11-06", f.formatCellValue(sheet.getRow(6).getCell(1))); + + + // Another builtin fun one + assertEquals("nn.nn", sheet.getRow(9).getCell(0).getStringCellValue()); + assertEquals("General", sheet.getRow(9).getCell(1).getCellStyle().getDataFormatString()); + assertEquals("10.52", f.formatCellValue(sheet.getRow(9).getCell(1))); + + // text isn't quite the format rule... + assertEquals("nn.nnn", sheet.getRow(10).getCell(0).getStringCellValue()); + assertEquals("0.000", sheet.getRow(10).getCell(1).getCellStyle().getDataFormatString()); + assertEquals("10.520", f.formatCellValue(sheet.getRow(10).getCell(1))); + + // text isn't quite the format rule... + assertEquals("nn.n", sheet.getRow(11).getCell(0).getStringCellValue()); + assertEquals("0.0", sheet.getRow(11).getCell(1).getCellStyle().getDataFormatString()); + assertEquals("10.5", f.formatCellValue(sheet.getRow(11).getCell(1))); + + // text isn't quite the format rule... + assertEquals("\u00a3nn.nn", sheet.getRow(12).getCell(0).getStringCellValue()); + assertEquals("\"\u00a3\"#,##0.00", sheet.getRow(12).getCell(1).getCellStyle().getDataFormatString()); + assertEquals("\u00a310.52", f.formatCellValue(sheet.getRow(12).getCell(1))); + } + + private static void log(String msg) { +// if (false) { // successful tests should be silent +// System.out.println(msg); +// } + } }