Parcourir la source

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
tags/REL_3_0_1_RC3
Nick Burch il y a 17 ans
Parent
révision
6d283656c9

+ 107
- 4
src/scratchpad/examples/src/org/apache/poi/hssf/eventusermodel/examples/XLS2CSVmra.java Voir le fichier

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;
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;
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;


/** /**
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
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;
thisRow = frec.getRow(); thisRow = frec.getRow();
thisColumn = frec.getColumn(); thisColumn = frec.getColumn();
thisStr = '"' + frec.toString() + '"';
if(outputFormulaValues) {
thisStr = formatNumberDateCell(frec, frec.getValue());
} else {
// TODO: Output the formula string
thisStr = '"' + frec.toString() + '"';
}
break; break;
case LabelRecord.sid: case LabelRecord.sid:
LabelRecord lrec = (LabelRecord) record; LabelRecord lrec = (LabelRecord) record;
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:
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;
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;
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 {

+ 1
- 1
src/scratchpad/src/org/apache/poi/hssf/eventusermodel/MissingRecordAwareHSSFListener.java Voir le fichier

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;

Chargement…
Annuler
Enregistrer