Merged revisions 697145 via svnmerge from

https://svn.apache.org/repos/asf/poi/trunk

........
  r697145 | josh | 2008-09-19 09:34:21 -0700 (Fri, 19 Sep 2008) | 1 line
  
  Some clean-up after r696898 (partitioning common formula logic). Fixed compiler error in example XLS2CSVmra
........


git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@697148 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Josh Micich 2008-09-19 16:47:18 +00:00
parent 140348ae0c
commit d78acff2de
3 changed files with 138 additions and 158 deletions

View File

@ -14,6 +14,7 @@
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
==================================================================== */ ==================================================================== */
package org.apache.poi.hssf.eventusermodel.examples; package org.apache.poi.hssf.eventusermodel.examples;
import java.io.FileInputStream; import java.io.FileInputStream;
@ -29,7 +30,7 @@ import org.apache.poi.hssf.eventusermodel.MissingRecordAwareHSSFListener;
import org.apache.poi.hssf.eventusermodel.EventWorkbookBuilder.SheetRecordCollectingListener; import org.apache.poi.hssf.eventusermodel.EventWorkbookBuilder.SheetRecordCollectingListener;
import org.apache.poi.hssf.eventusermodel.dummyrecord.LastCellOfRowDummyRecord; import org.apache.poi.hssf.eventusermodel.dummyrecord.LastCellOfRowDummyRecord;
import org.apache.poi.hssf.eventusermodel.dummyrecord.MissingCellDummyRecord; import org.apache.poi.hssf.eventusermodel.dummyrecord.MissingCellDummyRecord;
import org.apache.poi.hssf.model.FormulaParser; import org.apache.poi.hssf.model.HSSFFormulaParser;
import org.apache.poi.hssf.record.BOFRecord; import org.apache.poi.hssf.record.BOFRecord;
import org.apache.poi.hssf.record.BlankRecord; import org.apache.poi.hssf.record.BlankRecord;
import org.apache.poi.hssf.record.BoolErrRecord; import org.apache.poi.hssf.record.BoolErrRecord;
@ -54,21 +55,21 @@ public class XLS2CSVmra implements HSSFListener {
private int minColumns; private int minColumns;
private POIFSFileSystem fs; private POIFSFileSystem fs;
private PrintStream output; private PrintStream output;
private int lastRowNumber; private int lastRowNumber;
private int lastColumnNumber; private int lastColumnNumber;
/** Should we output the formula, or the value it has? */ /** Should we output the formula, or the value it has? */
private boolean outputFormulaValues = true; private boolean outputFormulaValues = true;
/** For parsing Formulas */ /** For parsing Formulas */
private SheetRecordCollectingListener workbookBuildingListener; private SheetRecordCollectingListener workbookBuildingListener;
private HSSFWorkbook stubWorkbook; private HSSFWorkbook stubWorkbook;
// Records we pick up as we process // Records we pick up as we process
private SSTRecord sstRecord; private SSTRecord sstRecord;
private FormatTrackingHSSFListener formatListener; private FormatTrackingHSSFListener formatListener;
// For handling formulas with string results // For handling formulas with string results
private int nextRow; private int nextRow;
private int nextColumn; private int nextColumn;
@ -85,7 +86,7 @@ public class XLS2CSVmra implements HSSFListener {
this.output = output; this.output = output;
this.minColumns = minColumns; this.minColumns = minColumns;
} }
/** /**
* Creates a new XLS -> CSV converter * Creates a new XLS -> CSV converter
* @param filename The file to process * @param filename The file to process
@ -99,38 +100,38 @@ public class XLS2CSVmra implements HSSFListener {
System.out, minColumns System.out, minColumns
); );
} }
/** /**
* Initiates the processing of the XLS file to CSV * Initiates the processing of the XLS file to CSV
*/ */
public void process() throws IOException { public void process() throws IOException {
MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(this); MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(this);
formatListener = new FormatTrackingHSSFListener(listener); formatListener = new FormatTrackingHSSFListener(listener);
HSSFEventFactory factory = new HSSFEventFactory(); HSSFEventFactory factory = new HSSFEventFactory();
HSSFRequest request = new HSSFRequest(); HSSFRequest request = new HSSFRequest();
if(outputFormulaValues) { if(outputFormulaValues) {
request.addListenerForAllRecords(formatListener); request.addListenerForAllRecords(formatListener);
} else { } else {
workbookBuildingListener = new SheetRecordCollectingListener(formatListener); workbookBuildingListener = new SheetRecordCollectingListener(formatListener);
request.addListenerForAllRecords(workbookBuildingListener); request.addListenerForAllRecords(workbookBuildingListener);
} }
factory.processWorkbookEvents(request, fs); factory.processWorkbookEvents(request, fs);
} }
/** /**
* Main HSSFListener method, processes events, and outputs the * Main HSSFListener method, processes events, and outputs the
* CSV as the file is processed. * CSV as the file is processed.
*/ */
public void processRecord(Record record) { public void processRecord(Record record) {
int thisRow = -1; int thisRow = -1;
int thisColumn = -1; int thisColumn = -1;
String thisStr = null; String thisStr = null;
switch (record.getSid()) switch (record.getSid())
{ {
case BOFRecord.sid: case BOFRecord.sid:
BOFRecord br = (BOFRecord)record; BOFRecord br = (BOFRecord)record;
if(br.getType() == BOFRecord.TYPE_WORKSHEET) { if(br.getType() == BOFRecord.TYPE_WORKSHEET) {
@ -140,109 +141,109 @@ public class XLS2CSVmra implements HSSFListener {
} }
} }
break; break;
case SSTRecord.sid: case SSTRecord.sid:
sstRecord = (SSTRecord) record; sstRecord = (SSTRecord) record;
break; break;
case BlankRecord.sid: case BlankRecord.sid:
BlankRecord brec = (BlankRecord) record; BlankRecord brec = (BlankRecord) record;
thisRow = brec.getRow(); thisRow = brec.getRow();
thisColumn = brec.getColumn(); thisColumn = brec.getColumn();
thisStr = ""; thisStr = "";
break; break;
case BoolErrRecord.sid: case BoolErrRecord.sid:
BoolErrRecord berec = (BoolErrRecord) record; BoolErrRecord berec = (BoolErrRecord) record;
thisRow = berec.getRow(); thisRow = berec.getRow();
thisColumn = berec.getColumn(); thisColumn = berec.getColumn();
thisStr = ""; thisStr = "";
break; break;
case FormulaRecord.sid: case FormulaRecord.sid:
FormulaRecord frec = (FormulaRecord) record; FormulaRecord frec = (FormulaRecord) record;
thisRow = frec.getRow(); thisRow = frec.getRow();
thisColumn = frec.getColumn(); thisColumn = frec.getColumn();
if(outputFormulaValues) { if(outputFormulaValues) {
if(Double.isNaN( frec.getValue() )) { if(Double.isNaN( frec.getValue() )) {
// Formula result is a string // Formula result is a string
// This is stored in the next record // This is stored in the next record
outputNextStringRecord = true; outputNextStringRecord = true;
nextRow = frec.getRow(); nextRow = frec.getRow();
nextColumn = frec.getColumn(); nextColumn = frec.getColumn();
} else { } else {
thisStr = formatListener.formatNumberDateCell(frec); thisStr = formatListener.formatNumberDateCell(frec);
} }
} else { } else {
thisStr = '"' + thisStr = '"' +
FormulaParser.toFormulaString(stubWorkbook, frec.getParsedExpression()) + '"'; HSSFFormulaParser.toFormulaString(stubWorkbook, frec.getParsedExpression()) + '"';
} }
break; break;
case StringRecord.sid: case StringRecord.sid:
if(outputNextStringRecord) { if(outputNextStringRecord) {
// String for formula // String for formula
StringRecord srec = (StringRecord)record; StringRecord srec = (StringRecord)record;
thisStr = srec.getString(); thisStr = srec.getString();
thisRow = nextRow; thisRow = nextRow;
thisColumn = nextColumn; thisColumn = nextColumn;
outputNextStringRecord = false; outputNextStringRecord = false;
} }
break; break;
case LabelRecord.sid: case LabelRecord.sid:
LabelRecord lrec = (LabelRecord) record; LabelRecord lrec = (LabelRecord) record;
thisRow = lrec.getRow(); thisRow = lrec.getRow();
thisColumn = lrec.getColumn(); thisColumn = lrec.getColumn();
thisStr = '"' + lrec.getValue() + '"'; thisStr = '"' + lrec.getValue() + '"';
break; break;
case LabelSSTRecord.sid: case LabelSSTRecord.sid:
LabelSSTRecord lsrec = (LabelSSTRecord) record; LabelSSTRecord lsrec = (LabelSSTRecord) record;
thisRow = lsrec.getRow(); thisRow = lsrec.getRow();
thisColumn = lsrec.getColumn(); thisColumn = lsrec.getColumn();
if(sstRecord == null) { if(sstRecord == null) {
thisStr = '"' + "(No SST Record, can't identify string)" + '"'; thisStr = '"' + "(No SST Record, can't identify string)" + '"';
} else { } else {
thisStr = '"' + sstRecord.getString(lsrec.getSSTIndex()).toString() + '"'; thisStr = '"' + sstRecord.getString(lsrec.getSSTIndex()).toString() + '"';
} }
break; break;
case NoteRecord.sid: case NoteRecord.sid:
NoteRecord nrec = (NoteRecord) record; NoteRecord nrec = (NoteRecord) record;
thisRow = nrec.getRow(); thisRow = nrec.getRow();
thisColumn = nrec.getColumn(); thisColumn = nrec.getColumn();
// TODO: Find object to match nrec.getShapeId() // TODO: Find object to match nrec.getShapeId()
thisStr = '"' + "(TODO)" + '"'; thisStr = '"' + "(TODO)" + '"';
break; break;
case NumberRecord.sid: case NumberRecord.sid:
NumberRecord numrec = (NumberRecord) record; NumberRecord numrec = (NumberRecord) record;
thisRow = numrec.getRow(); thisRow = numrec.getRow();
thisColumn = numrec.getColumn(); thisColumn = numrec.getColumn();
// Format // Format
thisStr = formatListener.formatNumberDateCell(numrec); thisStr = formatListener.formatNumberDateCell(numrec);
break; break;
case RKRecord.sid: case RKRecord.sid:
RKRecord rkrec = (RKRecord) record; RKRecord rkrec = (RKRecord) record;
thisRow = rkrec.getRow(); thisRow = rkrec.getRow();
thisColumn = rkrec.getColumn(); thisColumn = rkrec.getColumn();
thisStr = '"' + "(TODO)" + '"'; thisStr = '"' + "(TODO)" + '"';
break; break;
default: default:
break; break;
} }
// Handle new row // Handle new row
if(thisRow != -1 && thisRow != lastRowNumber) { if(thisRow != -1 && thisRow != lastRowNumber) {
lastColumnNumber = -1; lastColumnNumber = -1;
} }
// Handle missing column // Handle missing column
if(record instanceof MissingCellDummyRecord) { if(record instanceof MissingCellDummyRecord) {
MissingCellDummyRecord mc = (MissingCellDummyRecord)record; MissingCellDummyRecord mc = (MissingCellDummyRecord)record;
@ -250,7 +251,7 @@ public class XLS2CSVmra implements HSSFListener {
thisColumn = mc.getColumn(); thisColumn = mc.getColumn();
thisStr = ""; thisStr = "";
} }
// If we got something to print out, do so // If we got something to print out, do so
if(thisStr != null) { if(thisStr != null) {
if(thisColumn > 0) { if(thisColumn > 0) {
@ -258,13 +259,13 @@ public class XLS2CSVmra implements HSSFListener {
} }
output.print(thisStr); output.print(thisStr);
} }
// Update column and row count // Update column and row count
if(thisRow > -1) if(thisRow > -1)
lastRowNumber = thisRow; lastRowNumber = thisRow;
if(thisColumn > -1) if(thisColumn > -1)
lastColumnNumber = thisColumn; lastColumnNumber = thisColumn;
// Handle end of row // Handle end of row
if(record instanceof LastCellOfRowDummyRecord) { if(record instanceof LastCellOfRowDummyRecord) {
// Print out any missing commas if needed // Print out any missing commas if needed
@ -275,27 +276,27 @@ public class XLS2CSVmra implements HSSFListener {
output.print(','); output.print(',');
} }
} }
// We're onto a new row // We're onto a new row
lastColumnNumber = -1; lastColumnNumber = -1;
// End the row // End the row
output.println(); output.println();
} }
} }
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
if(args.length < 1) { if(args.length < 1) {
System.err.println("Use:"); System.err.println("Use:");
System.err.println(" XLS2CSVmra <xls file> [min columns]"); System.err.println(" XLS2CSVmra <xls file> [min columns]");
System.exit(1); System.exit(1);
} }
int minColumns = -1; int minColumns = -1;
if(args.length >= 2) { if(args.length >= 2) {
minColumns = Integer.parseInt(args[1]); minColumns = Integer.parseInt(args[1]);
} }
XLS2CSVmra xls2csv = new XLS2CSVmra(args[0], minColumns); XLS2CSVmra xls2csv = new XLS2CSVmra(args[0], minColumns);
xls2csv.process(); xls2csv.process();
} }

