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:
parent
565528df7d
commit
c22c2e813c
@ -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) {
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user