mirror of https://github.com/apache/poi.git
Make a start on some example code to use MissingRecordAwareHSSFListener for turning a xls into a csv
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@548030 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
fe87196450
commit
bdc0883b6f
|
@ -0,0 +1,215 @@
|
|||
/* ====================================================================
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
==================================================================== */
|
||||
package org.apache.poi.hssf.eventusermodel.examples;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintStream;
|
||||
|
||||
import org.apache.poi.hssf.eventusermodel.HSSFEventFactory;
|
||||
import org.apache.poi.hssf.eventusermodel.HSSFListener;
|
||||
import org.apache.poi.hssf.eventusermodel.HSSFRequest;
|
||||
import org.apache.poi.hssf.eventusermodel.MissingRecordAwareHSSFListener;
|
||||
import org.apache.poi.hssf.eventusermodel.dummyrecord.LastCellOfRowDummyRecord;
|
||||
import org.apache.poi.hssf.eventusermodel.dummyrecord.MissingCellDummyRecord;
|
||||
import org.apache.poi.hssf.record.BlankRecord;
|
||||
import org.apache.poi.hssf.record.BoolErrRecord;
|
||||
import org.apache.poi.hssf.record.FormulaRecord;
|
||||
import org.apache.poi.hssf.record.LabelRecord;
|
||||
import org.apache.poi.hssf.record.LabelSSTRecord;
|
||||
import org.apache.poi.hssf.record.NoteRecord;
|
||||
import org.apache.poi.hssf.record.NumberRecord;
|
||||
import org.apache.poi.hssf.record.RKRecord;
|
||||
import org.apache.poi.hssf.record.Record;
|
||||
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||
|
||||
/**
|
||||
* A XLS -> CSV processor, that uses the MissingRecordAware
|
||||
* EventModel code to ensure it outputs all columns and rows.
|
||||
* @author Nick Burch
|
||||
*/
|
||||
public class XLS2CSVmra implements HSSFListener {
|
||||
private int minColumns;
|
||||
private POIFSFileSystem fs;
|
||||
private PrintStream output;
|
||||
|
||||
private int lastRowNumber;
|
||||
private int lastColumnNumber;
|
||||
|
||||
/**
|
||||
* Creates a new XLS -> CSV converter
|
||||
* @param fs The POIFSFileSystem to process
|
||||
* @param output The PrintStream to output the CSV to
|
||||
* @param minColumns The minimum number of columns to output, or -1 for no minimum
|
||||
*/
|
||||
public XLS2CSVmra(POIFSFileSystem fs, PrintStream output, int minColumns) {
|
||||
this.fs = fs;
|
||||
this.output = output;
|
||||
this.minColumns = minColumns;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new XLS -> CSV converter
|
||||
* @param filename The file to process
|
||||
* @param minColumns The minimum number of columns to output, or -1 for no minimum
|
||||
* @throws IOException
|
||||
* @throws FileNotFoundException
|
||||
*/
|
||||
public XLS2CSVmra(String filename, int minColumns) throws IOException, FileNotFoundException {
|
||||
this(
|
||||
new POIFSFileSystem(new FileInputStream(filename)),
|
||||
System.out, minColumns
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initiates the processing of the XLS file to CSV
|
||||
*/
|
||||
public void process() throws IOException {
|
||||
MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(this);
|
||||
HSSFEventFactory factory = new HSSFEventFactory();
|
||||
HSSFRequest request = new HSSFRequest();
|
||||
request.addListenerForAllRecords(listener);
|
||||
|
||||
factory.processWorkbookEvents(request, fs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Main HSSFListener method, processes events, and outputs the
|
||||
* CSV as the file is processed.
|
||||
*/
|
||||
public void processRecord(Record record) {
|
||||
int thisRow = -1;
|
||||
int thisColumn = -1;
|
||||
String thisStr = null;
|
||||
|
||||
switch (record.getSid())
|
||||
{
|
||||
case BlankRecord.sid:
|
||||
BlankRecord brec = (BlankRecord) record;
|
||||
|
||||
thisRow = brec.getRow();
|
||||
thisColumn = brec.getColumn();
|
||||
thisStr = "";
|
||||
break;
|
||||
case BoolErrRecord.sid:
|
||||
BoolErrRecord berec = (BoolErrRecord) record;
|
||||
|
||||
thisRow = berec.getRow();
|
||||
thisColumn = berec.getColumn();
|
||||
thisStr = "";
|
||||
break;
|
||||
case FormulaRecord.sid:
|
||||
FormulaRecord frec = (FormulaRecord) record;
|
||||
|
||||
thisRow = frec.getRow();
|
||||
thisColumn = frec.getColumn();
|
||||
thisStr = '"' + frec.toString() + '"';
|
||||
break;
|
||||
case LabelRecord.sid:
|
||||
LabelRecord lrec = (LabelRecord) record;
|
||||
|
||||
thisRow = lrec.getRow();
|
||||
thisColumn = lrec.getColumn();
|
||||
thisStr = '"' + lrec.getValue() + '"';
|
||||
break;
|
||||
case LabelSSTRecord.sid:
|
||||
LabelSSTRecord lsrec = (LabelSSTRecord) record;
|
||||
|
||||
thisRow = lsrec.getRow();
|
||||
thisColumn = lsrec.getColumn();
|
||||
thisStr = '"' + "(TODO)" + '"';
|
||||
break;
|
||||
case NoteRecord.sid:
|
||||
NoteRecord nrec = (NoteRecord) record;
|
||||
|
||||
thisRow = nrec.getRow();
|
||||
thisColumn = nrec.getColumn();
|
||||
thisStr = '"' + "(TODO)" + '"';
|
||||
break;
|
||||
case NumberRecord.sid:
|
||||
NumberRecord numrec = (NumberRecord) record;
|
||||
|
||||
thisRow = numrec.getRow();
|
||||
thisColumn = numrec.getColumn();
|
||||
thisStr = Double.toString(numrec.getValue()); // TODO: Formatting
|
||||
break;
|
||||
case RKRecord.sid:
|
||||
RKRecord rkrec = (RKRecord) record;
|
||||
|
||||
thisRow = rkrec.getRow();
|
||||
thisColumn = rkrec.getColumn();
|
||||
thisStr = '"' + "(TODO)" + '"';
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// Handle missing column
|
||||
if(record instanceof MissingCellDummyRecord) {
|
||||
MissingCellDummyRecord mc = (MissingCellDummyRecord)record;
|
||||
thisRow = mc.getRow();
|
||||
thisColumn = mc.getColumn();
|
||||
thisStr = "";
|
||||
}
|
||||
|
||||
// If we got something to print out, do so
|
||||
if(thisStr != null) {
|
||||
if(thisColumn > 0) {
|
||||
output.print(',');
|
||||
}
|
||||
output.print(thisStr);
|
||||
}
|
||||
|
||||
// Update column and row count
|
||||
if(thisRow > -1)
|
||||
lastRowNumber = thisRow;
|
||||
if(thisColumn > -1)
|
||||
lastColumnNumber = thisColumn;
|
||||
|
||||
// Handle end of row
|
||||
if(record instanceof LastCellOfRowDummyRecord) {
|
||||
// Print out any missing commas if needed
|
||||
if(minColumns > 0) {
|
||||
for(int i=lastColumnNumber; i<(minColumns-1); i++) {
|
||||
output.print(',');
|
||||
}
|
||||
}
|
||||
|
||||
// End the row
|
||||
output.println();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
if(args.length < 1) {
|
||||
System.err.println("Use:");
|
||||
System.err.println(" XLS2CSVmra <xls file> [min columns]");
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
int minColumns = -1;
|
||||
if(args.length >= 2) {
|
||||
minColumns = Integer.parseInt(args[1]);
|
||||
}
|
||||
|
||||
XLS2CSVmra xls2csv = new XLS2CSVmra(args[0], minColumns);
|
||||
xls2csv.process();
|
||||
}
|
||||
}
|
|
@ -110,14 +110,17 @@ public class MissingRecordAwareHSSFListener implements HSSFListener {
|
|||
BlankRecord brec = (BlankRecord) record;
|
||||
thisRow = brec.getRow();
|
||||
thisColumn = brec.getColumn();
|
||||
break;
|
||||
case BoolErrRecord.sid:
|
||||
BoolErrRecord berec = (BoolErrRecord) record;
|
||||
thisRow = berec.getRow();
|
||||
thisColumn = berec.getColumn();
|
||||
break;
|
||||
case FormulaRecord.sid:
|
||||
FormulaRecord frec = (FormulaRecord) record;
|
||||
thisRow = frec.getRow();
|
||||
thisColumn = frec.getColumn();
|
||||
break;
|
||||
case LabelRecord.sid:
|
||||
LabelRecord lrec = (LabelRecord) record;
|
||||
thisRow = lrec.getRow();
|
||||
|
@ -136,6 +139,7 @@ public class MissingRecordAwareHSSFListener implements HSSFListener {
|
|||
NoteRecord nrec = (NoteRecord) record;
|
||||
thisRow = nrec.getRow();
|
||||
thisColumn = nrec.getColumn();
|
||||
break;
|
||||
case NumberRecord.sid:
|
||||
NumberRecord numrec = (NumberRecord) record;
|
||||
thisRow = numrec.getRow();
|
||||
|
@ -147,11 +151,11 @@ public class MissingRecordAwareHSSFListener implements HSSFListener {
|
|||
RKRecord rkrec = (RKRecord) record;
|
||||
thisRow = rkrec.getRow();
|
||||
thisColumn = rkrec.getColumn();
|
||||
break;
|
||||
default:
|
||||
//System.out.println(record.getClass());
|
||||
break;
|
||||
}
|
||||
System.out.println(record.getClass());
|
||||
|
||||
// Do we need to fire dummy end-of-row records?
|
||||
if(thisRow != lastSeenRow) {
|
||||
|
|
Loading…
Reference in New Issue