]> source.dussan.org Git - poi.git/commitdiff
Make a start on some example code to use MissingRecordAwareHSSFListener for turning...
authorNick Burch <nick@apache.org>
Sun, 17 Jun 2007 10:59:48 +0000 (10:59 +0000)
committerNick Burch <nick@apache.org>
Sun, 17 Jun 2007 10:59:48 +0000 (10:59 +0000)
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@548030 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/examples/src/org/apache/poi/hssf/eventusermodel/examples/XLS2CSVmra.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hssf/eventusermodel/MissingRecordAwareHSSFListener.java

diff --git a/src/scratchpad/examples/src/org/apache/poi/hssf/eventusermodel/examples/XLS2CSVmra.java b/src/scratchpad/examples/src/org/apache/poi/hssf/eventusermodel/examples/XLS2CSVmra.java
new file mode 100644 (file)
index 0000000..b42632c
--- /dev/null
@@ -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();
+       }
+}
index 4acc392cc7b5d5f614cbab8d322eb510acd55fd6..7080bfa9afe16d60df17094252219539c52a1c84 100644 (file)
@@ -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) {