Finish off the example use of MissingRecordAwareHSSFListener, which outputs a csv

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@548049 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2007-06-17 15:54:52 +00:00
parent 565528df7d
commit c22c2e813c
2 changed files with 108 additions and 5 deletions

View File

@ -20,6 +20,14 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.PrintStream; import java.io.PrintStream;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.eventusermodel.HSSFEventFactory; import org.apache.poi.hssf.eventusermodel.HSSFEventFactory;
import org.apache.poi.hssf.eventusermodel.HSSFListener; import org.apache.poi.hssf.eventusermodel.HSSFListener;
@ -29,6 +37,9 @@ 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.record.BlankRecord; import org.apache.poi.hssf.record.BlankRecord;
import org.apache.poi.hssf.record.BoolErrRecord; import org.apache.poi.hssf.record.BoolErrRecord;
import org.apache.poi.hssf.record.CellValueRecordInterface;
import org.apache.poi.hssf.record.ExtendedFormatRecord;
import org.apache.poi.hssf.record.FormatRecord;
import org.apache.poi.hssf.record.FormulaRecord; import org.apache.poi.hssf.record.FormulaRecord;
import org.apache.poi.hssf.record.LabelRecord; import org.apache.poi.hssf.record.LabelRecord;
import org.apache.poi.hssf.record.LabelSSTRecord; import org.apache.poi.hssf.record.LabelSSTRecord;
@ -36,6 +47,9 @@ import org.apache.poi.hssf.record.NoteRecord;
import org.apache.poi.hssf.record.NumberRecord; import org.apache.poi.hssf.record.NumberRecord;
import org.apache.poi.hssf.record.RKRecord; import org.apache.poi.hssf.record.RKRecord;
import org.apache.poi.hssf.record.Record; import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.SSTRecord;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.poifs.filesystem.POIFSFileSystem;
/** /**
@ -51,6 +65,14 @@ public class XLS2CSVmra implements HSSFListener {
private int lastRowNumber; private int lastRowNumber;
private int lastColumnNumber; private int lastColumnNumber;
/** Should we output the formula, or the value it has? */
private boolean outputFormulaValues = true;
// Records we pick up as we process
private SSTRecord sstRecord;
private Map customFormatRecords = new Hashtable();
private List xfRecords = new ArrayList();
/** /**
* Creates a new XLS -> CSV converter * Creates a new XLS -> CSV converter
* @param fs The POIFSFileSystem to process * @param fs The POIFSFileSystem to process
@ -100,6 +122,18 @@ public class XLS2CSVmra implements HSSFListener {
switch (record.getSid()) switch (record.getSid())
{ {
case SSTRecord.sid:
sstRecord = (SSTRecord) record;
break;
case FormatRecord.sid:
FormatRecord fr = (FormatRecord) record;
customFormatRecords.put(new Integer(fr.getIndexCode()), fr);
break;
case ExtendedFormatRecord.sid:
ExtendedFormatRecord xr = (ExtendedFormatRecord) record;
xfRecords.add(xr);
break;
case BlankRecord.sid: case BlankRecord.sid:
BlankRecord brec = (BlankRecord) record; BlankRecord brec = (BlankRecord) record;
@ -119,7 +153,13 @@ public class XLS2CSVmra implements HSSFListener {
thisRow = frec.getRow(); thisRow = frec.getRow();
thisColumn = frec.getColumn(); thisColumn = frec.getColumn();
if(outputFormulaValues) {
thisStr = formatNumberDateCell(frec, frec.getValue());
} else {
// TODO: Output the formula string
thisStr = '"' + frec.toString() + '"'; thisStr = '"' + frec.toString() + '"';
}
break; break;
case LabelRecord.sid: case LabelRecord.sid:
LabelRecord lrec = (LabelRecord) record; LabelRecord lrec = (LabelRecord) record;
@ -133,13 +173,18 @@ public class XLS2CSVmra implements HSSFListener {
thisRow = lsrec.getRow(); thisRow = lsrec.getRow();
thisColumn = lsrec.getColumn(); thisColumn = lsrec.getColumn();
thisStr = '"' + "(TODO)" + '"'; if(sstRecord == null) {
thisStr = '"' + "(No SST Record, can't identify string)" + '"';
} else {
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()
thisStr = '"' + "(TODO)" + '"'; thisStr = '"' + "(TODO)" + '"';
break; break;
case NumberRecord.sid: case NumberRecord.sid:
@ -147,7 +192,9 @@ public class XLS2CSVmra implements HSSFListener {
thisRow = numrec.getRow(); thisRow = numrec.getRow();
thisColumn = numrec.getColumn(); thisColumn = numrec.getColumn();
thisStr = Double.toString(numrec.getValue()); // TODO: Formatting
// Format
thisStr = formatNumberDateCell(numrec, numrec.getValue());
break; break;
case RKRecord.sid: case RKRecord.sid:
RKRecord rkrec = (RKRecord) record; RKRecord rkrec = (RKRecord) record;
@ -160,6 +207,11 @@ public class XLS2CSVmra implements HSSFListener {
break; break;
} }
// Handle new row
if(thisRow != -1 && thisRow != lastRowNumber) {
lastColumnNumber = -1;
}
// Handle missing column // Handle missing column
if(record instanceof MissingCellDummyRecord) { if(record instanceof MissingCellDummyRecord) {
MissingCellDummyRecord mc = (MissingCellDummyRecord)record; MissingCellDummyRecord mc = (MissingCellDummyRecord)record;
@ -186,16 +238,67 @@ public class XLS2CSVmra implements HSSFListener {
if(record instanceof LastCellOfRowDummyRecord) { if(record instanceof LastCellOfRowDummyRecord) {
// Print out any missing commas if needed // Print out any missing commas if needed
if(minColumns > 0) { if(minColumns > 0) {
for(int i=lastColumnNumber; i<(minColumns-1); i++) { // Columns are 0 based
if(lastColumnNumber == -1) { lastColumnNumber = 0; }
for(int i=lastColumnNumber; i<(minColumns); i++) {
output.print(','); output.print(',');
} }
} }
// We're onto a new row
lastColumnNumber = -1;
// End the row // End the row
output.println(); output.println();
} }
} }
/**
* Formats a number or date cell, be that a real number, or the
* answer to a formula
*/
private String formatNumberDateCell(CellValueRecordInterface cell, double value) {
// Get the built in format, if there is one
ExtendedFormatRecord xfr = (ExtendedFormatRecord)
xfRecords.get(cell.getXFIndex());
if(xfr == null) {
System.err.println("Cell " + cell.getRow() + "," + cell.getColumn() + " uses XF with index " + cell.getXFIndex() + ", but we don't have that");
return Double.toString(value);
} else {
int formatIndex = xfr.getFormatIndex();
String format;
if(formatIndex >= HSSFDataFormat.getNumberOfBuiltinBuiltinFormats()) {
FormatRecord tfr = (FormatRecord)customFormatRecords.get(new Integer(formatIndex));
format = tfr.getFormatString();
} else {
format = HSSFDataFormat.getBuiltinFormat(xfr.getFormatIndex());
}
// Is it a date?
if(HSSFDateUtil.isADateFormat(formatIndex,format) &&
HSSFDateUtil.isValidExcelDate(value)) {
// Java wants M not m for month
format = format.replace('m','M');
// Change \- into -, if it's there
format = format.replace("\\-","-");
// Format as a date
Date d = HSSFDateUtil.getJavaDate(value);
DateFormat df = new SimpleDateFormat(format);
return df.format(d);
} else {
if(format == "General") {
// Some sort of wierd default
return Double.toString(value);
}
// Format as a number
DecimalFormat df = new DecimalFormat(format);
return df.format(value);
}
}
}
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
if(args.length < 1) { if(args.length < 1) {

View File

@ -84,7 +84,7 @@ public class MissingRecordAwareHSSFListener implements HSSFListener {
break; break;
case BoundSheetRecord.sid: case BoundSheetRecord.sid:
BoundSheetRecord bsr = (BoundSheetRecord) record; BoundSheetRecord bsr = (BoundSheetRecord) record;
System.out.println("New sheet named: " + bsr.getSheetname()); //System.out.println("New sheet named: " + bsr.getSheetname());
break; break;
case RowRecord.sid: case RowRecord.sid:
RowRecord rowrec = (RowRecord) record; RowRecord rowrec = (RowRecord) record;