1    
2    /* ====================================================================
3     * The Apache Software License, Version 1.1
4     *
5     * Copyright (c) 2002 The Apache Software Foundation.  All rights
6     * reserved.
7     *
8     * Redistribution and use in source and binary forms, with or without
9     * modification, are permitted provided that the following conditions
10    * are met:
11    *
12    * 1. Redistributions of source code must retain the above copyright
13    *    notice, this list of conditions and the following disclaimer.
14    *
15    * 2. Redistributions in binary form must reproduce the above copyright
16    *    notice, this list of conditions and the following disclaimer in
17    *    the documentation and/or other materials provided with the
18    *    distribution.
19    *
20    * 3. The end-user documentation included with the redistribution,
21    *    if any, must include the following acknowledgment:
22    *       "This product includes software developed by the
23    *        Apache Software Foundation (http://www.apache.org/)."
24    *    Alternately, this acknowledgment may appear in the software itself,
25    *    if and wherever such third-party acknowledgments normally appear.
26    *
27    * 4. The names "Apache" and "Apache Software Foundation" and
28    *    "Apache POI" must not be used to endorse or promote products
29    *    derived from this software without prior written permission. For
30    *    written permission, please contact apache@apache.org.
31    *
32    * 5. Products derived from this software may not be called "Apache",
33    *    "Apache POI", nor may "Apache" appear in their name, without
34    *    prior written permission of the Apache Software Foundation.
35    *
36    * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
37    * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38    * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
39    * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
40    * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41    * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42    * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
43    * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
44    * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
45    * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
46    * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47    * SUCH DAMAGE.
48    * ====================================================================
49    *
50    * This software consists of voluntary contributions made by many
51    * individuals on behalf of the Apache Software Foundation.  For more
52    * information on the Apache Software Foundation, please see
53    * <http://www.apache.org/>.
54    */
55   
56   package org.apache.poi.hssf.dev;
57   
58   import java.io.FileInputStream;
59   import java.io.FileOutputStream;
60   import java.io.InputStream;
61   import java.io.IOException;
62   
63   import org.apache.poi.poifs.filesystem.POIFSFileSystem;
64   import org.apache.poi.hssf.record.*;
65   import org.apache.poi.hssf.eventmodel.*;
66   import org.apache.poi.hssf.eventusermodel.*;
67   import org.apache.poi.hssf.usermodel.*;
68   
69   /**
70    * Event Factory version of HSSF test class.
71    * @author  andy
72    */
73   
74   public class EFHSSF
75   {
76       String       infile;
77       String       outfile;
78       HSSFWorkbook workbook = null;
79       HSSFSheet    cursheet = null;
80   
81       /** Creates a new instance of EFHSSF */
82   
83       public EFHSSF()
84       {
85       }
86   
87       public void setInputFile(String infile)
88       {
89           this.infile = infile;
90       }
91   
92       public void setOutputFile(String outfile)
93       {
94           this.outfile = outfile;
95       }
96   
97       public void run()
98           throws IOException
99       {
100          FileInputStream fin   = new FileInputStream(infile);
101          POIFSFileSystem poifs = new POIFSFileSystem(fin);
102          InputStream     din   = poifs.createDocumentInputStream("Workbook");
103          HSSFRequest     req   = new HSSFRequest();
104  
105          req.addListenerForAllRecords(new EFHSSFListener(this));
106          HSSFEventFactory factory = new HSSFEventFactory();
107  
108          factory.processEvents(req, din);
109          fin.close();
110          din.close();
111          FileOutputStream fout = new FileOutputStream(outfile);
112  
113          workbook.write(fout);
114          fout.close();
115          System.out.println("done.");
116      }
117  
118      public void recordHandler(Record record)
119      {
120          HSSFRow  row      = null;
121          HSSFCell cell     = null;
122          int      sheetnum = -1;
123  
124          switch (record.getSid())
125          {
126  
127              case BOFRecord.sid :
128                  BOFRecord bof = ( BOFRecord ) record;
129  
130                  if (bof.getType() == bof.TYPE_WORKBOOK)
131                  {
132                      workbook = new HSSFWorkbook();
133                  }
134                  else if (bof.getType() == bof.TYPE_WORKSHEET)
135                  {
136                      sheetnum++;
137                      cursheet = workbook.getSheetAt(sheetnum);
138                  }
139                  break;
140  
141              case BoundSheetRecord.sid :
142                  BoundSheetRecord bsr = ( BoundSheetRecord ) record;
143  
144                  workbook.createSheet(bsr.getSheetname());
145                  break;
146  
147              case RowRecord.sid :
148                  RowRecord rowrec = ( RowRecord ) record;
149  
150                  cursheet.createRow(rowrec.getRowNumber());
151                  break;
152  
153              case NumberRecord.sid :
154                  NumberRecord numrec = ( NumberRecord ) record;
155  
156                  row  = cursheet.getRow(numrec.getRow());
157                  cell = row.createCell(numrec.getColumn(),
158                                        HSSFCell.CELL_TYPE_NUMERIC);
159                  cell.setCellValue(numrec.getValue());
160                  break;
161  
162              case SSTRecord.sid :
163                  SSTRecord sstrec = ( SSTRecord ) record;
164  
165                  for (int k = 0; k < sstrec.getNumUniqueStrings(); k++)
166                  {
167                      workbook.addSSTString(sstrec.getString(k));
168                  }
169                  break;
170  
171              case LabelSSTRecord.sid :
172                  LabelSSTRecord lrec = ( LabelSSTRecord ) record;
173  
174                  row  = cursheet.getRow(lrec.getRow());
175                  cell = row.createCell(lrec.getColumn(),
176                                        HSSFCell.CELL_TYPE_STRING);
177                  cell.setCellValue(workbook.getSSTString(lrec.getSSTIndex()));
178                  break;
179          }
180      }
181  
182      public static void main(String [] args)
183      {
184          if ((args.length < 2) || !args[ 0 ].equals("--help"))
185          {
186              try
187              {
188                  EFHSSF viewer = new EFHSSF();
189  
190                  viewer.setInputFile(args[ 0 ]);
191                  viewer.setOutputFile(args[ 1 ]);
192                  viewer.run();
193              }
194              catch (IOException e)
195              {
196                  e.printStackTrace();
197              }
198          }
199          else
200          {
201              System.out.println("EFHSSF");
202              System.out.println(
203                  "General testbed for HSSFEventFactory based testing and "
204                  + "Code examples");
205              System.out.println("Usage: java org.apache.poi.hssf.dev.EFHSSF "
206                                 + "file1 file2");
207              System.out.println(
208                  "   --will rewrite the file reading with the event api");
209              System.out.println("and writing with the standard API");
210          }
211      }
212  }
213  
214  class EFHSSFListener
215      implements HSSFListener
216  {
217      EFHSSF efhssf;
218  
219      public EFHSSFListener(EFHSSF efhssf)
220      {
221          this.efhssf = efhssf;
222      }
223  
224      public void processRecord(Record record)
225      {
226          efhssf.recordHandler(record);
227      }
228  }
229