From 6703c9d3fbd67d1ba0001b12380039324f645a07 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Sat, 29 Aug 2015 21:45:08 +0000 Subject: [PATCH] forbidden apis fixes git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1700076 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/ss/usermodel/DataFormatter.java | 9 +- .../ss/usermodel/ExcelStyleDateFormatter.java | 13 +- .../org/apache/poi/ss/util/CellReference.java | 3 +- .../apache/poi/ss/util/AllSSUtilTests.java | 7 +- .../poi/ss/util/TestDateFormatConverter.java | 142 +++++++++--------- 5 files changed, 95 insertions(+), 79 deletions(-) diff --git a/src/java/org/apache/poi/ss/usermodel/DataFormatter.java b/src/java/org/apache/poi/ss/usermodel/DataFormatter.java index 766ded18f..6cb9d4d71 100644 --- a/src/java/org/apache/poi/ss/usermodel/DataFormatter.java +++ b/src/java/org/apache/poi/ss/usermodel/DataFormatter.java @@ -440,8 +440,8 @@ public class DataFormatter { Matcher dateMatcher = daysAsText.matcher(formatStr); if (dateMatcher.find()) { - String match = dateMatcher.group(0); - formatStr = dateMatcher.replaceAll(match.toUpperCase().replaceAll("D", "E")); + String match = dateMatcher.group(0).toUpperCase(Locale.ROOT).replaceAll("D", "E"); + formatStr = dateMatcher.replaceAll(match); } // Convert excel date format to SimpleDateFormat. @@ -903,8 +903,9 @@ public class DataFormatter { /** * @return a DecimalFormat with parseIntegerOnly set true */ - /* package */ static DecimalFormat createIntegerOnlyFormat(String fmt) { - DecimalFormat result = new DecimalFormat(fmt); + private static DecimalFormat createIntegerOnlyFormat(String fmt) { + DecimalFormatSymbols dsf = DecimalFormatSymbols.getInstance(Locale.ROOT); + DecimalFormat result = new DecimalFormat(fmt, dsf); result.setParseIntegerOnly(true); return result; } diff --git a/src/java/org/apache/poi/ss/usermodel/ExcelStyleDateFormatter.java b/src/java/org/apache/poi/ss/usermodel/ExcelStyleDateFormatter.java index 22c8b541a..fd2b61da3 100644 --- a/src/java/org/apache/poi/ss/usermodel/ExcelStyleDateFormatter.java +++ b/src/java/org/apache/poi/ss/usermodel/ExcelStyleDateFormatter.java @@ -40,13 +40,18 @@ public class ExcelStyleDateFormatter extends SimpleDateFormat { public static final char L_BRACKET_SYMBOL = '\ue016'; public static final char LL_BRACKET_SYMBOL = '\ue017'; - private DecimalFormat format1digit = new DecimalFormat("0"); - private DecimalFormat format2digits = new DecimalFormat("00"); + private final DecimalFormat format1digit; + private final DecimalFormat format2digits; - private DecimalFormat format3digit = new DecimalFormat("0"); - private DecimalFormat format4digits = new DecimalFormat("00"); + private final DecimalFormat format3digit; + private final DecimalFormat format4digits; { + DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(Locale.ROOT); + format1digit = new DecimalFormat("0", dfs); + format2digits = new DecimalFormat("00", dfs); + format3digit = new DecimalFormat("0", dfs); + format4digits = new DecimalFormat("00", dfs); DataFormatter.setExcelStyleRoundingMode(format1digit, RoundingMode.DOWN); DataFormatter.setExcelStyleRoundingMode(format2digits, RoundingMode.DOWN); DataFormatter.setExcelStyleRoundingMode(format3digit); diff --git a/src/java/org/apache/poi/ss/util/CellReference.java b/src/java/org/apache/poi/ss/util/CellReference.java index e2c98d6ef..b4fa2b3ce 100644 --- a/src/java/org/apache/poi/ss/util/CellReference.java +++ b/src/java/org/apache/poi/ss/util/CellReference.java @@ -17,6 +17,7 @@ package org.apache.poi.ss.util; +import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -86,7 +87,7 @@ public class CellReference { * delimited and escaped as per normal syntax rules for formulas. */ public CellReference(String cellRef) { - if(cellRef.toUpperCase().endsWith("#REF!")) { + if(cellRef.toUpperCase(Locale.ROOT).endsWith("#REF!")) { throw new IllegalArgumentException("Cell reference invalid: " + cellRef); } diff --git a/src/testcases/org/apache/poi/ss/util/AllSSUtilTests.java b/src/testcases/org/apache/poi/ss/util/AllSSUtilTests.java index 5e64f75da..d0935af6c 100644 --- a/src/testcases/org/apache/poi/ss/util/AllSSUtilTests.java +++ b/src/testcases/org/apache/poi/ss/util/AllSSUtilTests.java @@ -26,12 +26,17 @@ import org.junit.runners.Suite; */ @RunWith(Suite.class) @Suite.SuiteClasses({ + TestAreaReference.class, TestCellRangeAddress.class, TestCellReference.class, + TestDateFormatConverter.class, TestExpandedDouble.class, TestNumberComparer.class, TestNumberToTextConverter.class, - TestRegion.class + TestRegion.class, + TestSheetBuilder.class, + TestSheetUtil.class, + TestWorkbookUtil.class }) public class AllSSUtilTests { } diff --git a/src/testcases/org/apache/poi/ss/util/TestDateFormatConverter.java b/src/testcases/org/apache/poi/ss/util/TestDateFormatConverter.java index 95042e50f..418070f16 100644 --- a/src/testcases/org/apache/poi/ss/util/TestDateFormatConverter.java +++ b/src/testcases/org/apache/poi/ss/util/TestDateFormatConverter.java @@ -42,78 +42,82 @@ public final class TestDateFormatConverter extends TestCase { private void outputLocaleDataFormats( Date date, boolean dates, boolean times, int style, String styleName ) throws Exception { Workbook workbook = new HSSFWorkbook(); - String sheetName; - if( dates ) { - if( times ) { - sheetName = "DateTimes"; - } else { - sheetName = "Dates"; - } - } else { - sheetName = "Times"; - } - Sheet sheet = workbook.createSheet(sheetName); - Row header = sheet.createRow(0); - header.createCell(0).setCellValue("locale"); - header.createCell(1).setCellValue("DisplayName"); - header.createCell(2).setCellValue("Excel " + styleName); - header.createCell(3).setCellValue("java.text.DateFormat"); - header.createCell(4).setCellValue("Equals"); - header.createCell(5).setCellValue("Java pattern"); - header.createCell(6).setCellValue("Excel pattern"); - - int rowNum = 1; - for( Locale locale : DateFormat.getAvailableLocales() ) { - try { - Row row = sheet.createRow(rowNum++); - - row.createCell(0).setCellValue(locale.toString()); - row.createCell(1).setCellValue(locale.getDisplayName()); - - DateFormat dateFormat; - if( dates ) { - if( times ) { - dateFormat = DateFormat.getDateTimeInstance(style, style, locale); - } else { - dateFormat = DateFormat.getDateInstance(style, locale); - } - } else { - dateFormat = DateFormat.getTimeInstance(style, locale); - } - - Cell cell = row.createCell(2); - - cell.setCellValue(date); - CellStyle cellStyle = row.getSheet().getWorkbook().createCellStyle(); - - String javaDateFormatPattern = ((SimpleDateFormat)dateFormat).toPattern(); - String excelFormatPattern = DateFormatConverter.convert(locale, javaDateFormatPattern); - - DataFormat poiFormat = row.getSheet().getWorkbook().createDataFormat(); - cellStyle.setDataFormat(poiFormat.getFormat(excelFormatPattern)); - row.createCell(3).setCellValue(dateFormat.format(date)); - - cell.setCellStyle(cellStyle); - - // the formula returns TRUE is the formatted date in column C equals to the string in column D - row.createCell(4).setCellFormula("TEXT(C"+rowNum+",G"+rowNum+")=D" + rowNum); - row.createCell(5).setCellValue(javaDateFormatPattern); - row.createCell(6).setCellValue(excelFormatPattern); - } catch (Exception e) { - throw new RuntimeException("Failed for locale: " + locale + ", having locales: " + - Arrays.toString(DateFormat.getAvailableLocales()), e); - } - } - - File outputFile = TempFile.createTempFile("Locale" + sheetName + styleName, ".xlsx"); - FileOutputStream outputStream = new FileOutputStream(outputFile); try { - workbook.write(outputStream); + String sheetName; + if( dates ) { + if( times ) { + sheetName = "DateTimes"; + } else { + sheetName = "Dates"; + } + } else { + sheetName = "Times"; + } + Sheet sheet = workbook.createSheet(sheetName); + Row header = sheet.createRow(0); + header.createCell(0).setCellValue("locale"); + header.createCell(1).setCellValue("DisplayName"); + header.createCell(2).setCellValue("Excel " + styleName); + header.createCell(3).setCellValue("java.text.DateFormat"); + header.createCell(4).setCellValue("Equals"); + header.createCell(5).setCellValue("Java pattern"); + header.createCell(6).setCellValue("Excel pattern"); + + int rowNum = 1; + for( Locale locale : DateFormat.getAvailableLocales() ) { + try { + Row row = sheet.createRow(rowNum++); + + row.createCell(0).setCellValue(locale.toString()); + row.createCell(1).setCellValue(locale.getDisplayName()); + + DateFormat dateFormat; + if( dates ) { + if( times ) { + dateFormat = DateFormat.getDateTimeInstance(style, style, locale); + } else { + dateFormat = DateFormat.getDateInstance(style, locale); + } + } else { + dateFormat = DateFormat.getTimeInstance(style, locale); + } + + Cell cell = row.createCell(2); + + cell.setCellValue(date); + CellStyle cellStyle = row.getSheet().getWorkbook().createCellStyle(); + + String javaDateFormatPattern = ((SimpleDateFormat)dateFormat).toPattern(); + String excelFormatPattern = DateFormatConverter.convert(locale, javaDateFormatPattern); + + DataFormat poiFormat = row.getSheet().getWorkbook().createDataFormat(); + cellStyle.setDataFormat(poiFormat.getFormat(excelFormatPattern)); + row.createCell(3).setCellValue(dateFormat.format(date)); + + cell.setCellStyle(cellStyle); + + // the formula returns TRUE is the formatted date in column C equals to the string in column D + row.createCell(4).setCellFormula("TEXT(C"+rowNum+",G"+rowNum+")=D" + rowNum); + row.createCell(5).setCellValue(javaDateFormatPattern); + row.createCell(6).setCellValue(excelFormatPattern); + } catch (Exception e) { + throw new RuntimeException("Failed for locale: " + locale + ", having locales: " + + Arrays.toString(DateFormat.getAvailableLocales()), e); + } + } + + File outputFile = TempFile.createTempFile("Locale" + sheetName + styleName, ".xlsx"); + FileOutputStream outputStream = new FileOutputStream(outputFile); + try { + workbook.write(outputStream); + } finally { + outputStream.close(); + } + + System.out.println("Open " + outputFile.getAbsolutePath()+" in Excel"); } finally { - outputStream.close(); + workbook.close(); } - - System.out.println("Open " + outputFile.getAbsolutePath()+" in Excel"); } public void testJavaDateFormatsInExcel() throws Exception {