You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2011/12/20 06:54:18 UTC

svn commit: r1221108 - in /poi/trunk/src: documentation/content/xdocs/status.xml ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java ooxml/java/org/apache/poi/xssf/extractor/XSSFExcelExtractor.java

Author: nick
Date: Tue Dec 20 05:54:18 2011
New Revision: 1221108

URL: http://svn.apache.org/viewvc?rev=1221108&view=rev
Log:
Bug #52369 - XSSFExcelExtractor should format numeric cells based on the format strings applied to them

Modified:
    poi/trunk/src/documentation/content/xdocs/status.xml
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExcelExtractor.java

Modified: poi/trunk/src/documentation/content/xdocs/status.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/status.xml?rev=1221108&r1=1221107&r2=1221108&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/status.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/status.xml Tue Dec 20 05:54:18 2011
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.8-beta6" date="2012-??-??">
+           <action dev="poi-developers" type="fix">52369 - XSSFExcelExtractor should format numeric cells based on the format strings applied to them</action>
            <action dev="poi-developers" type="fix">52369 - Event based XSSF parsing should handle formatting of formula values in XSSFSheetXMLHandler</action>
            <action dev="poi-developers" type="fix">52348 - Avoid exception when creating cell style in a workbook that has an empty xf table</action>
            <action dev="poi-developers" type="fix">52219 - fixed XSSFSimpleShape to set rich text attributes from XSSFRichtextString</action>

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java?rev=1221108&r1=1221107&r2=1221108&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java Tue Dec 20 05:54:18 2011
@@ -254,7 +254,7 @@ public class XSSFSheetXMLHandler extends
                             thisStr = fv;
                          }
                       } else {
-                         // No formatter supplied, just do raw value in all cases
+                         // No formating applied, just do raw value in all cases
                          thisStr = fv;
                       }
                    }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExcelExtractor.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExcelExtractor.java?rev=1221108&r1=1221107&r2=1221108&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExcelExtractor.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExcelExtractor.java Tue Dec 20 05:54:18 2011
@@ -18,13 +18,16 @@ package org.apache.poi.xssf.extractor;
 
 import java.io.IOException;
 import java.util.Iterator;
+import java.util.Locale;
 
 import org.apache.poi.POIXMLTextExtractor;
 import org.apache.poi.hssf.extractor.ExcelExtractor;
 import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
 import org.apache.poi.openxml4j.opc.OPCPackage;
 import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.usermodel.Comment;
+import org.apache.poi.ss.usermodel.DataFormatter;
 import org.apache.poi.ss.usermodel.HeaderFooter;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.xssf.usermodel.XSSFCell;
@@ -43,6 +46,7 @@ public class XSSFExcelExtractor extends 
       XSSFRelation.MACROS_WORKBOOK
    };
    
+   private Locale locale;
 	private XSSFWorkbook workbook;
 	private boolean includeSheetNames = true;
 	private boolean formulasNotResults = false;
@@ -96,14 +100,28 @@ public class XSSFExcelExtractor extends 
     public void setIncludeHeadersFooters(boolean includeHeadersFooters) {
         this.includeHeadersFooters = includeHeadersFooters;
     }
+    /**
+     * What Locale should be used for formatting numbers (based
+     *  on the styles applied to the cells)
+     */
+    public void setLocale(Locale locale) {
+       this.locale = locale;
+    }
+    
 
-	/**
-	 * Retreives the text contents of the file
-	 */
-	public String getText() {
-		StringBuffer text = new StringBuffer();
-
-		for(int i=0; i<workbook.getNumberOfSheets(); i++) {
+   /**
+    * Retreives the text contents of the file
+    */
+   public String getText() {
+      DataFormatter formatter;
+      if(locale == null) {
+         formatter = new DataFormatter();
+      } else  {
+         formatter = new DataFormatter(locale);
+      }
+      
+      StringBuffer text = new StringBuffer();
+      for(int i=0; i<workbook.getNumberOfSheets(); i++) {
 			XSSFSheet sheet = workbook.getSheetAt(i);
 			if(includeSheetNames) {
 				text.append(workbook.getSheetName(i)).append("\n");
@@ -129,13 +147,20 @@ public class XSSFExcelExtractor extends 
 					Cell cell = ri.next();
 
 					// Is it a formula one?
-					if(cell.getCellType() == Cell.CELL_TYPE_FORMULA && formulasNotResults) {
-						text.append(cell.getCellFormula());
+					if(cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
+					   if (formulasNotResults) {
+					      text.append(cell.getCellFormula());
+					   } else {
+					      if (cell.getCachedFormulaResultType() == Cell.CELL_TYPE_STRING) {
+					         handleStringCell(text, cell);
+					      } else {
+					         handleNonStringCell(text, cell, formatter);
+					      }
+					   }
 					} else if(cell.getCellType() == Cell.CELL_TYPE_STRING) {
-						text.append(cell.getRichStringCellValue().getString());
+                  handleStringCell(text, cell);
 					} else {
-						XSSFCell xc = (XSSFCell)cell;
-						text.append(xc.getRawValue());
+                  handleNonStringCell(text, cell, formatter);
 					}
 
 					// Output the comment, if requested and exists
@@ -169,6 +194,31 @@ public class XSSFExcelExtractor extends 
 
 		return text.toString();
 	}
+	
+   private void handleStringCell(StringBuffer text, Cell cell) {
+      text.append(cell.getRichStringCellValue().getString());
+   }
+   private void handleNonStringCell(StringBuffer text, Cell cell, DataFormatter formatter) {
+      int type = cell.getCellType();
+      if (type == Cell.CELL_TYPE_FORMULA) {
+         type = cell.getCachedFormulaResultType();
+      }
+
+      if (type == Cell.CELL_TYPE_NUMERIC) {
+         CellStyle cs = cell.getCellStyle();
+
+         if (cs.getDataFormatString() != null) {
+            text.append(formatter.formatRawCellContents(
+                  cell.getNumericCellValue(), cs.getDataFormat(), cs.getDataFormatString()
+            ));
+            return;
+         }
+      }
+
+      // No supported styling applies to this cell
+      XSSFCell xcell = (XSSFCell)cell;
+      text.append( xcell.getRawValue() );
+   }
 
 	private String extractHeaderFooter(HeaderFooter hf) {
 		return ExcelExtractor._extractHeaderFooter(hf);



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org