View File

@ -17,18 +17,16 @@
package org.apache.poi.hssf.model; package org.apache.poi.hssf.model;
import java.util.List;
import org.apache.poi.hssf.record.formula.Ptg; import org.apache.poi.hssf.record.formula.Ptg;
import org.apache.poi.hssf.usermodel.HSSFEvaluationWorkbook; import org.apache.poi.hssf.usermodel.HSSFEvaluationWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.formula.FormulaParser; import org.apache.poi.ss.formula.FormulaParser;
import org.apache.poi.ss.formula.FormulaParsingWorkbook; import org.apache.poi.ss.formula.FormulaParsingWorkbook;
import org.apache.poi.ss.formula.FormulaRenderer; import org.apache.poi.ss.formula.FormulaRenderer;
import org.apache.poi.ss.formula.FormulaRenderingWorkbook; import org.apache.poi.ss.formula.FormulaType;
/** /**
* HSSF wrapper for the {@link FormulaParser} * HSSF wrapper for the {@link FormulaParser} and {@link FormulaRenderer}
* *
* @author Josh Micich * @author Josh Micich
*/ */
@ -42,30 +40,28 @@ public final class HSSFFormulaParser {
// no instances of this class // no instances of this class
} }
/**
* Convenience method for parsing cell formulas. see {@link #parse(String, HSSFWorkbook, int)}
*/
public static Ptg[] parse(String formula, HSSFWorkbook workbook) { public static Ptg[] parse(String formula, HSSFWorkbook workbook) {
return FormulaParser.parse(formula, createParsingWorkbook(workbook)); return FormulaParser.parse(formula, createParsingWorkbook(workbook));
} }
/**
* @param formulaType a constant from {@link FormulaType}
* @return the parsed formula tokens
*/
public static Ptg[] parse(String formula, HSSFWorkbook workbook, int formulaType) { public static Ptg[] parse(String formula, HSSFWorkbook workbook, int formulaType) {
return FormulaParser.parse(formula, createParsingWorkbook(workbook), formulaType); return FormulaParser.parse(formula, createParsingWorkbook(workbook), formulaType);
} }
public static String toFormulaString(HSSFWorkbook book, List lptgs) {
return toFormulaString(HSSFEvaluationWorkbook.create(book), lptgs);
}
/** /**
* Convenience method which takes in a list then passes it to the * Static method to convert an array of {@link Ptg}s in RPN order
* other toFormulaString signature. * to a human readable string format in infix mode.
* @param book workbook for 3D and named references * @param book used for defined names and 3D references
* @param lptgs list of Ptg, can be null or empty * @param ptgs must not be <code>null</code>
* @return a human readable String * @return a human readable String
*/ */
public static String toFormulaString(FormulaRenderingWorkbook book, List lptgs) {
Ptg[] ptgs = new Ptg[lptgs.size()];
lptgs.toArray(ptgs);
return FormulaRenderer.toFormulaString(book, ptgs);
}
public static String toFormulaString(HSSFWorkbook book, Ptg[] ptgs) { public static String toFormulaString(HSSFWorkbook book, Ptg[] ptgs) {
return FormulaRenderer.toFormulaString(HSSFEvaluationWorkbook.create(book), ptgs); return FormulaRenderer.toFormulaString(HSSFEvaluationWorkbook.create(book), ptgs);
} }

