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.usermodel.*;
67   
68   /**
69    * Event Factory version of HSSF test class.
70    * @author  andy
71    */
72   
73   public class EFHSSF
74   {
75       String       infile;
76       String       outfile;
77       HSSFWorkbook workbook = null;
78       HSSFSheet    cursheet = null;
79   
80       /** Creates a new instance of EFHSSF */
81   
82       public EFHSSF()
83       {
84       }
85   
86       public void setInputFile(String infile)
87       {
88           this.infile = infile;
89       }
90   
91       public void setOutputFile(String outfile)
92       {
93           this.outfile = outfile;
94       }
95   
96       public void run()
97           throws IOException
98       {
99           FileInputStream fin   = new FileInputStream(infile);
100          POIFSFileSystem poifs = new POIFSFileSystem(fin);
101          InputStream     din   = poifs.createDocumentInputStream("Workbook");
102          HSSFRequest     req   = new HSSFRequest();
103  
104          req.addListenerForAllRecords(new EFHSSFListener(this));
105          HSSFEventFactory factory = new HSSFEventFactory();
106  
107          factory.processEvents(req, din);
108          fin.close();
109          din.close();
110          FileOutputStream fout = new FileOutputStream(outfile);
111  
112          workbook.write(fout);
113          fout.close();
114          System.out.println("done.");
115      }
116  
117      public void recordHandler(Record record)
118      {
119          HSSFRow  row      = null;
120          HSSFCell cell     = null;
121          int      sheetnum = -1;
122  
123          switch (record.getSid())
124          {
125  
126              case BOFRecord.sid :
127                  BOFRecord bof = ( BOFRecord ) record;
128  
129                  if (bof.getType() == bof.TYPE_WORKBOOK)
130                  {
131                      workbook = new HSSFWorkbook();
132                  }
133                  else if (bof.getType() == bof.TYPE_WORKSHEET)
134                  {
135                      sheetnum++;
136                      cursheet = workbook.getSheetAt(sheetnum);
137                  }
138                  break;
139  
140              case BoundSheetRecord.sid :
141                  BoundSheetRecord bsr = ( BoundSheetRecord ) record;
142  
143                  workbook.createSheet(bsr.getSheetname());
144                  break;
145  
146              case RowRecord.sid :
147                  RowRecord rowrec = ( RowRecord ) record;
148  
149                  cursheet.createRow(rowrec.getRowNumber());
150                  break;
151  
152              case NumberRecord.sid :
153                  NumberRecord numrec = ( NumberRecord ) record;
154  
155                  row  = cursheet.getRow(numrec.getRow());
156                  cell = row.createCell(numrec.getColumn(),
157                                        HSSFCell.CELL_TYPE_NUMERIC);
158                  cell.setCellValue(numrec.getValue());
159                  break;
160  
161              case SSTRecord.sid :
162                  SSTRecord sstrec = ( SSTRecord ) record;
163  
164                  for (int k = 0; k < sstrec.getNumUniqueStrings(); k++)
165                  {
166                      workbook.addSSTString(sstrec.getString(k));
167                  }
168                  break;
169  
170              case LabelSSTRecord.sid :
171                  LabelSSTRecord lrec = ( LabelSSTRecord ) record;
172  
173                  row  = cursheet.getRow(lrec.getRow());
174                  cell = row.createCell(lrec.getColumn(),
175                                        HSSFCell.CELL_TYPE_STRING);
176                  cell.setCellValue(workbook.getSSTString(lrec.getSSTIndex()));
177                  break;
178          }
179      }
180  
181      public static void main(String [] args)
182      {
183          if ((args.length < 2) || !args[ 0 ].equals("--help"))
184          {
185              try
186              {
187                  EFHSSF viewer = new EFHSSF();
188  
189                  viewer.setInputFile(args[ 0 ]);
190                  viewer.setOutputFile(args[ 1 ]);
191                  viewer.run();
192              }
193              catch (IOException e)
194              {
195                  e.printStackTrace();
196              }
197          }
198          else
199          {
200              System.out.println("EFHSSF");
201              System.out.println(
202                  "General testbed for HSSFEventFactory based testing and "
203                  + "Code examples");
204              System.out.println("Usage: java org.apache.poi.hssf.dev.EFHSSF "
205                                 + "file1 file2");
206              System.out.println(
207                  "   --will rewrite the file reading with the event api");
208              System.out.println("and writing with the standard API");
209          }
210      }
211  }
212  
213  class EFHSSFListener
214      implements HSSFListener
215  {
216      EFHSSF efhssf;
217  
218      public EFHSSFListener(EFHSSF efhssf)
219      {
220          this.efhssf = efhssf;
221      }
222  
223      public void processRecord(Record record)
224      {
225          efhssf.recordHandler(record);
226      }
227  }
228