]> source.dussan.org Git - poi.git/commitdiff
Patch 55612 - Performance improvement in HSSFCellStyle.getDataFormatString()
authorYegor Kozlov <yegor@apache.org>
Fri, 25 Oct 2013 18:41:24 +0000 (18:41 +0000)
committerYegor Kozlov <yegor@apache.org>
Fri, 25 Oct 2013 18:41:24 +0000 (18:41 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1535810 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/usermodel/HSSFCellStyle.java

index 0eca332ae7f28616398b1c69cb8094ee874abca2..7c401a106c796628477a78a4b4cf4377d7546f43 100644 (file)
 
 package org.apache.poi.hssf.usermodel;
 
+import java.util.Arrays;
+import java.util.List;
+
 import org.apache.poi.hssf.model.InternalWorkbook;
 import org.apache.poi.hssf.record.ExtendedFormatRecord;
 import org.apache.poi.hssf.record.FontRecord;
+import org.apache.poi.hssf.record.FormatRecord;
 import org.apache.poi.hssf.record.StyleRecord;
 import org.apache.poi.hssf.util.HSSFColor;
 import org.apache.poi.ss.usermodel.CellStyle;
@@ -104,9 +108,26 @@ public final class HSSFCellStyle implements CellStyle {
      * @see org.apache.poi.hssf.usermodel.HSSFDataFormat
      * @return the format string or "General" if not found
      */
+     
+    private static short lastDateFormat = Short.MIN_VALUE;
+    private static List<FormatRecord> lastFormats = null;
+    private static String getDataFormatStringCache = null;
+    
     public String getDataFormatString() {
-        return getDataFormatString(_workbook);
+        if (getDataFormatStringCache != null) {
+            if (lastDateFormat == getDataFormat() && _workbook.getFormats().equals(lastFormats)) {
+                return getDataFormatStringCache;
+            }
+        }
+
+        lastFormats = _workbook.getFormats();
+        lastDateFormat = getDataFormat();
+
+        getDataFormatStringCache = getDataFormatString(_workbook);
+
+        return getDataFormatStringCache;
     }
+
     /**
      * Get the contents of the format string, by looking up
      *  the DataFormat against the supplied workbook
@@ -826,6 +847,11 @@ public final class HSSFCellStyle implements CellStyle {
 
        // Handle matching things if we cross workbooks
        if(_workbook != source._workbook) {
+
+            lastDateFormat = Short.MIN_VALUE;
+            lastFormats = null;
+            getDataFormatStringCache = null;
+          
                        // Then we need to clone the format string,
                        //  and update the format record for this
                short fmt = (short)_workbook.createFormat(source.getDataFormatString() );
@@ -872,4 +898,5 @@ public final class HSSFCellStyle implements CellStyle {
                }
                return false;
        }
+       
 }