View File

@ -17,7 +17,6 @@
package org.apache.poi.ss.formula; package org.apache.poi.ss.formula;
import java.util.List;
import java.util.Stack; import java.util.Stack;
import org.apache.poi.hssf.record.formula.AttrPtg; import org.apache.poi.hssf.record.formula.AttrPtg;
@ -36,33 +35,17 @@ import org.apache.poi.hssf.record.formula.Ptg;
* @author Josh Micich * @author Josh Micich
*/ */
public class FormulaRenderer { public class FormulaRenderer {
/**
* Convenience method which takes in a list then passes it to the
* other toFormulaString signature.
* @param book workbook for 3D and named references
* @param lptgs list of Ptg, can be null or empty
* @return a human readable String
*/
public static String toFormulaString(FormulaRenderingWorkbook book, List lptgs) {
String retval = null;
if (lptgs == null || lptgs.size() == 0) return "#NAME";
Ptg[] ptgs = new Ptg[lptgs.size()];
ptgs = (Ptg[])lptgs.toArray(ptgs);
retval = toFormulaString(book, ptgs);
return retval;
}
/** /**
* Static method to convert an array of Ptgs in RPN order * Static method to convert an array of {@link Ptg}s in RPN order
* to a human readable string format in infix mode. * to a human readable string format in infix mode.
* @param book workbook for named and 3D references * @param book used for defined names and 3D references
* @param ptgs array of Ptg, can be null or empty * @param ptgs must not be <code>null</code>
* @return a human readable String * @return a human readable String
*/ */
public static String toFormulaString(FormulaRenderingWorkbook book, Ptg[] ptgs) { public static String toFormulaString(FormulaRenderingWorkbook book, Ptg[] ptgs) {
if (ptgs == null || ptgs.length == 0) { if (ptgs == null || ptgs.length == 0) {
// TODO - what is the justification for returning "#NAME" (which is not "#NAME?", btw) throw new IllegalArgumentException("ptgs must not be null");
return "#NAME";
} }
Stack stack = new Stack(); Stack stack = new Stack();