]> source.dussan.org Git - poi.git/commitdiff
Handle date format strings in an iso8601 style format, with a T in them. Fixes bug...
authorNick Burch <nick@apache.org>
Fri, 23 May 2014 09:18:16 +0000 (09:18 +0000)
committerNick Burch <nick@apache.org>
Fri, 23 May 2014 09:18:16 +0000 (09:18 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1597038 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/ss/usermodel/DataFormatter.java
src/java/org/apache/poi/ss/usermodel/DateUtil.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
test-data/spreadsheet/54034.xlsx [new file with mode: 0644]

index b86b09044796e585ed362d129e76e5014b1eb314..28dbfbe3fb671c9b511d782e4841bba2771aea31 100644 (file)
@@ -20,8 +20,6 @@
 ==================================================================== */
 package org.apache.poi.ss.usermodel;
 
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
 import java.math.RoundingMode;
 import java.text.DateFormatSymbols;
 import java.text.DecimalFormat;
@@ -424,6 +422,7 @@ public class DataFormatter {
         formatStr = formatStr.replaceAll(";@", "");
         formatStr = formatStr.replaceAll("\"/\"", "/"); // "/" is escaped for no reason in: mm"/"dd"/"yyyy
         formatStr = formatStr.replace("\"\"", "'");    // replace Excel quoting with Java style quoting
+        formatStr = formatStr.replaceAll("\\\\T","'T'"); // Quote the T is iso8601 style dates
 
 
         boolean hasAmPm = false;
index e4d870de7fc2d5239edd224ba496dee3161cdb91..2bc9f01713af3479e7ecc4ef82b4bdbd97c6c6ef 100644 (file)
@@ -56,7 +56,7 @@ public class DateUtil {
     private static final Pattern date_ptrn1 = Pattern.compile("^\\[\\$\\-.*?\\]");
     private static final Pattern date_ptrn2 = Pattern.compile("^\\[[a-zA-Z]+\\]");
     private static final Pattern date_ptrn3a = Pattern.compile("[yYmMdDhHsS]");
-    private static final Pattern date_ptrn3b = Pattern.compile("^[\\[\\]yYmMdDhHsS\\-/,. :\"\\\\]+0*[ampAMP/]*$");
+    private static final Pattern date_ptrn3b = Pattern.compile("^[\\[\\]yYmMdDhHsS\\-T/,. :\"\\\\]+0*[ampAMP/]*$");
     //  elapsed time patterns: [h],[m] and [s]
     private static final Pattern date_ptrn4 = Pattern.compile("^\\[([hH]+|[mM]+|[sS]+)\\]");
 
@@ -445,7 +445,7 @@ public class DateUtil {
         }
         
         // If we get here, check it's only made up, in any case, of:
-        //  y m d h s - \ / , . : [ ]
+        //  y m d h s - \ / , . : [ ] T
         // optionally followed by AM/PM
 
         boolean result = date_ptrn3b.matcher(fs).matches();
index aa8395e02d22d6247f042b05f3c4195ec150c30c..71f462361c2d5551c6891b5d2cdcae88cfa3743a 100644 (file)
 package org.apache.poi.xssf.usermodel;
 
 import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -42,7 +48,25 @@ import org.apache.poi.ss.formula.WorkbookEvaluator;
 import org.apache.poi.ss.formula.eval.ErrorEval;
 import org.apache.poi.ss.formula.eval.ValueEval;
 import org.apache.poi.ss.formula.functions.Function;
-import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.BaseTestBugzillaIssues;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.CellValue;
+import org.apache.poi.ss.usermodel.ClientAnchor;
+import org.apache.poi.ss.usermodel.Comment;
+import org.apache.poi.ss.usermodel.CreationHelper;
+import org.apache.poi.ss.usermodel.DataFormatter;
+import org.apache.poi.ss.usermodel.DateUtil;
+import org.apache.poi.ss.usermodel.Drawing;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.FormulaError;
+import org.apache.poi.ss.usermodel.FormulaEvaluator;
+import org.apache.poi.ss.usermodel.IndexedColors;
+import org.apache.poi.ss.usermodel.Name;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
 import org.apache.poi.ss.util.AreaReference;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.ss.util.CellReference;
@@ -1501,6 +1525,23 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
         
         assertThat(firstSave, equalTo(secondSave));
     }
+    
+    /**
+     * ISO-8601 style cell formats with a T in them, eg
+     * cell format of "yyyy-MM-ddTHH:mm:ss"
+     */
+    @Test
+    public void bug54034() throws IOException {
+        Workbook wb = XSSFTestDataSamples.openSampleWorkbook("54034.xlsx");
+        Sheet sheet = wb.getSheet("Sheet1");
+        Row row = sheet.getRow(1);
+        Cell cell = row.getCell(2);
+        assertTrue(DateUtil.isCellDateFormatted(cell));
+        
+        DataFormatter fmt = new DataFormatter();
+        assertEquals("yyyy\\-mm\\-dd\\Thh:mm", cell.getCellStyle().getDataFormatString());
+        assertEquals("2012-08-08T22:59", fmt.formatCellValue(cell));
+    }
 
 
     @Test
diff --git a/test-data/spreadsheet/54034.xlsx b/test-data/spreadsheet/54034.xlsx
new file mode 100644 (file)
index 0000000..2ae2beb
Binary files /dev/null and b/test-data/spreadsheet/54034.xlsx differ