git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@805262 13f79535-47bb-0310-9956-ffa450edef68tags/REL_3_5-FINAL
@@ -1,195 +0,0 @@ | |||
/* ==================================================================== | |||
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.dev; | |||
import java.io.FileInputStream; | |||
import java.io.FileOutputStream; | |||
import java.io.InputStream; | |||
import java.io.IOException; | |||
import org.apache.poi.poifs.filesystem.POIFSFileSystem; | |||
import org.apache.poi.hssf.record.*; | |||
import org.apache.poi.hssf.eventmodel.*; | |||
import org.apache.poi.hssf.eventusermodel.*; | |||
import org.apache.poi.hssf.usermodel.*; | |||
import org.apache.poi.hssf.eventusermodel.HSSFRequest; | |||
import org.apache.poi.hssf.eventusermodel.HSSFListener; | |||
import org.apache.poi.hssf.eventusermodel.HSSFEventFactory; | |||
/** | |||
* Event Factory version of HSSF test class. | |||
* @author andy | |||
*/ | |||
//JMH | |||
//public class EFHSSF | |||
//{ | |||
// String infile; | |||
// String outfile; | |||
// HSSFWorkbook workbook = null; | |||
// HSSFSheet cursheet = null; | |||
// | |||
// /** Creates a new instance of EFHSSF */ | |||
// | |||
// public EFHSSF() | |||
// { | |||
// } | |||
// | |||
// public void setInputFile(String infile) | |||
// { | |||
// this.infile = infile; | |||
// } | |||
// | |||
// public void setOutputFile(String outfile) | |||
// { | |||
// this.outfile = outfile; | |||
// } | |||
// | |||
// public void run() | |||
// throws IOException | |||
// { | |||
// FileInputStream fin = new FileInputStream(infile); | |||
// POIFSFileSystem poifs = new POIFSFileSystem(fin); | |||
// InputStream din = poifs.createDocumentInputStream("Workbook"); | |||
// HSSFRequest req = new HSSFRequest(); | |||
// | |||
// req.addListenerForAllRecords(new EFHSSFListener(this)); | |||
// HSSFEventFactory factory = new HSSFEventFactory(); | |||
// | |||
// factory.processEvents(req, din); | |||
// fin.close(); | |||
// din.close(); | |||
// FileOutputStream fout = new FileOutputStream(outfile); | |||
// | |||
// workbook.write(fout); | |||
// fout.close(); | |||
// System.out.println("done."); | |||
// } | |||
// | |||
// public void recordHandler(Record record) | |||
// { | |||
// HSSFRow row = null; | |||
// HSSFCell cell = null; | |||
// int sheetnum = -1; | |||
// | |||
// switch (record.getSid()) | |||
// { | |||
// | |||
// case BOFRecord.sid : | |||
// BOFRecord bof = ( BOFRecord ) record; | |||
// | |||
// if (bof.getType() == bof.TYPE_WORKBOOK) | |||
// { | |||
// workbook = new HSSFWorkbook(); | |||
// } | |||
// else if (bof.getType() == bof.TYPE_WORKSHEET) | |||
// { | |||
// sheetnum++; | |||
// cursheet = workbook.getSheetAt(sheetnum); | |||
// } | |||
// break; | |||
// | |||
// case BoundSheetRecord.sid : | |||
// BoundSheetRecord bsr = ( BoundSheetRecord ) record; | |||
// | |||
// workbook.createSheet(bsr.getSheetname()); | |||
// break; | |||
// | |||
// case RowRecord.sid : | |||
// RowRecord rowrec = ( RowRecord ) record; | |||
// | |||
// cursheet.createRow(rowrec.getRowNumber()); | |||
// break; | |||
// | |||
// case NumberRecord.sid : | |||
// NumberRecord numrec = ( NumberRecord ) record; | |||
// | |||
// row = cursheet.getRow(numrec.getRow()); | |||
// cell = row.createCell(numrec.getColumn(), | |||
// HSSFCell.CELL_TYPE_NUMERIC); | |||
// cell.setCellValue(numrec.getValue()); | |||
// break; | |||
// | |||
// case SSTRecord.sid : | |||
// SSTRecord sstrec = ( SSTRecord ) record; | |||
// | |||
// for (int k = 0; k < sstrec.getNumUniqueStrings(); k++) | |||
// { | |||
// workbook.addSSTString(new UnicodeString(sstrec.getString(k))); | |||
// } | |||
// break; | |||
// | |||
// case LabelSSTRecord.sid : | |||
// LabelSSTRecord lrec = ( LabelSSTRecord ) record; | |||
// | |||
// row = cursheet.getRow(lrec.getRow()); | |||
// cell = row.createCell(lrec.getColumn(), | |||
// HSSFCell.CELL_TYPE_STRING); | |||
// cell.setCellValue(workbook.getSSTString(lrec.getSSTIndex())); | |||
// break; | |||
// } | |||
// } | |||
// | |||
// public static void main(String [] args) | |||
// { | |||
// if ((args.length < 2) || !args[ 0 ].equals("--help")) | |||
// { | |||
// try | |||
// { | |||
// EFHSSF viewer = new EFHSSF(); | |||
// | |||
// viewer.setInputFile(args[ 0 ]); | |||
// viewer.setOutputFile(args[ 1 ]); | |||
// viewer.run(); | |||
// } | |||
// catch (IOException e) | |||
// { | |||
// e.printStackTrace(); | |||
// } | |||
// } | |||
// else | |||
// { | |||
// System.out.println("EFHSSF"); | |||
// System.out.println( | |||
// "General testbed for HSSFEventFactory based testing and " | |||
// + "Code examples"); | |||
// System.out.println("Usage: java org.apache.poi.hssf.dev.EFHSSF " | |||
// + "file1 file2"); | |||
// System.out.println( | |||
// " --will rewrite the file reading with the event api"); | |||
// System.out.println("and writing with the standard API"); | |||
// } | |||
// } | |||
//} | |||
// | |||
//class EFHSSFListener | |||
// implements HSSFListener | |||
//{ | |||
// EFHSSF efhssf; | |||
// | |||
// public EFHSSFListener(EFHSSF efhssf) | |||
// { | |||
// this.efhssf = efhssf; | |||
// } | |||
// | |||
// public void processRecord(Record record) | |||
// { | |||
// efhssf.recordHandler(record); | |||
// } | |||
//} |
@@ -14,16 +14,23 @@ | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.hssf.model; | |||
import org.apache.poi.hssf.record.*; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import org.apache.poi.ddf.EscherOptRecord; | |||
import org.apache.poi.ddf.EscherProperties; | |||
import org.apache.poi.ddf.EscherProperty; | |||
import org.apache.poi.ddf.EscherSimpleProperty; | |||
import org.apache.poi.hssf.record.CommonObjectDataSubRecord; | |||
import org.apache.poi.hssf.record.NoteRecord; | |||
import org.apache.poi.hssf.record.NoteStructureSubRecord; | |||
import org.apache.poi.hssf.record.ObjRecord; | |||
import org.apache.poi.hssf.record.SubRecord; | |||
import org.apache.poi.hssf.usermodel.HSSFComment; | |||
import org.apache.poi.hssf.usermodel.HSSFShape; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.ddf.*; | |||
import java.util.List; | |||
import java.util.Iterator; | |||
/** | |||
* Represents a cell comment. | |||
@@ -32,9 +39,9 @@ import java.util.Iterator; | |||
* | |||
* @author Yegor Kozlov | |||
*/ | |||
public class CommentShape extends TextboxShape { | |||
public final class CommentShape extends TextboxShape { | |||
private NoteRecord note; | |||
private NoteRecord _note; | |||
/** | |||
* Creates the low-level records for a comment. | |||
@@ -46,10 +53,10 @@ public class CommentShape extends TextboxShape { | |||
{ | |||
super(hssfShape, shapeId); | |||
note = createNoteRecord(hssfShape, shapeId); | |||
_note = createNoteRecord(hssfShape, shapeId); | |||
ObjRecord obj = getObjRecord(); | |||
List records = obj.getSubRecords(); | |||
List<SubRecord> records = obj.getSubRecords(); | |||
int cmoIdx = 0; | |||
for (int i = 0; i < records.size(); i++) { | |||
Object r = records.get(i); | |||
@@ -96,9 +103,9 @@ public class CommentShape extends TextboxShape { | |||
super.addStandardOptions(shape, opt); | |||
//remove unnecessary properties inherited from TextboxShape | |||
java.util.List props = opt.getEscherProperties(); | |||
for ( Iterator iterator = props.iterator(); iterator.hasNext(); ) { | |||
EscherProperty prop = (EscherProperty) iterator.next(); | |||
List<EscherProperty> props = opt.getEscherProperties(); | |||
for (Iterator<EscherProperty> iterator = props.iterator(); iterator.hasNext(); ) { | |||
EscherProperty prop = iterator.next(); | |||
switch (prop.getId()){ | |||
case EscherProperties.TEXT__TEXTLEFT: | |||
case EscherProperties.TEXT__TEXTRIGHT: | |||
@@ -127,7 +134,6 @@ public class CommentShape extends TextboxShape { | |||
*/ | |||
public NoteRecord getNoteRecord() | |||
{ | |||
return note; | |||
return _note; | |||
} | |||
} |
@@ -72,7 +72,6 @@ import org.apache.poi.hssf.record.StyleRecord; | |||
import org.apache.poi.hssf.record.SupBookRecord; | |||
import org.apache.poi.hssf.record.TabIdRecord; | |||
import org.apache.poi.hssf.record.UnicodeString; | |||
import org.apache.poi.hssf.record.UnknownRecord; | |||
import org.apache.poi.hssf.record.UseSelFSRecord; | |||
import org.apache.poi.hssf.record.WindowOneRecord; | |||
import org.apache.poi.hssf.record.WindowProtectRecord; | |||
@@ -271,19 +270,19 @@ public final class Workbook implements Model { | |||
case WindowOneRecord.sid: | |||
if (log.check( POILogger.DEBUG )) | |||
log.log(DEBUG, "found WindowOneRecord at " + k); | |||
retval.windowOne = (WindowOneRecord) rec; | |||
retval.windowOne = (WindowOneRecord) rec; | |||
break; | |||
case WriteAccessRecord.sid: | |||
case WriteAccessRecord.sid: | |||
if (log.check( POILogger.DEBUG )) | |||
log.log(DEBUG, "found WriteAccess at " + k); | |||
retval.writeAccess = (WriteAccessRecord) rec; | |||
break; | |||
case WriteProtectRecord.sid: | |||
case WriteProtectRecord.sid: | |||
if (log.check( POILogger.DEBUG )) | |||
log.log(DEBUG, "found WriteProtect at " + k); | |||
retval.writeProtect = (WriteProtectRecord) rec; | |||
break; | |||
case FileSharingRecord.sid: | |||
case FileSharingRecord.sid: | |||
if (log.check( POILogger.DEBUG )) | |||
log.log(DEBUG, "found FileSharing at " + k); | |||
retval.fileShare = (FileSharingRecord) rec; | |||
@@ -296,7 +295,7 @@ public final class Workbook implements Model { | |||
// retval.records.supbookpos = retval.records.bspos + 1; | |||
// retval.records.namepos = retval.records.supbookpos + 1; | |||
// } | |||
// Look for other interesting values that | |||
// follow the EOFRecord | |||
for ( ; k < recs.size(); k++) { | |||
@@ -307,7 +306,7 @@ public final class Workbook implements Model { | |||
break; | |||
} | |||
} | |||
if (retval.windowOne == null) { | |||
retval.windowOne = createWindowOne(); | |||
} | |||
@@ -388,7 +387,7 @@ public final class Workbook implements Model { | |||
retval.records.setBspos(records.size() - 1); | |||
} | |||
records.add( retval.createCountry() ); | |||
for ( int k = 0; k < nBoundSheets; k++ ) { | |||
for ( int k = 0; k < nBoundSheets; k++ ) { | |||
retval.getOrCreateLinkTable().checkExternSheet(k); | |||
} | |||
retval.sst = new SSTRecord(); | |||
@@ -452,7 +451,7 @@ public final class Workbook implements Model { | |||
return retval; | |||
} | |||
/** | |||
* Retrieves the index of the given font | |||
*/ | |||
@@ -468,7 +467,7 @@ public final class Workbook implements Model { | |||
return i; | |||
} | |||
} | |||
throw new IllegalArgumentException("Could not find that font!"); | |||
throw new IllegalArgumentException("Could not find that font!"); | |||
} | |||
/** | |||
@@ -487,10 +486,10 @@ public final class Workbook implements Model { | |||
numfonts++; | |||
return rec; | |||
} | |||
/** | |||
* Removes the given font record from the | |||
* file's list. This will make all | |||
* file's list. This will make all | |||
* subsequent font indicies drop by one, | |||
* so you'll need to update those yourself! | |||
*/ | |||
@@ -553,7 +552,7 @@ public final class Workbook implements Model { | |||
} | |||
/** | |||
* Determines whether a workbook contains the provided sheet name. For the purpose of | |||
* Determines whether a workbook contains the provided sheet name. For the purpose of | |||
* comparison, long names are truncated to 31 chars. | |||
* | |||
* @param name the name to test (case insensitive match) | |||
@@ -580,18 +579,18 @@ public final class Workbook implements Model { | |||
} | |||
return false; | |||
} | |||
/** | |||
* sets the order of appearance for a given sheet. | |||
* | |||
* @param sheetname the name of the sheet to reorder | |||
* @param pos the position that we want to insert the sheet into (0 based) | |||
*/ | |||
public void setSheetOrder(String sheetname, int pos ) { | |||
int sheetNumber = getSheetIndex(sheetname); | |||
//remove the sheet that needs to be reordered and place it in the spot we want | |||
boundsheets.add(pos, boundsheets.remove(sheetNumber)); | |||
boundsheets.add(pos, boundsheets.remove(sheetNumber)); | |||
} | |||
/** | |||
@@ -606,7 +605,7 @@ public final class Workbook implements Model { | |||
/** | |||
* Gets the hidden flag for a given sheet. | |||
* Note that a sheet could instead be | |||
* Note that a sheet could instead be | |||
* set to be very hidden, which is different | |||
* ({@link #isSheetVeryHidden(int)}) | |||
* | |||
@@ -619,8 +618,8 @@ public final class Workbook implements Model { | |||
/** | |||
* Gets the very hidden flag for a given sheet. | |||
* This is different from the normal | |||
* hidden flag | |||
* This is different from the normal | |||
* hidden flag | |||
* ({@link #isSheetHidden(int)}) | |||
* | |||
* @param sheetnum the sheet number (0 based) | |||
@@ -632,20 +631,20 @@ public final class Workbook implements Model { | |||
/** | |||
* Hide or unhide a sheet | |||
* | |||
* | |||
* @param sheetnum The sheet number | |||
* @param hidden True to mark the sheet as hidden, false otherwise | |||
*/ | |||
public void setSheetHidden(int sheetnum, boolean hidden) { | |||
getBoundSheetRec(sheetnum).setHidden(hidden); | |||
} | |||
/** | |||
* Hide or unhide a sheet. | |||
* 0 = not hidden | |||
* 1 = hidden | |||
* 2 = very hidden. | |||
* | |||
* | |||
* @param sheetnum The sheet number | |||
* @param hidden 0 for not hidden, 1 for hidden, 2 for very hidden | |||
*/ | |||
@@ -664,8 +663,8 @@ public final class Workbook implements Model { | |||
bsr.setHidden(h); | |||
bsr.setVeryHidden(vh); | |||
} | |||
/** | |||
* get the sheet's index | |||
* @param name sheet name | |||
@@ -713,18 +712,18 @@ public final class Workbook implements Model { | |||
boundsheets.remove(sheetIndex); | |||
fixTabIdRecord(); | |||
} | |||
// Within NameRecords, it's ok to have the formula | |||
// part point at deleted sheets. It's also ok to | |||
// have the ExternSheetNumber point at deleted | |||
// sheets. | |||
// sheets. | |||
// However, the sheet index must be adjusted, or | |||
// excel will break. (Sheet index is either 0 for | |||
// global, or 1 based index to sheet) | |||
int sheetNum1Based = sheetIndex + 1; | |||
for(int i=0; i<getNumNames(); i++) { | |||
NameRecord nr = getNameRecord(i); | |||
if(nr.getSheetNumber() == sheetNum1Based) { | |||
// Excel re-writes these to point to no sheet | |||
nr.setSheetNumber(0); | |||
@@ -790,10 +789,10 @@ public final class Workbook implements Model { | |||
return retval; | |||
} | |||
/** | |||
* Removes the given ExtendedFormatRecord record from the | |||
* file's list. This will make all | |||
* file's list. This will make all | |||
* subsequent font indicies drop by one, | |||
* so you'll need to update those yourself! | |||
*/ | |||
@@ -818,14 +817,14 @@ public final class Workbook implements Model { | |||
numxfs++; | |||
return xf; | |||
} | |||
/** | |||
* Returns the StyleRecord for the given | |||
* xfIndex, or null if that ExtendedFormat doesn't | |||
* have a Style set. | |||
*/ | |||
public StyleRecord getStyleRecord(int xfIndex) { | |||
// Style records always follow after | |||
// Style records always follow after | |||
// the ExtendedFormat records | |||
for(int i=records.getXfpos(); i<records.size(); i++) { | |||
Record r = records.get(i); | |||
@@ -848,11 +847,11 @@ public final class Workbook implements Model { | |||
* records collection | |||
*/ | |||
public StyleRecord createStyleRecord(int xfIndex) { | |||
// Style records always follow after | |||
// Style records always follow after | |||
// the ExtendedFormat records | |||
StyleRecord newSR = new StyleRecord(); | |||
newSR.setXFIndex(xfIndex); | |||
// Find the spot | |||
int addAt = -1; | |||
for(int i=records.getXfpos(); i<records.size() && | |||
@@ -869,7 +868,7 @@ public final class Workbook implements Model { | |||
throw new IllegalStateException("No XF Records found!"); | |||
} | |||
records.add(addAt, newSR); | |||
return newSR; | |||
} | |||
@@ -976,7 +975,7 @@ public final class Workbook implements Model { | |||
// Let's skip RECALCID records, as they are only use for optimization | |||
if ( record.getSid() != RecalcIdRecord.sid || ( (RecalcIdRecord) record ).isNeeded() ) | |||
{ | |||
int len = 0; | |||
int len = 0; | |||
if (record instanceof SSTRecord) | |||
{ | |||
sst = (SSTRecord)record; | |||
@@ -1090,7 +1089,7 @@ public final class Workbook implements Model { | |||
} | |||
/** | |||
* creates the TabId record containing an array | |||
* creates the TabId record containing an array | |||
*/ | |||
private static TabIdRecord createTabId() { | |||
return new TabIdRecord(); | |||
@@ -1121,7 +1120,7 @@ public final class Workbook implements Model { | |||
private static ProtectRecord createProtect() { | |||
// by default even when we support it we won't | |||
// want it to be protected | |||
return new ProtectRecord(false); | |||
return new ProtectRecord(false); | |||
} | |||
/** | |||
@@ -1251,7 +1250,7 @@ public final class Workbook implements Model { | |||
* @param id the number of the format record to create (meaning its position in | |||
* a file as M$ Excel would create it.) | |||
*/ | |||
private static FormatRecord createFormat(int id) { | |||
private static FormatRecord createFormat(int id) { | |||
// we'll need multiple editions for | |||
// the different formats | |||
@@ -1674,7 +1673,7 @@ public final class Workbook implements Model { | |||
private static PaletteRecord createPalette() { | |||
return new PaletteRecord(); | |||
} | |||
/** | |||
* @return a new UseSelFS object with the use natural language flag set to 0 (false) | |||
*/ | |||
@@ -1724,7 +1723,7 @@ public final class Workbook implements Model { | |||
retval.setNumStringsPerBucket(( short ) 0x8); | |||
return retval; | |||
} | |||
/** | |||
* lazy initialization | |||
* Note - creating the link table causes creation of 1 EXTERNALBOOK and 1 EXTERNALSHEET record | |||
@@ -1784,7 +1783,7 @@ public final class Workbook implements Model { | |||
public int getExternalSheetIndex(String workbookName, String sheetName) { | |||
return getOrCreateLinkTable().getExternalSheetIndex(workbookName, sheetName); | |||
} | |||
/** gets the total number of names | |||
* @return number of names | |||
@@ -1817,7 +1816,7 @@ public final class Workbook implements Model { | |||
*/ | |||
public NameRecord addName(NameRecord name) | |||
{ | |||
LinkTable linkTable = getOrCreateLinkTable(); | |||
if(linkTable.nameAlreadyExists(name)) { | |||
throw new IllegalArgumentException( | |||
@@ -1828,7 +1827,7 @@ public final class Workbook implements Model { | |||
return name; | |||
} | |||
/** | |||
* Generates a NameRecord to represent a built-in region | |||
* @return a new NameRecord | |||
@@ -1837,11 +1836,11 @@ public final class Workbook implements Model { | |||
if (sheetNumber < 0 || sheetNumber+1 > Short.MAX_VALUE) { | |||
throw new IllegalArgumentException("Sheet number ["+sheetNumber+"]is not valid "); | |||
} | |||
NameRecord name = new NameRecord(builtInName, sheetNumber); | |||
while(linkTable.nameAlreadyExists(name)) { | |||
throw new RuntimeException("Builtin (" + builtInName | |||
throw new RuntimeException("Builtin (" + builtInName | |||
+ ") already exists for sheet (" + sheetNumber + ")"); | |||
} | |||
addName(name); | |||
@@ -1853,7 +1852,7 @@ public final class Workbook implements Model { | |||
* @param nameIndex name index | |||
*/ | |||
public void removeName(int nameIndex){ | |||
if (linkTable.getNumNames() > nameIndex) { | |||
int idx = findFirstRecordLocBySid(NameRecord.sid); | |||
records.remove(idx + nameIndex); | |||
@@ -1912,7 +1911,7 @@ public final class Workbook implements Model { | |||
return maxformatid; | |||
} | |||
/** | |||
* Returns the first occurance of a record matching a particular sid. | |||
@@ -1920,7 +1919,7 @@ public final class Workbook implements Model { | |||
public Record findFirstRecordBySid(short sid) { | |||
for (Iterator iterator = records.iterator(); iterator.hasNext(); ) { | |||
Record record = ( Record ) iterator.next(); | |||
if (record.getSid() == sid) { | |||
return record; | |||
} | |||
@@ -1966,7 +1965,7 @@ public final class Workbook implements Model { | |||
{ | |||
return hyperlinks; | |||
} | |||
public List<Record> getRecords() { | |||
return records.getRecords(); | |||
} | |||
@@ -1980,7 +1979,7 @@ public final class Workbook implements Model { | |||
public boolean isUsing1904DateWindowing() { | |||
return uses1904datewindowing; | |||
} | |||
/** | |||
* Returns the custom palette in use for this workbook; if a custom palette record | |||
* does not exist, then it is created. | |||
@@ -2004,7 +2003,7 @@ public final class Workbook implements Model { | |||
} | |||
return palette; | |||
} | |||
/** | |||
* Finds the primary drawing group, if one already exists | |||
*/ | |||
@@ -2060,7 +2059,7 @@ public final class Workbook implements Model { | |||
} | |||
/** | |||
* Creates a primary drawing group record. If it already | |||
* Creates a primary drawing group record. If it already | |||
* exists then it's modified. | |||
*/ | |||
public void createDrawingGroup() { | |||
@@ -2124,7 +2123,7 @@ public final class Workbook implements Model { | |||
} | |||
} | |||
public WindowOneRecord getWindowOne() { | |||
return windowOne; | |||
} | |||
@@ -2172,8 +2171,8 @@ public final class Workbook implements Model { | |||
if (writeProtect == null) { | |||
writeProtect = new WriteProtectRecord(); | |||
int i = 0; | |||
for (i = 0; | |||
i < records.size() && !(records.get(i) instanceof BOFRecord); | |||
for (i = 0; | |||
i < records.size() && !(records.get(i) instanceof BOFRecord); | |||
i++) { | |||
} | |||
records.add(i+1, writeProtect); | |||
@@ -2185,8 +2184,8 @@ public final class Workbook implements Model { | |||
if (writeAccess == null) { | |||
writeAccess = createWriteAccess(); | |||
int i = 0; | |||
for (i = 0; | |||
i < records.size() && !(records.get(i) instanceof InterfaceEndRecord); | |||
for (i = 0; | |||
i < records.size() && !(records.get(i) instanceof InterfaceEndRecord); | |||
i++) { | |||
} | |||
records.add(i+1, writeAccess); | |||
@@ -2198,15 +2197,15 @@ public final class Workbook implements Model { | |||
if (fileShare == null) { | |||
fileShare = new FileSharingRecord(); | |||
int i = 0; | |||
for (i = 0; | |||
i < records.size() && !(records.get(i) instanceof WriteAccessRecord); | |||
for (i = 0; | |||
i < records.size() && !(records.get(i) instanceof WriteAccessRecord); | |||
i++) { | |||
} | |||
records.add(i+1, fileShare); | |||
} | |||
return fileShare; | |||
} | |||
/** | |||
* is the workbook protected with a password (not encrypted)? | |||
*/ |
@@ -22,7 +22,6 @@ import org.apache.poi.hssf.record.cf.BorderFormatting; | |||
import org.apache.poi.hssf.record.cf.FontFormatting; | |||
import org.apache.poi.hssf.record.cf.PatternFormatting; | |||
import org.apache.poi.hssf.record.formula.Ptg; | |||
import org.apache.poi.hssf.usermodel.HSSFWorkbook; | |||
import org.apache.poi.hssf.usermodel.HSSFSheet; | |||
import org.apache.poi.ss.formula.Formula; | |||
import org.apache.poi.ss.formula.FormulaType; | |||
@@ -32,7 +31,7 @@ import org.apache.poi.util.LittleEndianOutput; | |||
/** | |||
* Conditional Formatting Rule Record (0x01B1).<br/> | |||
* | |||
* | |||
* @author Dmitriy Kumshayev | |||
*/ | |||
public final class CFRuleRecord extends StandardRecord { | |||
@@ -101,10 +100,10 @@ public final class CFRuleRecord extends StandardRecord { | |||
private BorderFormatting borderFormatting; | |||
private PatternFormatting patternFormatting; | |||
private Formula field_17_formula1; | |||
private Formula field_18_formula2; | |||
/** Creates new CFRuleRecord */ | |||
private CFRuleRecord(byte conditionType, byte comparisonOperation) | |||
{ | |||
@@ -124,9 +123,9 @@ public final class CFRuleRecord extends StandardRecord { | |||
field_17_formula1=Formula.create(Ptg.EMPTY_PTG_ARRAY); | |||
field_18_formula2=Formula.create(Ptg.EMPTY_PTG_ARRAY); | |||
} | |||
private CFRuleRecord(byte conditionType, byte comparisonOperation, Ptg[] formula1, Ptg[] formula2) { | |||
this(conditionType, comparisonOperation); | |||
this(conditionType, comparisonOperation); | |||
field_17_formula1 = Formula.create(formula1); | |||
field_18_formula2 = Formula.create(formula2); | |||
} | |||
@@ -199,7 +198,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
return null; | |||
} | |||
} | |||
public boolean containsAlignFormattingBlock() | |||
{ | |||
return getOptionFlag(align); | |||
@@ -208,7 +207,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
{ | |||
setOptionFlag(false,align); | |||
} | |||
public boolean containsBorderFormattingBlock() | |||
{ | |||
return getOptionFlag(bord); | |||
@@ -229,7 +228,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
return null; | |||
} | |||
} | |||
public boolean containsPatternFormattingBlock() | |||
{ | |||
return getOptionFlag(patt); | |||
@@ -250,7 +249,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
return null; | |||
} | |||
} | |||
public boolean containsProtectionFormattingBlock() | |||
{ | |||
return getOptionFlag(prot); | |||
@@ -259,7 +258,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
{ | |||
setOptionFlag(false,prot); | |||
} | |||
public void setComparisonOperation(byte operation) | |||
{ | |||
field_2_comparison_operator = operation; | |||
@@ -269,7 +268,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
{ | |||
return field_2_comparison_operator; | |||
} | |||
/** | |||
* get the option flags | |||
@@ -279,7 +278,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
public int getOptions() | |||
{ | |||
return field_5_options; | |||
} | |||
} | |||
private boolean isModified(BitField field) | |||
{ | |||
@@ -290,7 +289,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
{ | |||
field_5_options = field.setBoolean(field_5_options, !modified); | |||
} | |||
public boolean isLeftBorderModified() | |||
{ | |||
return isModified(bordLeft); | |||
@@ -300,7 +299,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
{ | |||
setModified(modified,bordLeft); | |||
} | |||
public boolean isRightBorderModified() | |||
{ | |||
return isModified(bordRight); | |||
@@ -310,7 +309,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
{ | |||
setModified(modified,bordRight); | |||
} | |||
public boolean isTopBorderModified() | |||
{ | |||
return isModified(bordTop); | |||
@@ -320,7 +319,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
{ | |||
setModified(modified,bordTop); | |||
} | |||
public boolean isBottomBorderModified() | |||
{ | |||
return isModified(bordBot); | |||
@@ -330,7 +329,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
{ | |||
setModified(modified,bordBot); | |||
} | |||
public boolean isTopLeftBottomRightBorderModified() | |||
{ | |||
return isModified(bordTlBr); | |||
@@ -340,7 +339,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
{ | |||
setModified(modified,bordTlBr); | |||
} | |||
public boolean isBottomLeftTopRightBorderModified() | |||
{ | |||
return isModified(bordBlTr); | |||
@@ -350,7 +349,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
{ | |||
setModified(modified,bordBlTr); | |||
} | |||
public boolean isPatternStyleModified() | |||
{ | |||
return isModified(pattStyle); | |||
@@ -360,7 +359,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
{ | |||
setModified(modified,pattStyle); | |||
} | |||
public boolean isPatternColorModified() | |||
{ | |||
return isModified(pattCol); | |||
@@ -370,7 +369,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
{ | |||
setModified(modified,pattCol); | |||
} | |||
public boolean isPatternBackgroundColorModified() | |||
{ | |||
return isModified(pattBgCol); | |||
@@ -380,7 +379,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
{ | |||
setModified(modified,pattBgCol); | |||
} | |||
private boolean getOptionFlag(BitField field) | |||
{ | |||
return field.isSet(field_5_options); | |||
@@ -390,12 +389,12 @@ public final class CFRuleRecord extends StandardRecord { | |||
{ | |||
field_5_options = field.setBoolean(field_5_options, flag); | |||
} | |||
/** | |||
* get the stack of the 1st expression as a list | |||
* | |||
* @return list of tokens (casts stack to a list and returns it!) | |||
* this method can return null is we are unable to create Ptgs from | |||
* this method can return null is we are unable to create Ptgs from | |||
* existing excel file | |||
* callers should check for null! | |||
*/ | |||
@@ -432,7 +431,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
private static int getFormulaSize(Formula formula) { | |||
return formula.getEncodedTokenSize(); | |||
} | |||
/** | |||
* called by the class that is responsible for writing this sucker. | |||
* Subclasses should implement this so that their data is passed back in a | |||
@@ -441,30 +440,30 @@ public final class CFRuleRecord extends StandardRecord { | |||
* @param out the stream to write to | |||
*/ | |||
public void serialize(LittleEndianOutput out) { | |||
int formula1Len=getFormulaSize(field_17_formula1); | |||
int formula2Len=getFormulaSize(field_18_formula2); | |||
out.writeByte(field_1_condition_type); | |||
out.writeByte(field_2_comparison_operator); | |||
out.writeShort(formula1Len); | |||
out.writeShort(formula2Len); | |||
out.writeInt(field_5_options); | |||
out.writeShort(field_6_not_used); | |||
if (containsFontFormattingBlock()) { | |||
byte[] fontFormattingRawRecord = fontFormatting.getRawRecord(); | |||
out.write(fontFormattingRawRecord); | |||
} | |||
if (containsBorderFormattingBlock()) { | |||
borderFormatting.serialize(out); | |||
} | |||
if (containsPatternFormattingBlock()) { | |||
patternFormatting.serialize(out); | |||
} | |||
field_17_formula1.serializeTokens(out); | |||
field_18_formula2.serializeTokens(out); | |||
} | |||
@@ -499,7 +498,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
} | |||
return buffer.toString(); | |||
} | |||
public Object clone() { | |||
CFRuleRecord rec = new CFRuleRecord(field_1_condition_type, field_2_comparison_operator); | |||
rec.field_5_options = field_5_options; | |||
@@ -524,7 +523,7 @@ public final class CFRuleRecord extends StandardRecord { | |||
* this call will produce the wrong results if the formula contains any cell references | |||
* One approach might be to apply the inverse of SharedFormulaRecord.convertSharedFormulas(Stack, int, int) | |||
* Note - two extra parameters (rowIx & colIx) will be required. They probably come from one of the Region objects. | |||
* | |||
* | |||
* @return <code>null</code> if <tt>formula</tt> was null. | |||
*/ | |||
private static Ptg[] parseFormula(String formula, HSSFSheet sheet) { |
@@ -18,7 +18,6 @@ | |||
package org.apache.poi.hssf.record; | |||
import org.apache.poi.util.HexDump; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.LittleEndianOutput; | |||
/** |
@@ -17,7 +17,6 @@ | |||
package org.apache.poi.hssf.record; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import java.lang.reflect.Constructor; | |||
import java.lang.reflect.InvocationTargetException; |
@@ -19,7 +19,6 @@ package org.apache.poi.hssf.record; | |||
import org.apache.poi.hssf.util.CellRangeAddress8Bit; | |||
import org.apache.poi.util.HexDump; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.LittleEndianOutput; | |||
/** | |||
@@ -59,7 +58,7 @@ public final class SelectionRecord extends StandardRecord { | |||
field_3_col_active_cell = in.readShort(); | |||
field_4_active_cell_ref_index = in.readShort(); | |||
int field_5_num_refs = in.readUShort(); | |||
field_6_refs = new CellRangeAddress8Bit[field_5_num_refs]; | |||
for (int i = 0; i < field_6_refs.length; i++) { | |||
field_6_refs[i] = new CellRangeAddress8Bit(in); | |||
@@ -141,7 +140,7 @@ public final class SelectionRecord extends StandardRecord { | |||
return sb.toString(); | |||
} | |||
protected int getDataSize() { | |||
return 9 // 1 byte + 4 shorts | |||
return 9 // 1 byte + 4 shorts | |||
+ CellRangeAddress8Bit.getEncodedSize(field_6_refs.length); | |||
} | |||
public void serialize(LittleEndianOutput out) { |
@@ -17,7 +17,6 @@ | |||
package org.apache.poi.hssf.record; | |||
import java.io.ByteArrayInputStream; | |||
import java.io.ByteArrayOutputStream; | |||
import org.apache.poi.hssf.record.formula.Area3DPtg; | |||
@@ -26,7 +25,6 @@ import org.apache.poi.hssf.record.formula.Ptg; | |||
import org.apache.poi.hssf.record.formula.Ref3DPtg; | |||
import org.apache.poi.hssf.record.formula.RefPtg; | |||
import org.apache.poi.util.HexDump; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.LittleEndianByteArrayInputStream; | |||
import org.apache.poi.util.LittleEndianInput; | |||
import org.apache.poi.util.LittleEndianOutput; | |||
@@ -37,6 +35,7 @@ import org.apache.poi.util.LittleEndianOutputStream; | |||
*/ | |||
public abstract class SubRecord { | |||
protected SubRecord() { | |||
// no fields to initialise | |||
} | |||
public static SubRecord createSubRecord(LittleEndianInput in) { | |||
@@ -78,8 +77,8 @@ public abstract class SubRecord { | |||
public abstract void serialize(LittleEndianOutput out); | |||
public abstract Object clone(); | |||
private static final class UnknownSubRecord extends SubRecord { | |||
private final int _sid; | |||
@@ -118,7 +117,7 @@ public abstract class SubRecord { | |||
private static final class LbsDataSubRecord extends SubRecord { | |||
public static final int sid = 0x0013; | |||
private int _unknownShort1; | |||
private int _unknownInt4; | |||
private Ptg _linkPtg; | |||
@@ -137,8 +136,8 @@ public abstract class SubRecord { | |||
if (linkSize > 0) { | |||
int formulaSize = in.readUShort(); | |||
_unknownInt4 = in.readInt(); | |||
byte[] buf = new byte[formulaSize]; | |||
in.readFully(buf); | |||
_linkPtg = readRefPtg(buf); | |||
@@ -152,7 +151,7 @@ public abstract class SubRecord { | |||
default: | |||
throw new RecordFormatException("Unexpected leftover bytes"); | |||
} | |||
} else { | |||
_unknownInt4 = 0; | |||
_linkPtg = null; | |||
@@ -165,11 +164,11 @@ public abstract class SubRecord { | |||
_comboStyle = in.readUShort(); | |||
_lineCount = in.readUShort(); | |||
_unknownShort13 = in.readUShort(); | |||
} | |||
protected int getDataSize() { | |||
int result = 2; // 2 initial shorts | |||
// optional link formula | |||
if (_linkPtg != null) { | |||
result += 2; // encoded Ptg size |
@@ -17,7 +17,6 @@ | |||
package org.apache.poi.hssf.record.formula; | |||
import org.apache.poi.hssf.record.UnicodeString; | |||
import org.apache.poi.hssf.record.constant.ConstantValueParser; | |||
import org.apache.poi.hssf.record.constant.ErrorConstant; | |||
import org.apache.poi.util.LittleEndianInput; | |||
@@ -25,20 +24,20 @@ import org.apache.poi.util.LittleEndianOutput; | |||
/** | |||
* ArrayPtg - handles arrays | |||
* | |||
* | |||
* The ArrayPtg is a little weird, the size of the Ptg when parsing initially only | |||
* includes the Ptg sid and the reserved bytes. The next Ptg in the expression then follows. | |||
* It is only after the "size" of all the Ptgs is met, that the ArrayPtg data is actually | |||
* held after this. So Ptg.createParsedExpression keeps track of the number of | |||
* held after this. So Ptg.createParsedExpression keeps track of the number of | |||
* ArrayPtg elements and need to parse the data upto the FORMULA record size. | |||
* | |||
* | |||
* @author Jason Height (jheight at chariot dot net dot au) | |||
*/ | |||
public final class ArrayPtg extends Ptg { | |||
public static final byte sid = 0x20; | |||
private static final int RESERVED_FIELD_LEN = 7; | |||
/** | |||
/** | |||
* The size of the plain tArray token written within the standard formula tokens | |||
* (not including the data which comes after all formula tokens) | |||
*/ | |||
@@ -48,7 +47,7 @@ public final class ArrayPtg extends Ptg { | |||
// TODO - fix up field visibility and subclasses | |||
private final byte[] field_1_reserved; | |||
// data from these fields comes after the Ptg data of all tokens in current formula | |||
private int token_1_columns; | |||
private short token_2_rows; | |||
@@ -78,7 +77,7 @@ public final class ArrayPtg extends Ptg { | |||
vv[getValueIndex(c, r)] = rowData[c]; | |||
} | |||
} | |||
token_3_arrayValues = vv; | |||
field_1_reserved = DEFAULT_RESERVED_DATA; | |||
} | |||
@@ -98,13 +97,13 @@ public final class ArrayPtg extends Ptg { | |||
} | |||
return result; | |||
} | |||
public boolean isBaseToken() { | |||
return false; | |||
} | |||
/** | |||
* Read in the actual token (array) values. This occurs | |||
/** | |||
* Read in the actual token (array) values. This occurs | |||
* AFTER the last Ptg in the expression. | |||
* See page 304-305 of Excel97-2007BinaryFileFormat(xls)Specification.pdf | |||
*/ | |||
@@ -116,10 +115,10 @@ public final class ArrayPtg extends Ptg { | |||
//Which is not explicitly documented. | |||
nColumns++; | |||
nRows++; | |||
token_1_columns = nColumns; | |||
token_2_rows = nRows; | |||
int totalCount = nRows * nColumns; | |||
token_3_arrayValues = ConstantValueParser.parse(in, totalCount); | |||
} | |||
@@ -143,11 +142,11 @@ public final class ArrayPtg extends Ptg { | |||
*/ | |||
/* package */ int getValueIndex(int colIx, int rowIx) { | |||
if(colIx < 0 || colIx >= token_1_columns) { | |||
throw new IllegalArgumentException("Specified colIx (" + colIx | |||
throw new IllegalArgumentException("Specified colIx (" + colIx | |||
+ ") is outside the allowed range (0.." + (token_1_columns-1) + ")"); | |||
} | |||
if(rowIx < 0 || rowIx >= token_2_rows) { | |||
throw new IllegalArgumentException("Specified rowIx (" + rowIx | |||
throw new IllegalArgumentException("Specified rowIx (" + rowIx | |||
+ ") is outside the allowed range (0.." + (token_2_rows-1) + ")"); | |||
} | |||
return rowIx * token_1_columns + colIx; | |||
@@ -176,7 +175,7 @@ public final class ArrayPtg extends Ptg { | |||
/** This size includes the size of the array Ptg plus the Array Ptg Token value size*/ | |||
public int getSize() { | |||
return PLAIN_TOKEN_SIZE | |||
return PLAIN_TOKEN_SIZE | |||
// data written after the all tokens: | |||
+ 1 + 2 // column, row | |||
+ ConstantValueParser.getEncodedSize(token_3_arrayValues); | |||
@@ -200,7 +199,7 @@ public final class ArrayPtg extends Ptg { | |||
b.append("}"); | |||
return b.toString(); | |||
} | |||
private static String getConstantText(Object o) { | |||
if (o == null) { | |||
@@ -220,7 +219,7 @@ public final class ArrayPtg extends Ptg { | |||
} | |||
throw new IllegalArgumentException("Unexpected constant class (" + o.getClass().getName() + ")"); | |||
} | |||
public byte getDefaultOperandClass() { | |||
return Ptg.CLASS_ARRAY; | |||
} |
@@ -22,11 +22,10 @@ import org.apache.poi.util.BitField; | |||
import org.apache.poi.util.BitFieldFactory; | |||
import org.apache.poi.util.LittleEndianInput; | |||
import org.apache.poi.util.LittleEndianOutput; | |||
import org.apache.poi.ss.SpreadsheetVersion; | |||
/** | |||
* ReferencePtgBase - handles references (such as A1, A2, IA4) | |||
* | |||
* | |||
* @author Andrew C. Oliver (acoliver@apache.org) | |||
* @author Jason Height (jheight at chariot dot net dot au) | |||
*/ |
@@ -19,7 +19,6 @@ package org.apache.poi.hssf.record.formula.atp; | |||
import org.apache.poi.hssf.record.formula.eval.BoolEval; | |||
import org.apache.poi.hssf.record.formula.eval.ErrorEval; | |||
import org.apache.poi.hssf.record.formula.eval.ValueEval; | |||
import org.apache.poi.hssf.record.formula.eval.EvaluationException; | |||
import org.apache.poi.hssf.record.formula.eval.OperandResolver; | |||
import org.apache.poi.hssf.record.formula.eval.ValueEval; |
@@ -22,15 +22,14 @@ import java.util.GregorianCalendar; | |||
import java.util.regex.Pattern; | |||
import org.apache.poi.hssf.record.formula.eval.ErrorEval; | |||
import org.apache.poi.hssf.record.formula.eval.ValueEval; | |||
import org.apache.poi.hssf.record.formula.eval.EvaluationException; | |||
import org.apache.poi.hssf.record.formula.eval.NumberEval; | |||
import org.apache.poi.hssf.record.formula.eval.OperandResolver; | |||
import org.apache.poi.hssf.record.formula.eval.StringEval; | |||
import org.apache.poi.hssf.record.formula.eval.ValueEval; | |||
import org.apache.poi.hssf.record.formula.functions.FreeRefFunction; | |||
import org.apache.poi.ss.usermodel.DateUtil; | |||
import org.apache.poi.ss.formula.EvaluationWorkbook; | |||
import org.apache.poi.ss.usermodel.DateUtil; | |||
/** | |||
* Implementation of Excel 'Analysis ToolPak' function YEARFRAC()<br/> | |||
* |
@@ -17,13 +17,8 @@ | |||
package org.apache.poi.hssf.usermodel; | |||
import org.apache.poi.ddf.EscherRecord; | |||
import org.apache.poi.ddf.EscherClientAnchorRecord; | |||
import org.apache.poi.ddf.EscherChildAnchorRecord; | |||
public class HSSFChildAnchor | |||
extends HSSFAnchor | |||
{ | |||
public final class HSSFChildAnchor extends HSSFAnchor { | |||
public HSSFChildAnchor() | |||
{ | |||
} | |||
@@ -50,5 +45,4 @@ public class HSSFChildAnchor | |||
{ | |||
return dy1 > dy2; | |||
} | |||
} |
@@ -14,54 +14,50 @@ | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.hssf.usermodel; | |||
import org.apache.poi.ss.usermodel.CreationHelper; | |||
import org.apache.poi.ss.usermodel.Sheet; | |||
public class HSSFCreationHelper implements CreationHelper { | |||
private HSSFWorkbook workbook; | |||
private HSSFDataFormat dataFormat; | |||
private HSSFDataFormat dataFormat; | |||
HSSFCreationHelper(HSSFWorkbook wb) { | |||
workbook = wb; | |||
// Create the things we only ever need one of | |||
dataFormat = new HSSFDataFormat(workbook.getWorkbook()); | |||
} | |||
/** | |||
* Creates a new HSSFRichTextString for you. | |||
*/ | |||
public HSSFRichTextString createRichTextString(String text) { | |||
return new HSSFRichTextString(text); | |||
} | |||
public HSSFDataFormat createDataFormat() { | |||
return dataFormat; | |||
} | |||
public HSSFHyperlink createHyperlink(int type) { | |||
return new HSSFHyperlink(type); | |||
} | |||
/** | |||
* Creates a HSSFFormulaEvaluator, the object that evaluates formula cells. | |||
* | |||
* @return a HSSFFormulaEvaluator instance | |||
*/ | |||
public HSSFFormulaEvaluator createFormulaEvaluator(){ | |||
return new HSSFFormulaEvaluator(workbook); | |||
} | |||
/** | |||
* Creates a HSSFClientAnchor. Use this object to position drawing object in a sheet | |||
* | |||
* @return a HSSFClientAnchor instance | |||
* @see org.apache.poi.ss.usermodel.Drawing | |||
*/ | |||
public HSSFClientAnchor createClientAnchor(){ | |||
return new HSSFClientAnchor(); | |||
} | |||
/** | |||
* Creates a HSSFFormulaEvaluator, the object that evaluates formula cells. | |||
* | |||
* @return a HSSFFormulaEvaluator instance | |||
*/ | |||
public HSSFFormulaEvaluator createFormulaEvaluator(){ | |||
return new HSSFFormulaEvaluator(workbook); | |||
} | |||
/** | |||
* Creates a HSSFClientAnchor. Use this object to position drawing object in a sheet | |||
* | |||
* @return a HSSFClientAnchor instance | |||
* @see org.apache.poi.ss.usermodel.Drawing | |||
*/ | |||
public HSSFClientAnchor createClientAnchor(){ | |||
return new HSSFClientAnchor(); | |||
} | |||
} |
@@ -17,21 +17,11 @@ | |||
package org.apache.poi.hssf.usermodel; | |||
import org.apache.poi.ss.usermodel.DataFormatter; | |||
import java.text.DecimalFormat; | |||
import java.text.FieldPosition; | |||
import java.text.Format; | |||
import java.text.ParsePosition; | |||
import java.text.SimpleDateFormat; | |||
import java.util.ArrayList; | |||
import java.util.Date; | |||
import java.util.HashMap; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.regex.Matcher; | |||
import java.util.regex.Pattern; | |||
import org.apache.poi.ss.usermodel.DataFormatter; | |||
/** | |||
* HSSFDataFormatter contains methods for formatting the value stored in an | |||
@@ -73,7 +63,6 @@ import java.util.regex.Pattern; | |||
* cell's data format string. | |||
* | |||
* @author James May (james dot may at fmr dot com) | |||
* | |||
*/ | |||
public final class HSSFDataFormatter extends DataFormatter { | |||
@@ -19,9 +19,6 @@ package org.apache.poi.hssf.usermodel; | |||
import org.apache.poi.ss.usermodel.RichTextString; | |||
import org.apache.poi.util.BitField; | |||
import org.apache.poi.util.BitFieldFactory; | |||
/** | |||
* A textbox is a shape that may hold a rich text string. | |||
* |
@@ -21,78 +21,69 @@ import java.io.FileInputStream; | |||
import java.io.IOException; | |||
import java.util.Iterator; | |||
import org.apache.poi.poifs.filesystem.DirectoryEntry; | |||
import org.apache.poi.poifs.filesystem.DirectoryNode; | |||
import org.apache.poi.poifs.filesystem.DocumentEntry; | |||
import org.apache.poi.poifs.filesystem.DocumentNode; | |||
import org.apache.poi.poifs.filesystem.POIFSFileSystem; | |||
/** | |||
* A lister of the entries in POIFS files. | |||
* | |||
* | |||
* Much simpler than {@link POIFSViewer} | |||
*/ | |||
public class POIFSLister { | |||
/** | |||
* Display the entries of multiple POIFS files | |||
* | |||
* @param args the names of the files to be displayed | |||
*/ | |||
public static void main(final String args[]) throws IOException { | |||
if (args.length == 0) | |||
{ | |||
System.err.println("Must specify at least one file to view"); | |||
System.exit(1); | |||
} | |||
/** | |||
* Display the entries of multiple POIFS files | |||
* | |||
* @param args the names of the files to be displayed | |||
*/ | |||
public static void main(final String args[]) throws IOException { | |||
if (args.length == 0) { | |||
System.err.println("Must specify at least one file to view"); | |||
System.exit(1); | |||
} | |||
boolean withSizes = false; | |||
for (int j = 0; j < args.length; j++) { | |||
if(args[j].equalsIgnoreCase("-size") || | |||
args[j].equalsIgnoreCase("-sizes")) { | |||
withSizes = true; | |||
} else { | |||
viewFile(args[j], withSizes); | |||
} | |||
} | |||
} | |||
boolean withSizes = false; | |||
for (int j = 0; j < args.length; j++) { | |||
if (args[j].equalsIgnoreCase("-size") || args[j].equalsIgnoreCase("-sizes")) { | |||
withSizes = true; | |||
} else { | |||
viewFile(args[j], withSizes); | |||
} | |||
} | |||
} | |||
public static void viewFile(final String filename, boolean withSizes) throws IOException | |||
{ | |||
POIFSFileSystem fs = new POIFSFileSystem( | |||
new FileInputStream(filename) | |||
); | |||
displayDirectory(fs.getRoot(), "", withSizes); | |||
} | |||
public static void displayDirectory(DirectoryNode dir, String indent, boolean withSizes) { | |||
System.out.println(indent + dir.getName() + " -"); | |||
String newIndent = indent + " "; | |||
boolean hadChildren = false; | |||
for(Iterator it = dir.getEntries(); it.hasNext(); ) { | |||
hadChildren = true; | |||
Object entry = it.next(); | |||
if(entry instanceof DirectoryNode) { | |||
displayDirectory((DirectoryNode)entry, newIndent, withSizes); | |||
} else { | |||
DocumentNode doc = (DocumentNode)entry; | |||
String name = doc.getName(); | |||
String size = ""; | |||
if(name.charAt(0) < 10) { | |||
String altname = "(0x0" + (int)name.charAt(0) + ")" + name.substring(1); | |||
name = name.substring(1) + " <" + altname + ">"; | |||
} | |||
if(withSizes) { | |||
size = " [" + | |||
doc.getSize() + " / 0x" + | |||
Integer.toHexString(doc.getSize()) + | |||
"]"; | |||
} | |||
System.out.println(newIndent + name + size); | |||
} | |||
} | |||
if(!hadChildren) { | |||
System.out.println(newIndent + "(no children)"); | |||
} | |||
} | |||
} | |||
public static void viewFile(final String filename, boolean withSizes) throws IOException { | |||
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(filename)); | |||
displayDirectory(fs.getRoot(), "", withSizes); | |||
} | |||
public static void displayDirectory(DirectoryNode dir, String indent, boolean withSizes) { | |||
System.out.println(indent + dir.getName() + " -"); | |||
String newIndent = indent + " "; | |||
boolean hadChildren = false; | |||
for (Iterator it = dir.getEntries(); it.hasNext();) { | |||
hadChildren = true; | |||
Object entry = it.next(); | |||
if (entry instanceof DirectoryNode) { | |||
displayDirectory((DirectoryNode) entry, newIndent, withSizes); | |||
} else { | |||
DocumentNode doc = (DocumentNode) entry; | |||
String name = doc.getName(); | |||
String size = ""; | |||
if (name.charAt(0) < 10) { | |||
String altname = "(0x0" + (int) name.charAt(0) + ")" + name.substring(1); | |||
name = name.substring(1) + " <" + altname + ">"; | |||
} | |||
if (withSizes) { | |||
size = " [" + doc.getSize() + " / 0x" + Integer.toHexString(doc.getSize()) | |||
+ "]"; | |||
} | |||
System.out.println(newIndent + name + size); | |||
} | |||
} | |||
if (!hadChildren) { | |||
System.out.println(newIndent + "(no children)"); | |||
} | |||
} | |||
} |
@@ -1,4 +1,3 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
@@ -15,44 +14,35 @@ | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.poifs.property; | |||
import java.util.*; | |||
import java.io.IOException; | |||
import org.apache.poi.poifs.storage.SmallDocumentBlock; | |||
import java.util.*; | |||
/** | |||
* Directory property | |||
* | |||
* @author Marc Johnson (mjohnson at apache dot org) | |||
*/ | |||
public class DirectoryProperty extends Property implements Parent { // TODO - fix instantiable superclass | |||
public class DirectoryProperty | |||
extends Property | |||
implements Parent | |||
{ | |||
// List of Property instances | |||
private List _children; | |||
/** List of Property instances */ | |||
private List<Property> _children; | |||
// set of children's names | |||
private Set _children_names; | |||
/** set of children's names */ | |||
private Set<String> _children_names; | |||
/** | |||
* Default constructor | |||
* | |||
* @param name the name of the directory | |||
*/ | |||
public DirectoryProperty(String name) | |||
{ | |||
super(); | |||
_children = new ArrayList(); | |||
_children_names = new HashSet(); | |||
_children = new ArrayList<Property>(); | |||
_children_names = new HashSet<String>(); | |||
setName(name); | |||
setSize(0); | |||
setPropertyType(PropertyConstants.DIRECTORY_TYPE); | |||
@@ -67,13 +57,12 @@ public class DirectoryProperty | |||
* @param array byte data | |||
* @param offset offset into byte data | |||
*/ | |||
protected DirectoryProperty(final int index, final byte [] array, | |||
final int offset) | |||
{ | |||
super(index, array, offset); | |||
_children = new ArrayList(); | |||
_children_names = new HashSet(); | |||
_children = new ArrayList<Property>(); | |||
_children_names = new HashSet<String>(); | |||
} | |||
/** | |||
@@ -84,8 +73,7 @@ public class DirectoryProperty | |||
* | |||
* @return true if the name change could be made, else false | |||
*/ | |||
public boolean changeName(final Property property, final String newName) | |||
public boolean changeName(Property property, String newName) | |||
{ | |||
boolean result; | |||
String oldName = property.getName(); | |||
@@ -116,8 +104,7 @@ public class DirectoryProperty | |||
* | |||
* @return true if the Property could be deleted, else false | |||
*/ | |||
public boolean deleteChild(final Property property) | |||
public boolean deleteChild(Property property) | |||
{ | |||
boolean result = _children.remove(property); | |||
@@ -128,9 +115,7 @@ public class DirectoryProperty | |||
return result; | |||
} | |||
public static class PropertyComparator | |||
implements Comparator | |||
{ | |||
public static class PropertyComparator implements Comparator<Property> { | |||
/** | |||
* Object equality, implemented as object identity | |||
@@ -139,7 +124,6 @@ public class DirectoryProperty | |||
* | |||
* @return true if identical, else false | |||
*/ | |||
public boolean equals(Object o) | |||
{ | |||
return this == o; | |||
@@ -160,12 +144,11 @@ public class DirectoryProperty | |||
* zero if o1 == o2, | |||
* positive value if o1 > o2. | |||
*/ | |||
public int compare(Object o1, Object o2) | |||
public int compare(Property o1, Property o2) | |||
{ | |||
String VBA_PROJECT = "_VBA_PROJECT"; | |||
String name1 = (( Property ) o1).getName(); | |||
String name2 = (( Property ) o2).getName(); | |||
String name1 = o1.getName(); | |||
String name2 = o2.getName(); | |||
int result = name1.length() - name2.length(); | |||
if (result == 0) | |||
@@ -200,14 +183,11 @@ public class DirectoryProperty | |||
} | |||
return result; | |||
} | |||
} // end private class PropertyComparator | |||
/* ********** START extension of Property ********** */ | |||
} | |||
/** | |||
* @return true if a directory type Property | |||
*/ | |||
public boolean isDirectory() | |||
{ | |||
return true; | |||
@@ -217,13 +197,11 @@ public class DirectoryProperty | |||
* Perform whatever activities need to be performed prior to | |||
* writing | |||
*/ | |||
protected void preWrite() | |||
{ | |||
if (_children.size() > 0) | |||
{ | |||
Property[] children = | |||
( Property [] ) _children.toArray(new Property[ 0 ]); | |||
Property[] children = _children.toArray(new Property[ 0 ]); | |||
Arrays.sort(children, new PropertyComparator()); | |||
int midpoint = children.length / 2; | |||
@@ -259,17 +237,13 @@ public class DirectoryProperty | |||
} | |||
} | |||
/* ********** END extension of Property ********** */ | |||
/* ********** START implementation of Parent ********** */ | |||
/** | |||
* Get an iterator over the children of this Parent; all elements | |||
* are instances of Property. | |||
* | |||
* @return Iterator of children; may refer to an empty collection | |||
*/ | |||
public Iterator getChildren() | |||
public Iterator<Property> getChildren() | |||
{ | |||
return _children.iterator(); | |||
} | |||
@@ -282,7 +256,6 @@ public class DirectoryProperty | |||
* @exception IOException if we already have a child with the same | |||
* name | |||
*/ | |||
public void addChild(final Property property) | |||
throws IOException | |||
{ | |||
@@ -295,7 +268,4 @@ public class DirectoryProperty | |||
_children_names.add(name); | |||
_children.add(property); | |||
} | |||
/* ********** END implementation of Parent ********** */ | |||
} // end public class DirectoryProperty | |||
} |
@@ -1,4 +1,3 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
@@ -15,20 +14,19 @@ | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.poifs.property; | |||
import java.io.IOException; | |||
import java.io.OutputStream; | |||
import java.util.*; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.Stack; | |||
import org.apache.poi.poifs.common.POIFSConstants; | |||
import org.apache.poi.poifs.filesystem.BATManaged; | |||
import org.apache.poi.poifs.storage.BlockWritable; | |||
import org.apache.poi.poifs.storage.PropertyBlock; | |||
import org.apache.poi.poifs.storage.RawDataBlock; | |||
import org.apache.poi.poifs.storage.RawDataBlockList; | |||
/** | |||
@@ -38,22 +36,15 @@ import org.apache.poi.poifs.storage.RawDataBlockList; | |||
* | |||
* @author Marc Johnson (mjohnson at apache dot org) | |||
*/ | |||
public class PropertyTable | |||
implements BATManaged, BlockWritable | |||
{ | |||
public final class PropertyTable implements BATManaged, BlockWritable { | |||
private int _start_block; | |||
private List _properties; | |||
private List<Property> _properties; | |||
private BlockWritable[] _blocks; | |||
/** | |||
* Default constructor | |||
*/ | |||
public PropertyTable() | |||
{ | |||
_start_block = POIFSConstants.END_OF_CHAIN; | |||
_properties = new ArrayList(); | |||
_properties = new ArrayList<Property>(); | |||
addProperty(new RootProperty()); | |||
_blocks = null; | |||
} | |||
@@ -69,7 +60,6 @@ public class PropertyTable | |||
* @exception IOException if anything goes wrong (which should be | |||
* a result of the input being NFG) | |||
*/ | |||
public PropertyTable(final int startBlock, | |||
final RawDataBlockList blockList) | |||
throws IOException | |||
@@ -87,8 +77,7 @@ public class PropertyTable | |||
* | |||
* @param property the new Property to manage | |||
*/ | |||
public void addProperty(final Property property) | |||
public void addProperty(Property property) | |||
{ | |||
_properties.add(property); | |||
} | |||
@@ -98,7 +87,6 @@ public class PropertyTable | |||
* | |||
* @param property the Property to be removed | |||
*/ | |||
public void removeProperty(final Property property) | |||
{ | |||
_properties.remove(property); | |||
@@ -109,7 +97,6 @@ public class PropertyTable | |||
* | |||
* @return the root property | |||
*/ | |||
public RootProperty getRoot() | |||
{ | |||
@@ -120,11 +107,9 @@ public class PropertyTable | |||
/** | |||
* Prepare to be written | |||
*/ | |||
public void preWrite() | |||
{ | |||
Property[] properties = | |||
( Property [] ) _properties.toArray(new Property[ 0 ]); | |||
Property[] properties = _properties.toArray(new Property[ 0 ]); | |||
// give each property its index | |||
for (int k = 0; k < properties.length; k++) | |||
@@ -147,7 +132,6 @@ public class PropertyTable | |||
* | |||
* @return start block index | |||
*/ | |||
public int getStartBlock() | |||
{ | |||
return _start_block; | |||
@@ -164,12 +148,12 @@ public class PropertyTable | |||
// property has no children | |||
return; | |||
} | |||
Stack children = new Stack(); | |||
Stack<Property> children = new Stack<Property>(); | |||
children.push(_properties.get(index)); | |||
while (!children.empty()) | |||
{ | |||
Property property = ( Property ) children.pop(); | |||
Property property = children.pop(); | |||
root.addChild(property); | |||
if (property.isDirectory()) | |||
@@ -189,14 +173,11 @@ public class PropertyTable | |||
} | |||
} | |||
/* ********** START implementation of BATManaged ********** */ | |||
/** | |||
* Return the number of BigBlock's this instance uses | |||
* | |||
* @return count of BigBlock instances | |||
*/ | |||
public int countBlocks() | |||
{ | |||
return (_blocks == null) ? 0 | |||
@@ -209,15 +190,11 @@ public class PropertyTable | |||
* @param index index into the array of BigBlock instances making | |||
* up the the filesystem | |||
*/ | |||
public void setStartBlock(final int index) | |||
{ | |||
_start_block = index; | |||
} | |||
/* ********** END implementation of BATManaged ********** */ | |||
/* ********** START implementation of BlockWritable ********** */ | |||
/** | |||
* Write the storage to an OutputStream | |||
* | |||
@@ -227,7 +204,6 @@ public class PropertyTable | |||
* @exception IOException on problems writing to the specified | |||
* stream | |||
*/ | |||
public void writeBlocks(final OutputStream stream) | |||
throws IOException | |||
{ | |||
@@ -239,7 +215,4 @@ public class PropertyTable | |||
} | |||
} | |||
} | |||
/* ********** END implementation of BlockWritable ********** */ | |||
} // end public class PropertyTable | |||
} |
@@ -1,4 +1,3 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
@@ -15,14 +14,9 @@ | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.poifs.property; | |||
import java.util.*; | |||
import java.io.IOException; | |||
import org.apache.poi.poifs.common.POIFSConstants; | |||
import org.apache.poi.poifs.storage.SmallDocumentBlock; | |||
@@ -31,14 +25,7 @@ import org.apache.poi.poifs.storage.SmallDocumentBlock; | |||
* | |||
* @author Marc Johnson (mjohnson at apache dot org) | |||
*/ | |||
public class RootProperty | |||
extends DirectoryProperty | |||
{ | |||
/** | |||
* Default constructor | |||
*/ | |||
public final class RootProperty extends DirectoryProperty { | |||
RootProperty() | |||
{ | |||
@@ -57,7 +44,6 @@ public class RootProperty | |||
* @param array byte data | |||
* @param offset offset into byte data | |||
*/ | |||
protected RootProperty(final int index, final byte [] array, | |||
final int offset) | |||
{ | |||
@@ -69,10 +55,8 @@ public class RootProperty | |||
* | |||
* @param size size in terms of small blocks | |||
*/ | |||
public void setSize(int size) | |||
{ | |||
super.setSize(SmallDocumentBlock.calcSize(size)); | |||
} | |||
} // end public class RootProperty | |||
} |
@@ -1,4 +1,3 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
@@ -15,7 +14,6 @@ | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.poifs.storage; | |||
@@ -26,7 +24,6 @@ import java.util.Arrays; | |||
import org.apache.poi.poifs.common.POIFSConstants; | |||
import org.apache.poi.util.IntegerField; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.LittleEndianConsts; | |||
/** | |||
@@ -35,10 +32,7 @@ import org.apache.poi.util.LittleEndianConsts; | |||
* | |||
* @author Marc Johnson (mjohnson at apache dot org) | |||
*/ | |||
public class BATBlock | |||
extends BigBlock | |||
{ | |||
public final class BATBlock extends BigBlock { | |||
private static final int _entries_per_block = | |||
POIFSConstants.BIG_BLOCK_SIZE / LittleEndianConsts.INT_SIZE; | |||
private static final int _entries_per_xbat_block = _entries_per_block |
@@ -1,4 +1,3 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
@@ -15,7 +14,6 @@ | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.poifs.storage; | |||
@@ -43,9 +41,7 @@ import org.apache.poi.util.LittleEndianConsts; | |||
* | |||
* @author Marc Johnson (mjohnson at apache dot org) | |||
*/ | |||
public class BlockAllocationTableReader | |||
{ | |||
public final class BlockAllocationTableReader { | |||
private IntList _entries; | |||
/** | |||
@@ -154,12 +150,6 @@ public class BlockAllocationTableReader | |||
setEntries(blocks, raw_block_list); | |||
} | |||
/** | |||
* Constructor BlockAllocationTableReader | |||
* | |||
* | |||
*/ | |||
BlockAllocationTableReader() | |||
{ | |||
_entries = new IntList(); | |||
@@ -177,17 +167,16 @@ public class BlockAllocationTableReader | |||
* | |||
* @exception IOException if there is a problem acquiring the blocks | |||
*/ | |||
ListManagedBlock [] fetchBlocks(final int startBlock, | |||
final int headerPropertiesStartBlock, | |||
final BlockList blockList) | |||
throws IOException | |||
{ | |||
List blocks = new ArrayList(); | |||
List<ListManagedBlock> blocks = new ArrayList<ListManagedBlock>(); | |||
int currentBlock = startBlock; | |||
boolean firstPass = true; | |||
ListManagedBlock dataBlock = null; | |||
// Process the chain from the start to the end | |||
// Normally we have header, data, end | |||
// Sometimes we have data, header, end | |||
@@ -216,9 +205,8 @@ public class BlockAllocationTableReader | |||
} | |||
} | |||
} | |||
return ( ListManagedBlock [] ) blocks | |||
.toArray(new ListManagedBlock[ blocks.size() ]); | |||
return blocks.toArray(new ListManagedBlock[blocks.size()]); | |||
} | |||
// methods for debugging reader | |||
@@ -230,7 +218,6 @@ public class BlockAllocationTableReader | |||
* | |||
* @return true if the specific block is used, else false | |||
*/ | |||
boolean isUsed(final int index) | |||
{ | |||
boolean rval = false; | |||
@@ -238,9 +225,8 @@ public class BlockAllocationTableReader | |||
try | |||
{ | |||
rval = _entries.get(index) != -1; | |||
} | |||
catch (IndexOutOfBoundsException ignored) | |||
{ | |||
} catch (IndexOutOfBoundsException e) { | |||
// ignored | |||
} | |||
return rval; | |||
} | |||
@@ -256,7 +242,6 @@ public class BlockAllocationTableReader | |||
* | |||
* @exception IOException if the current block is unused | |||
*/ | |||
int getNextBlockIndex(final int index) | |||
throws IOException | |||
{ | |||
@@ -264,10 +249,7 @@ public class BlockAllocationTableReader | |||
{ | |||
return _entries.get(index); | |||
} | |||
else | |||
{ | |||
throw new IOException("index " + index + " is unused"); | |||
} | |||
throw new IOException("index " + index + " is unused"); | |||
} | |||
/** | |||
@@ -276,10 +258,7 @@ public class BlockAllocationTableReader | |||
* @param blocks the array of blocks containing the indices | |||
* @param raw_blocks the list of blocks being managed. Unused | |||
* blocks will be eliminated from the list | |||
* | |||
* @exception IOException | |||
*/ | |||
private void setEntries(final ListManagedBlock [] blocks, | |||
final BlockList raw_blocks) | |||
throws IOException | |||
@@ -308,5 +287,4 @@ public class BlockAllocationTableReader | |||
} | |||
raw_blocks.setBAT(this); | |||
} | |||
} // end class BlockAllocationTableReader | |||
} |
@@ -1,4 +1,3 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
@@ -15,20 +14,15 @@ | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.poifs.storage; | |||
import java.io.IOException; | |||
import java.io.OutputStream; | |||
import java.util.*; | |||
import org.apache.poi.poifs.common.POIFSConstants; | |||
import org.apache.poi.poifs.filesystem.BATManaged; | |||
import org.apache.poi.util.IntList; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.LittleEndianConsts; | |||
/** | |||
* This class manages and creates the Block Allocation Table, which is | |||
@@ -45,10 +39,7 @@ import org.apache.poi.util.LittleEndianConsts; | |||
* | |||
* @author Marc Johnson (mjohnson at apache dot org) | |||
*/ | |||
public class BlockAllocationTableWriter | |||
implements BlockWritable, BATManaged | |||
{ | |||
public final class BlockAllocationTableWriter implements BlockWritable, BATManaged { | |||
private IntList _entries; | |||
private BATBlock[] _blocks; | |||
private int _start_block; | |||
@@ -56,7 +47,6 @@ public class BlockAllocationTableWriter | |||
/** | |||
* create a BlockAllocationTableWriter | |||
*/ | |||
public BlockAllocationTableWriter() | |||
{ | |||
_start_block = POIFSConstants.END_OF_CHAIN; | |||
@@ -69,7 +59,6 @@ public class BlockAllocationTableWriter | |||
* | |||
* @return start block index of BAT blocks | |||
*/ | |||
public int createBlocks() | |||
{ | |||
int xbat_blocks = 0; | |||
@@ -92,11 +81,8 @@ public class BlockAllocationTableWriter | |||
// stable ... we're OK | |||
break; | |||
} | |||
else | |||
{ | |||
bat_blocks = calculated_bat_blocks; | |||
xbat_blocks = calculated_xbat_blocks; | |||
} | |||
bat_blocks = calculated_bat_blocks; | |||
xbat_blocks = calculated_xbat_blocks; | |||
} | |||
int startBlock = allocateSpace(bat_blocks); | |||
@@ -112,7 +98,6 @@ public class BlockAllocationTableWriter | |||
* | |||
* @return the starting index of the blocks | |||
*/ | |||
public int allocateSpace(final int blockCount) | |||
{ | |||
int startBlock = _entries.size(); | |||
@@ -136,7 +121,6 @@ public class BlockAllocationTableWriter | |||
* | |||
* @return the starting block index | |||
*/ | |||
public int getStartBlock() | |||
{ | |||
return _start_block; | |||
@@ -145,14 +129,11 @@ public class BlockAllocationTableWriter | |||
/** | |||
* create the BATBlocks | |||
*/ | |||
void simpleCreateBlocks() | |||
{ | |||
_blocks = BATBlock.createBATBlocks(_entries.toArray()); | |||
} | |||
/* ********** START implementation of BlockWritable ********** */ | |||
/** | |||
* Write the storage to an OutputStream | |||
* | |||
@@ -162,7 +143,6 @@ public class BlockAllocationTableWriter | |||
* @exception IOException on problems writing to the specified | |||
* stream | |||
*/ | |||
public void writeBlocks(final OutputStream stream) | |||
throws IOException | |||
{ | |||
@@ -172,15 +152,11 @@ public class BlockAllocationTableWriter | |||
} | |||
} | |||
/* ********** END implementation of BlockWritable ********** */ | |||
/* ********** START implementation of BATManaged ********** */ | |||
/** | |||
* Return the number of BigBlock's this instance uses | |||
* | |||
* @return count of BigBlock instances | |||
*/ | |||
public int countBlocks() | |||
{ | |||
return _blocks.length; | |||
@@ -188,15 +164,9 @@ public class BlockAllocationTableWriter | |||
/** | |||
* Set the start block for this instance | |||
* | |||
* @param start_block | |||
*/ | |||
public void setStartBlock(int start_block) | |||
{ | |||
_start_block = start_block; | |||
} | |||
/* ********** END implementation of BATManaged ********** */ | |||
} // end class BlockAllocationTableWriter | |||
} |
@@ -1,4 +1,3 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
@@ -15,30 +14,20 @@ | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.poifs.storage; | |||
import java.io.*; | |||
import java.util.*; | |||
import java.io.IOException; | |||
/** | |||
* A simple implementation of BlockList | |||
* | |||
* @author Marc Johnson (mjohnson at apache dot org | |||
*/ | |||
class BlockListImpl | |||
implements BlockList | |||
{ | |||
abstract class BlockListImpl implements BlockList { | |||
private ListManagedBlock[] _blocks; | |||
private BlockAllocationTableReader _bat; | |||
/** | |||
* Constructor BlockListImpl | |||
*/ | |||
protected BlockListImpl() | |||
{ | |||
_blocks = new ListManagedBlock[ 0 ]; | |||
@@ -50,21 +39,17 @@ class BlockListImpl | |||
* | |||
* @param blocks blocks to be managed | |||
*/ | |||
protected void setBlocks(final ListManagedBlock [] blocks) | |||
{ | |||
_blocks = blocks; | |||
} | |||
/* ********** START implementation of BlockList ********** */ | |||
/** | |||
* remove the specified block from the list | |||
* | |||
* @param index the index of the specified block; if the index is | |||
* out of range, that's ok | |||
*/ | |||
public void zap(final int index) | |||
{ | |||
if ((index >= 0) && (index < _blocks.length)) | |||
@@ -72,13 +57,13 @@ class BlockListImpl | |||
_blocks[ index ] = null; | |||
} | |||
} | |||
/** | |||
* Unit testing method. Gets, without sanity checks or | |||
* removing. | |||
*/ | |||
protected ListManagedBlock get(final int index) throws IOException { | |||
return _blocks[index]; | |||
protected ListManagedBlock get(final int index) { | |||
return _blocks[index]; | |||
} | |||
/** | |||
@@ -91,7 +76,6 @@ class BlockListImpl | |||
* @exception IOException if the index is out of range or has | |||
* already been removed | |||
*/ | |||
public ListManagedBlock remove(final int index) | |||
throws IOException | |||
{ | |||
@@ -112,7 +96,7 @@ class BlockListImpl | |||
catch (ArrayIndexOutOfBoundsException ignored) | |||
{ | |||
throw new IOException("Cannot remove block[ " + index | |||
+ " ]; out of range[ 0 - " + | |||
+ " ]; out of range[ 0 - " + | |||
(_blocks.length-1) + " ]"); | |||
} | |||
return result; | |||
@@ -128,7 +112,6 @@ class BlockListImpl | |||
* | |||
* @exception IOException if blocks are missing | |||
*/ | |||
public ListManagedBlock [] fetchBlocks(final int startBlock, final int headerPropertiesStartBlock) | |||
throws IOException | |||
{ | |||
@@ -144,10 +127,7 @@ class BlockListImpl | |||
* set the associated BlockAllocationTable | |||
* | |||
* @param bat the associated BlockAllocationTable | |||
* | |||
* @exception IOException | |||
*/ | |||
public void setBAT(final BlockAllocationTableReader bat) | |||
throws IOException | |||
{ | |||
@@ -158,7 +138,4 @@ class BlockListImpl | |||
} | |||
_bat = bat; | |||
} | |||
/* ********** END implementation of BlockList ********** */ | |||
} // end package-scope class BlockListImpl | |||
} |
@@ -1,4 +1,3 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
@@ -15,23 +14,17 @@ | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.poifs.storage; | |||
import org.apache.poi.poifs.common.POIFSConstants; | |||
import org.apache.poi.util.IntegerField; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.LittleEndianConsts; | |||
import org.apache.poi.util.LongField; | |||
import org.apache.poi.util.ShortField; | |||
/** | |||
* Constants used in reading/writing the Header block | |||
* | |||
* @author Marc Johnson (mjohnson at apache dot org) | |||
*/ | |||
public interface HeaderBlockConstants | |||
{ | |||
public static final long _signature = 0xE11AB1A1E011CFD0L; |
@@ -1,4 +1,3 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
@@ -15,29 +14,22 @@ | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.poifs.storage; | |||
import java.io.*; | |||
import java.util.*; | |||
import java.io.IOException; | |||
import java.io.OutputStream; | |||
import java.util.List; | |||
import org.apache.poi.poifs.common.POIFSConstants; | |||
import org.apache.poi.poifs.property.Property; | |||
import org.apache.poi.util.IntegerField; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.LittleEndianConsts; | |||
/** | |||
* A block of Property instances | |||
* | |||
* @author Marc Johnson (mjohnson at apache dot org) | |||
*/ | |||
public class PropertyBlock | |||
extends BigBlock | |||
{ | |||
public final class PropertyBlock extends BigBlock { | |||
private static final int _properties_per_block = | |||
POIFSConstants.BIG_BLOCK_SIZE / POIFSConstants.PROPERTY_SIZE; | |||
private Property[] _properties; |
@@ -1,4 +1,3 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
@@ -15,15 +14,12 @@ | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.poifs.storage; | |||
import org.apache.poi.poifs.property.RootProperty; | |||
import java.util.*; | |||
import java.io.IOException; | |||
import java.io.*; | |||
import org.apache.poi.poifs.property.RootProperty; | |||
/** | |||
* This class implements reading the small document block list from an | |||
@@ -31,9 +27,7 @@ import java.io.*; | |||
* | |||
* @author Marc Johnson (mjohnson at apache dot org) | |||
*/ | |||
public class SmallBlockTableReader | |||
{ | |||
public final class SmallBlockTableReader { | |||
/** | |||
* fetch the small document block list from an existing file | |||
@@ -48,7 +42,6 @@ public class SmallBlockTableReader | |||
* | |||
* @exception IOException | |||
*/ | |||
public static BlockList getSmallDocumentBlocks( | |||
final RawDataBlockList blockList, final RootProperty root, | |||
final int sbatStart) |
@@ -1,4 +1,3 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
@@ -15,12 +14,9 @@ | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.util; | |||
import java.util.*; | |||
/** | |||
* A List of int's; as full an implementation of the java.util.List | |||
* interface as possible, with an eye toward minimal creation of | |||
@@ -47,7 +43,6 @@ import java.util.*; | |||
* | |||
* @author Marc Johnson | |||
*/ | |||
public class IntList | |||
{ | |||
private int[] _array; | |||
@@ -62,14 +57,14 @@ public class IntList | |||
public IntList() | |||
{ | |||
this(_default_size); | |||
} | |||
} | |||
public IntList(final int initialCapacity) | |||
{ | |||
this(initialCapacity,0); | |||
} | |||
/** | |||
* create a copy of an existing IntList | |||
* | |||
@@ -94,17 +89,17 @@ public class IntList | |||
_array = new int[ initialCapacity ]; | |||
if (fillval != 0) { | |||
fillval = fillvalue; | |||
fillArray(fillval, _array, 0); | |||
fillArray(fillval, _array, 0); | |||
} | |||
_limit = 0; | |||
} | |||
private void fillArray(int val, int[] array, int index) { | |||
for (int k = index; k < array.length; k++) { | |||
array[k] = val; | |||
array[k] = val; | |||
} | |||
} | |||
/** | |||
* add the specfied value at the specified index | |||
* | |||
@@ -653,11 +648,11 @@ public class IntList | |||
int size = (new_size == _array.length) ? new_size + 1 | |||
: new_size; | |||
int[] new_array = new int[ size ]; | |||
if (fillval != 0) { | |||
fillArray(fillval, new_array, _array.length); | |||
fillArray(fillval, new_array, _array.length); | |||
} | |||
System.arraycopy(_array, 0, new_array, 0, _limit); | |||
_array = new_array; | |||
} |
@@ -1,4 +1,3 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
@@ -15,12 +14,9 @@ | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.util; | |||
import java.util.*; | |||
/** | |||
* A logger class that strives to make it as easy as possible for | |||
* developers to write log calls, while simultaneously making those | |||
@@ -31,14 +27,13 @@ import java.util.*; | |||
* @author Glen Stampoultzis (glens at apache.org) | |||
* @author Nicola Ken Barozzi (nicolaken at apache.org) | |||
*/ | |||
public class NullLogger extends POILogger | |||
{ | |||
public void initialize(final String cat) | |||
{ | |||
//do nothing | |||
//do nothing | |||
} | |||
/** | |||
* Log a message | |||
* | |||
@@ -462,5 +457,5 @@ public class NullLogger extends POILogger | |||
//do nothing | |||
} | |||
} | |||
} | |||
@@ -1,4 +1,3 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
@@ -15,12 +14,9 @@ | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.util; | |||
import java.util.*; | |||
/** | |||
* A List of short's; as full an implementation of the java.util.List | |||
* interface as possible, with an eye toward minimal creation of |
@@ -22,7 +22,6 @@ import java.util.*; | |||
import org.apache.poi.poifs.common.POIFSConstants; | |||
import org.apache.poi.util.IOUtils; | |||
import org.apache.poi.util.PackageHelper; | |||
import org.apache.xmlbeans.XmlException; | |||
import org.apache.poi.openxml4j.exceptions.InvalidFormatException; | |||
import org.apache.poi.openxml4j.exceptions.OpenXML4JException; | |||
import org.apache.poi.openxml4j.opc.*; |
@@ -26,7 +26,6 @@ import java.util.Map.Entry; | |||
import org.apache.poi.ss.usermodel.FontFamily; | |||
import org.apache.poi.ss.usermodel.FontScheme; | |||
import org.apache.poi.ss.usermodel.BuiltinFormats; | |||
import org.apache.poi.ss.usermodel.Font; | |||
import org.apache.poi.xssf.usermodel.XSSFCellStyle; | |||
import org.apache.poi.xssf.usermodel.XSSFFont; | |||
import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder; | |||
@@ -80,17 +79,17 @@ public class StylesTable extends POIXMLDocumentPart { | |||
* Create a new, empty StylesTable | |||
*/ | |||
public StylesTable() { | |||
super(); | |||
super(); | |||
doc = StyleSheetDocument.Factory.newInstance(); | |||
doc.addNewStyleSheet(); | |||
// Initialization required in order to make the document readable by MSExcel | |||
initialize(); | |||
} | |||
public StylesTable(PackagePart part, PackageRelationship rel) throws IOException { | |||
super(part, rel); | |||
readFrom(part.getInputStream()); | |||
} | |||
public StylesTable(PackagePart part, PackageRelationship rel) throws IOException { | |||
super(part, rel); | |||
readFrom(part.getInputStream()); | |||
} | |||
/** | |||
* Read this shared styles table from an XML file. | |||
@@ -107,13 +106,13 @@ public class StylesTable extends POIXMLDocumentPart { | |||
numberFormats.put((int)nfmt.getNumFmtId(), nfmt.getFormatCode()); | |||
} | |||
if(doc.getStyleSheet().getFonts() != null){ | |||
int idx = 0; | |||
for (CTFont font : doc.getStyleSheet().getFonts().getFontArray()) { | |||
XSSFFont f = new XSSFFont(font, idx); | |||
fonts.add(f); | |||
idx++; | |||
} | |||
} | |||
int idx = 0; | |||
for (CTFont font : doc.getStyleSheet().getFonts().getFontArray()) { | |||
XSSFFont f = new XSSFFont(font, idx); | |||
fonts.add(f); | |||
idx++; | |||
} | |||
} | |||
if(doc.getStyleSheet().getFills() != null) | |||
for (CTFill fill : doc.getStyleSheet().getFills().getFillArray()) { | |||
fills.add(new XSSFCellFill(fill)); | |||
@@ -149,7 +148,7 @@ public class StylesTable extends POIXMLDocumentPart { | |||
return numberFormats.get(idx); | |||
} | |||
public int putNumberFormat(String fmt) { | |||
public int putNumberFormat(String fmt) { | |||
if (numberFormats.containsValue(fmt)) { | |||
// Find the key, and return that | |||
for(Integer key : numberFormats.keySet() ) { | |||
@@ -174,12 +173,12 @@ public class StylesTable extends POIXMLDocumentPart { | |||
} | |||
public int putFont(XSSFFont font) { | |||
int idx = fonts.indexOf(font); | |||
if (idx != -1) { | |||
return idx; | |||
} | |||
fonts.add(font); | |||
return fonts.size() - 1; | |||
int idx = fonts.indexOf(font); | |||
if (idx != -1) { | |||
return idx; | |||
} | |||
fonts.add(font); | |||
return fonts.size() - 1; | |||
} | |||
public XSSFCellStyle getStyleAt(int idx) { | |||
@@ -205,42 +204,42 @@ public class StylesTable extends POIXMLDocumentPart { | |||
return borders.get(idx); | |||
} | |||
public int putBorder(XSSFCellBorder border) { | |||
int idx = borders.indexOf(border); | |||
if (idx != -1) { | |||
return idx; | |||
} | |||
borders.add(border); | |||
return borders.size() - 1; | |||
public int putBorder(XSSFCellBorder border) { | |||
int idx = borders.indexOf(border); | |||
if (idx != -1) { | |||
return idx; | |||
} | |||
borders.add(border); | |||
return borders.size() - 1; | |||
} | |||
public XSSFCellFill getFillAt(int idx) { | |||
return fills.get(idx); | |||
} | |||
public XSSFCellFill getFillAt(int idx) { | |||
return fills.get(idx); | |||
} | |||
public List<XSSFCellBorder> getBorders(){ | |||
return borders; | |||
} | |||
public List<XSSFCellBorder> getBorders(){ | |||
return borders; | |||
} | |||
public List<XSSFCellFill> getFills(){ | |||
return fills; | |||
} | |||
public List<XSSFCellFill> getFills(){ | |||
return fills; | |||
} | |||
public List<XSSFFont> getFonts(){ | |||
return fonts; | |||
} | |||
public List<XSSFFont> getFonts(){ | |||
return fonts; | |||
} | |||
public Map<Integer, String> getNumberFormats(){ | |||
return numberFormats; | |||
} | |||
public Map<Integer, String> getNumberFormats(){ | |||
return numberFormats; | |||
} | |||
public int putFill(XSSFCellFill fill) { | |||
int idx = fills.indexOf(fill); | |||
if (idx != -1) { | |||
return idx; | |||
} | |||
fills.add(fill); | |||
return fills.size() - 1; | |||
public int putFill(XSSFCellFill fill) { | |||
int idx = fills.indexOf(fill); | |||
if (idx != -1) { | |||
return idx; | |||
} | |||
fills.add(fill); | |||
return fills.size() - 1; | |||
} | |||
public CTXf getCellXfAt(int idx) { | |||
@@ -315,31 +314,31 @@ public class StylesTable extends POIXMLDocumentPart { | |||
} | |||
doc.getStyleSheet().setNumFmts(formats); | |||
int idx; | |||
int idx; | |||
// Fonts | |||
CTFonts ctFonts = CTFonts.Factory.newInstance(); | |||
ctFonts.setCount(fonts.size()); | |||
CTFont[] ctfnt = new CTFont[fonts.size()]; | |||
idx = 0; | |||
for(XSSFFont f : fonts) ctfnt[idx++] = f.getCTFont(); | |||
ctFonts.setFontArray(ctfnt); | |||
CTFont[] ctfnt = new CTFont[fonts.size()]; | |||
idx = 0; | |||
for(XSSFFont f : fonts) ctfnt[idx++] = f.getCTFont(); | |||
ctFonts.setFontArray(ctfnt); | |||
doc.getStyleSheet().setFonts(ctFonts); | |||
// Fills | |||
CTFills ctFills = CTFills.Factory.newInstance(); | |||
ctFills.setCount(fills.size()); | |||
CTFill[] ctf = new CTFill[fills.size()]; | |||
idx = 0; | |||
for(XSSFCellFill f : fills) ctf[idx++] = f.getCTFill(); | |||
ctFills.setFillArray(ctf); | |||
CTFill[] ctf = new CTFill[fills.size()]; | |||
idx = 0; | |||
for(XSSFCellFill f : fills) ctf[idx++] = f.getCTFill(); | |||
ctFills.setFillArray(ctf); | |||
doc.getStyleSheet().setFills(ctFills); | |||
// Borders | |||
CTBorders ctBorders = CTBorders.Factory.newInstance(); | |||
ctBorders.setCount(borders.size()); | |||
CTBorder[] ctb = new CTBorder[borders.size()]; | |||
idx = 0; | |||
for(XSSFCellBorder b : borders) ctb[idx++] = b.getCTBorder(); | |||
CTBorder[] ctb = new CTBorder[borders.size()]; | |||
idx = 0; | |||
for(XSSFCellBorder b : borders) ctb[idx++] = b.getCTBorder(); | |||
ctBorders.setBorderArray(ctb); | |||
doc.getStyleSheet().setBorders(ctBorders); | |||
@@ -376,13 +375,13 @@ public class StylesTable extends POIXMLDocumentPart { | |||
doc.save(out, options); | |||
} | |||
@Override | |||
protected void commit() throws IOException { | |||
PackagePart part = getPackagePart(); | |||
OutputStream out = part.getOutputStream(); | |||
writeTo(out); | |||
out.close(); | |||
} | |||
@Override | |||
protected void commit() throws IOException { | |||
PackagePart part = getPackagePart(); | |||
OutputStream out = part.getOutputStream(); | |||
writeTo(out); | |||
out.close(); | |||
} | |||
private void initialize() { | |||
//CTFont ctFont = createDefaultFont(); | |||
@@ -452,36 +451,35 @@ public class StylesTable extends POIXMLDocumentPart { | |||
return this.dxfs.size(); | |||
} | |||
public XSSFCellStyle createCellStyle() { | |||
CTXf xf = CTXf.Factory.newInstance(); | |||
xf.setNumFmtId(0); | |||
xf.setFontId(0); | |||
xf.setFillId(0); | |||
xf.setBorderId(0); | |||
xf.setXfId(0); | |||
int xfSize = styleXfs.size(); | |||
int indexXf = putCellXf(xf); | |||
return new XSSFCellStyle(indexXf - 1, xfSize - 1, this); | |||
} | |||
/** | |||
* Finds a font that matches the one with the supplied attributes | |||
*/ | |||
public XSSFFont findFont(short boldWeight, short color, short fontHeight, String name, boolean italic, boolean strikeout, short typeOffset, byte underline) { | |||
for (XSSFFont font : fonts) { | |||
if ( (font.getBoldweight() == boldWeight) | |||
&& font.getColor() == color | |||
&& font.getFontHeight() == fontHeight | |||
&& font.getFontName().equals(name) | |||
&& font.getItalic() == italic | |||
&& font.getStrikeout() == strikeout | |||
&& font.getTypeOffset() == typeOffset | |||
&& font.getUnderline() == underline) | |||
{ | |||
return font; | |||
} | |||
} | |||
return null; | |||
} | |||
public XSSFCellStyle createCellStyle() { | |||
CTXf xf = CTXf.Factory.newInstance(); | |||
xf.setNumFmtId(0); | |||
xf.setFontId(0); | |||
xf.setFillId(0); | |||
xf.setBorderId(0); | |||
xf.setXfId(0); | |||
int xfSize = styleXfs.size(); | |||
int indexXf = putCellXf(xf); | |||
return new XSSFCellStyle(indexXf - 1, xfSize - 1, this); | |||
} | |||
/** | |||
* Finds a font that matches the one with the supplied attributes | |||
*/ | |||
public XSSFFont findFont(short boldWeight, short color, short fontHeight, String name, boolean italic, boolean strikeout, short typeOffset, byte underline) { | |||
for (XSSFFont font : fonts) { | |||
if ( (font.getBoldweight() == boldWeight) | |||
&& font.getColor() == color | |||
&& font.getFontHeight() == fontHeight | |||
&& font.getFontName().equals(name) | |||
&& font.getItalic() == italic | |||
&& font.getStrikeout() == strikeout | |||
&& font.getTypeOffset() == typeOffset | |||
&& font.getUnderline() == underline) | |||
{ | |||
return font; | |||
} | |||
} | |||
return null; | |||
} | |||
} |
@@ -17,49 +17,48 @@ | |||
package org.apache.poi.xssf.usermodel; | |||
import org.apache.poi.ss.usermodel.CreationHelper; | |||
import org.apache.poi.ss.usermodel.DataFormat; | |||
import org.apache.poi.ss.usermodel.Hyperlink; | |||
import org.apache.poi.ss.usermodel.RichTextString; | |||
public class XSSFCreationHelper implements CreationHelper { | |||
private XSSFWorkbook workbook; | |||
XSSFCreationHelper(XSSFWorkbook wb) { | |||
workbook = wb; | |||
} | |||
/** | |||
* Creates a new XSSFRichTextString for you. | |||
*/ | |||
/** | |||
* Creates a new XSSFRichTextString for you. | |||
*/ | |||
public XSSFRichTextString createRichTextString(String text) { | |||
XSSFRichTextString rt = new XSSFRichTextString(text); | |||
rt.setStylesTableReference(workbook.getStylesSource()); | |||
return rt; | |||
XSSFRichTextString rt = new XSSFRichTextString(text); | |||
rt.setStylesTableReference(workbook.getStylesSource()); | |||
return rt; | |||
} | |||
public XSSFDataFormat createDataFormat() { | |||
return workbook.createDataFormat(); | |||
} | |||
public XSSFHyperlink createHyperlink(int type) { | |||
return new XSSFHyperlink(type); | |||
} | |||
/** | |||
* Creates a XSSFFormulaEvaluator, the object that evaluates formula cells. | |||
* | |||
* @return a XSSFFormulaEvaluator instance | |||
*/ | |||
public XSSFFormulaEvaluator createFormulaEvaluator(){ | |||
return new XSSFFormulaEvaluator(workbook); | |||
} | |||
/** | |||
* Creates a XSSFFormulaEvaluator, the object that evaluates formula cells. | |||
* | |||
* @return a XSSFFormulaEvaluator instance | |||
*/ | |||
public XSSFFormulaEvaluator createFormulaEvaluator() { | |||
return new XSSFFormulaEvaluator(workbook); | |||
} | |||
/** | |||
* Creates a XSSFClientAnchor. Use this object to position drawing object in a sheet | |||
* | |||
* @return a XSSFClientAnchor instance | |||
* @see org.apache.poi.ss.usermodel.Drawing | |||
*/ | |||
public XSSFClientAnchor createClientAnchor(){ | |||
return new XSSFClientAnchor(); | |||
} | |||
/** | |||
* Creates a XSSFClientAnchor. Use this object to position drawing object in | |||
* a sheet | |||
* | |||
* @return a XSSFClientAnchor instance | |||
* @see org.apache.poi.ss.usermodel.Drawing | |||
*/ | |||
public XSSFClientAnchor createClientAnchor() { | |||
return new XSSFClientAnchor(); | |||
} | |||
} |
@@ -53,7 +53,6 @@ import org.apache.poi.xssf.model.CalculationChain; | |||
import org.apache.poi.xssf.model.SharedStringsTable; | |||
import org.apache.poi.xssf.model.StylesTable; | |||
import org.apache.poi.xssf.model.MapInfo; | |||
import org.apache.poi.xssf.extractor.XSSFExportToXml; | |||
import org.apache.xmlbeans.XmlException; | |||
import org.apache.xmlbeans.XmlObject; | |||
import org.apache.xmlbeans.XmlOptions; | |||
@@ -570,7 +569,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X | |||
throw new IllegalStateException("There are no defined names in this workbook"); | |||
} | |||
if (nameIndex < 0 || nameIndex > nNames) { | |||
throw new IllegalArgumentException("Specified name index " + nameIndex | |||
throw new IllegalArgumentException("Specified name index " + nameIndex | |||
+ " is outside the allowable range (0.." + (nNames-1) + ")."); | |||
} | |||
return namedRanges.get(nameIndex); | |||
@@ -636,7 +635,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X | |||
* @param sheetIndex Zero-based sheet index (0 Represents the first sheet to keep consistent with java) | |||
* @return String Null if no print area has been defined | |||
*/ | |||
public String getPrintArea(int sheetIndex) { | |||
public String getPrintArea(int sheetIndex) { | |||
XSSFName name = getBuiltInName(XSSFName.BUILTIN_PRINT_AREA, sheetIndex); | |||
if (name == null) return null; | |||
//adding one here because 0 indicates a global named region; doesnt make sense for print areas | |||
@@ -975,7 +974,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X | |||
r = escapedName + "!$" + rowRef.getCellRefParts()[1] + ":$" + rowRef2.getCellRefParts()[1]; | |||
} | |||
} | |||
StringBuffer rng = new StringBuffer(); | |||
rng.append(c); | |||
if(rng.length() > 0 && r.length() > 0) rng.append(','); | |||
@@ -1243,7 +1242,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X | |||
} | |||
return embedds; | |||
} | |||
public boolean isHidden() { | |||
throw new RuntimeException("Not implemented yet"); | |||
} | |||
@@ -1280,7 +1279,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X | |||
* Fired when a formula is deleted from this workbook, | |||
* for example when calling cell.setCellFormula(null) | |||
* | |||
* @see XSSFCell#setCellFormula(String) | |||
* @see XSSFCell#setCellFormula(String) | |||
*/ | |||
protected void onDeleteFormula(XSSFCell cell){ | |||
if(calcChain != null) { | |||
@@ -1294,7 +1293,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X | |||
* <p> | |||
* The calculation chain object specifies the order in which the cells in a workbook were last calculated | |||
* </p> | |||
* | |||
* | |||
* @return the <code>CalculationChain</code> object or <code>null</code> if not defined | |||
*/ | |||
public CalculationChain getCalculationChain(){ | |||
@@ -1302,19 +1301,19 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X | |||
} | |||
/** | |||
* | |||
* | |||
* @return a collection of custom XML mappings defined in this workbook | |||
*/ | |||
public Collection<XSSFMap> getCustomXMLMappings(){ | |||
return mapInfo == null ? new ArrayList<XSSFMap>() : mapInfo.getAllXSSFMaps(); | |||
} | |||
/** | |||
* | |||
* | |||
* @return the helper class used to query the custom XML mapping defined in this workbook | |||
*/ | |||
public MapInfo getMapInfo(){ | |||
return mapInfo; | |||
} | |||
} |
@@ -18,119 +18,151 @@ | |||
package org.apache.poi.xssf.usermodel.extensions; | |||
import org.apache.poi.ss.usermodel.HeaderFooter; | |||
import org.apache.poi.xssf.usermodel.XSSFSheet; | |||
import org.apache.poi.xssf.usermodel.helpers.HeaderFooterHelper; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTHeaderFooter; | |||
/** | |||
* Parent class of all XSSF headers and footers. | |||
* | |||
* For a list of all the different fields that can be | |||
* placed into a header or footer, such as page number, | |||
* bold, underline etc, see the follow formatting syntax | |||
* | |||
* | |||
* For a list of all the different fields that can be placed into a header or | |||
* footer, such as page number, bold, underline etc, see the follow formatting | |||
* syntax | |||
* | |||
*<b> Header/Footer Formatting Syntax</b> | |||
*<p> | |||
* There are a number of formatting codes that can be written inline with the actual header / footer text, which | |||
* affect the formatting in the header or footer. | |||
* There are a number of formatting codes that can be written inline with the | |||
* actual header / footer text, which affect the formatting in the header or | |||
* footer. | |||
*</p> | |||
* | |||
* This example shows the text "Center Bold Header" on the first line (center section), and the date on the second | |||
* line (center section). | |||
* &CCenter &"-,Bold"Bold &"-,Regular"Header_x000A_&D | |||
* | |||
* <b>General Rules:</b> | |||
* There is no required order in which these codes must appear. | |||
* The first occurrence of the following codes turns the formatting ON, the second occurrence turns it OFF again: | |||
* | |||
* This example shows the text "Center Bold Header" on the first line (center | |||
* section), and the date on the second line (center section). &CCenter | |||
* &"-,Bold"Bold &"-,Regular"Header_x000A_&D | |||
* | |||
* <b>General Rules:</b> There is no required order in which these codes must | |||
* appear. The first occurrence of the following codes turns the formatting ON, | |||
* the second occurrence turns it OFF again: | |||
* | |||
* <dl> | |||
* <dt> &L </dt> <dd>code for "left section" (there are three header / footer locations, "left", "center", and "right"). When | |||
* two or more occurrences of this section marker exist, the contents from all markers are concatenated, in the | |||
* order of appearance, and placed into the left section.</dd> | |||
* <dt> &P </dt> <dd> code for "current page #"</dd> | |||
* <dt> &N </dt> <dd> code for "total pages"</dd> | |||
* <dt>&font size </dt> <dd> code for "text font size", where font size is a font size in points.</dd> | |||
* <dt> &K </dt> <dd> code for "text font color" | |||
* RGB Color is specified as RRGGBB | |||
* Theme Color is specifed as TTSNN where TT is the theme color Id, S is either "+" or "-" of the tint/shade | |||
* value, NN is the tint/shade value.</dd> | |||
* <dt> &S </dt> <dd> code for "text strikethrough" on / off</dd> | |||
* <dt> &X </dt> <dd> code for "text super script" on / off</dd> | |||
* <dt> &Y </dt> <dd> code for "text subscript" on / off</dd> | |||
* <dt> &C </dt> <dd> code for "center section". When two or more occurrences of this section marker exist, the contents | |||
* from all markers are concatenated, in the order of appearance, and placed into the center section. | |||
* SpreadsheetML Reference Material - Worksheets 1966</dd> | |||
* <dt> &D </dt> <dd> code for "date"</dd> | |||
* <dt> &T </dt> <dd> code for "time"</dd> | |||
* <dt> &G </dt> <dd> code for "picture as background"</dd> | |||
* <dt> &U </dt> <dd> code for "text single underline"</dd> | |||
* <dt> &E </dt> <dd> code for "double underline"</dd> | |||
* <dt> &R </dt> <dd> code for "right section". When two or more occurrences of this section marker exist, the contents | |||
* from all markers are concatenated, in the order of appearance, and placed into the right section.</dd> | |||
* <dt> &Z </dt> <dd> code for "this workbook's file path"</dd> | |||
* <dt> &F </dt> <dd> code for "this workbook's file name"</dd> | |||
* <dt> &A </dt> <dd> code for "sheet tab name"</dd> | |||
* <dt> &+ </dt> <dd> code for add to page #.</dd> | |||
* <dt> &- </dt> <dd> code for subtract from page #.</dd> | |||
* <dt> &"font name,font type" - code for "text font name" and "text font type", where font name and font type | |||
* are strings specifying the name and type of the font, separated by a comma. When a hyphen appears in font | |||
* name, it means "none specified". Both of font name and font type can be localized values.</dd> | |||
* <dt> &"-,Bold" </dt> <dd> code for "bold font style"</dd> | |||
* <dt> &B </dt> <dd> also means "bold font style"</dd> | |||
* <dt> &"-,Regular" </dt> <dd> code for "regular font style"</dd> | |||
* <dt> &"-,Italic" </dt> <dd> code for "italic font style"</dd> | |||
* <dt> &I </dt> <dd> also means "italic font style"</dd> | |||
* <dt> &"-,Bold Italic" </dt> <dd> code for "bold italic font style"</dd> | |||
* <dt> &O </dt> <dd> code for "outline style"</dd> | |||
* <dt> &H </dt> <dd> code for "shadow style"</dd> | |||
* <dt>&L</dt> | |||
* <dd>code for "left section" (there are three header / footer locations, | |||
* "left", "center", and "right"). When two or more occurrences of this section | |||
* marker exist, the contents from all markers are concatenated, in the order of | |||
* appearance, and placed into the left section.</dd> | |||
* <dt>&P</dt> | |||
* <dd>code for "current page #"</dd> | |||
* <dt>&N</dt> | |||
* <dd>code for "total pages"</dd> | |||
* <dt>&font size</dt> | |||
* <dd>code for "text font size", where font size is a font size in points.</dd> | |||
* <dt>&K</dt> | |||
* <dd>code for "text font color" RGB Color is specified as RRGGBB Theme Color | |||
* is specifed as TTSNN where TT is the theme color Id, S is either "+" or "-" | |||
* of the tint/shade value, NN is the tint/shade value.</dd> | |||
* <dt>&S</dt> | |||
* <dd>code for "text strikethrough" on / off</dd> | |||
* <dt>&X</dt> | |||
* <dd>code for "text super script" on / off</dd> | |||
* <dt>&Y</dt> | |||
* <dd>code for "text subscript" on / off</dd> | |||
* <dt>&C</dt> | |||
* <dd>code for "center section". When two or more occurrences of this section | |||
* marker exist, the contents from all markers are concatenated, in the order of | |||
* appearance, and placed into the center section. SpreadsheetML Reference | |||
* Material - Worksheets 1966</dd> | |||
* <dt>&D</dt> | |||
* <dd>code for "date"</dd> | |||
* <dt>&T</dt> | |||
* <dd>code for "time"</dd> | |||
* <dt>&G</dt> | |||
* <dd>code for "picture as background"</dd> | |||
* <dt>&U</dt> | |||
* <dd>code for "text single underline"</dd> | |||
* <dt>&E</dt> | |||
* <dd>code for "double underline"</dd> | |||
* <dt>&R</dt> | |||
* <dd>code for "right section". When two or more occurrences of this section | |||
* marker exist, the contents from all markers are concatenated, in the order of | |||
* appearance, and placed into the right section.</dd> | |||
* <dt>&Z</dt> | |||
* <dd>code for "this workbook's file path"</dd> | |||
* <dt>&F</dt> | |||
* <dd>code for "this workbook's file name"</dd> | |||
* <dt>&A</dt> | |||
* <dd>code for "sheet tab name"</dd> | |||
* <dt>&+</dt> | |||
* <dd>code for add to page #.</dd> | |||
* <dt>&-</dt> | |||
* <dd>code for subtract from page #.</dd> | |||
* <dt>&"font name,font type" - code for "text font name" and "text font type", | |||
* where font name and font type are strings specifying the name and type of the | |||
* font, separated by a comma. When a hyphen appears in font name, it means | |||
* "none specified". Both of font name and font type can be localized | |||
* values.</dd> | |||
* <dt>&"-,Bold"</dt> | |||
* <dd>code for "bold font style"</dd> | |||
* <dt>&B</dt> | |||
* <dd>also means "bold font style"</dd> | |||
* <dt>&"-,Regular"</dt> | |||
* <dd>code for "regular font style"</dd> | |||
* <dt>&"-,Italic"</dt> | |||
* <dd>code for "italic font style"</dd> | |||
* <dt>&I</dt> | |||
* <dd>also means "italic font style"</dd> | |||
* <dt>&"-,Bold Italic"</dt> | |||
* <dd>code for "bold italic font style"</dd> | |||
* <dt>&O</dt> | |||
* <dd>code for "outline style"</dd> | |||
* <dt>&H</dt> | |||
* <dd>code for "shadow style"</dd> | |||
* </dl> | |||
* | |||
* | |||
* | |||
* | |||
*/ | |||
public abstract class XSSFHeaderFooter implements HeaderFooter { | |||
private HeaderFooterHelper helper; | |||
private CTHeaderFooter headerFooter; | |||
private HeaderFooterHelper helper; | |||
private CTHeaderFooter headerFooter; | |||
private boolean stripFields = false; | |||
/** | |||
* Create an instance of XSSFHeaderFooter from the supplied XML bean | |||
* | |||
* @param headerFooter | |||
*/ | |||
public XSSFHeaderFooter(CTHeaderFooter headerFooter) { | |||
this.headerFooter = headerFooter; | |||
this.helper = new HeaderFooterHelper(); | |||
} | |||
/** | |||
* Returns the underlying CTHeaderFooter xml bean | |||
* | |||
* @return the underlying CTHeaderFooter xml bean | |||
*/ | |||
public CTHeaderFooter getHeaderFooter() { | |||
return this.headerFooter; | |||
} | |||
public String getValue() { | |||
String value = getText(); | |||
if(value == null) | |||
return ""; | |||
return value; | |||
} | |||
public XSSFHeaderFooter(CTHeaderFooter headerFooter) { | |||
this.headerFooter = headerFooter; | |||
this.helper = new HeaderFooterHelper(); | |||
} | |||
/** | |||
* Returns the underlying CTHeaderFooter xml bean | |||
* | |||
* @return the underlying CTHeaderFooter xml bean | |||
*/ | |||
public CTHeaderFooter getHeaderFooter() { | |||
return this.headerFooter; | |||
} | |||
public String getValue() { | |||
String value = getText(); | |||
if (value == null) | |||
return ""; | |||
return value; | |||
} | |||
/** | |||
* Are fields currently being stripped from | |||
* the text that this {@link XSSFHeaderFooter} returns? | |||
* Default is false, but can be changed | |||
* Are fields currently being stripped from the text that this | |||
* {@link XSSFHeaderFooter} returns? Default is false, but can be changed | |||
*/ | |||
public boolean areFieldsStripped() { | |||
return stripFields; | |||
} | |||
/** | |||
* Should fields (eg macros) be stripped from | |||
* the text that this class returns? | |||
* Default is not to strip. | |||
* Should fields (eg macros) be stripped from the text that this class | |||
* returns? Default is not to strip. | |||
* | |||
* @param stripFields | |||
*/ | |||
public void setAreFieldsStripped(boolean stripFields) { | |||
@@ -138,69 +170,66 @@ public abstract class XSSFHeaderFooter implements HeaderFooter { | |||
} | |||
/** | |||
* Removes any fields (eg macros, page markers etc) | |||
* from the string. | |||
* Normally used to make some text suitable for showing | |||
* to humans, and the resultant text should not normally | |||
* be saved back into the document! | |||
* Removes any fields (eg macros, page markers etc) from the string. | |||
* Normally used to make some text suitable for showing to humans, and the | |||
* resultant text should not normally be saved back into the document! | |||
*/ | |||
public static String stripFields(String text) { | |||
return org.apache.poi.hssf.usermodel.HeaderFooter.stripFields(text); | |||
} | |||
public abstract String getText(); | |||
protected abstract void setText(String text); | |||
/** | |||
* get the text representing the center part of this element | |||
*/ | |||
public String getCenter() { | |||
String text = helper.getCenterSection(getText()); | |||
if(stripFields) | |||
return stripFields(text); | |||
return text; | |||
} | |||
/** | |||
* get the text representing the left part of this element | |||
*/ | |||
public String getLeft() { | |||
String text = helper.getLeftSection(getText()); | |||
if(stripFields) | |||
return stripFields(text); | |||
return text; | |||
} | |||
/** | |||
* get the text representing the right part of this element | |||
*/ | |||
public String getRight() { | |||
String text = helper.getRightSection(getText()); | |||
if(stripFields) | |||
return stripFields(text); | |||
return text; | |||
} | |||
/** | |||
* set a centered string value for this element | |||
*/ | |||
public void setCenter(String newCenter) { | |||
setText(helper.setCenterSection(getText(), newCenter)); | |||
} | |||
/** | |||
* set a left string value for this element | |||
*/ | |||
public void setLeft(String newLeft) { | |||
setText(helper.setLeftSection(getText(), newLeft)); | |||
} | |||
/** | |||
* set a right string value for this element | |||
*/ | |||
public void setRight(String newRight) { | |||
setText(helper.setRightSection(getText(), newRight)); | |||
} | |||
public abstract String getText(); | |||
protected abstract void setText(String text); | |||
/** | |||
* get the text representing the center part of this element | |||
*/ | |||
public String getCenter() { | |||
String text = helper.getCenterSection(getText()); | |||
if (stripFields) | |||
return stripFields(text); | |||
return text; | |||
} | |||
/** | |||
* get the text representing the left part of this element | |||
*/ | |||
public String getLeft() { | |||
String text = helper.getLeftSection(getText()); | |||
if (stripFields) | |||
return stripFields(text); | |||
return text; | |||
} | |||
/** | |||
* get the text representing the right part of this element | |||
*/ | |||
public String getRight() { | |||
String text = helper.getRightSection(getText()); | |||
if (stripFields) | |||
return stripFields(text); | |||
return text; | |||
} | |||
/** | |||
* set a centered string value for this element | |||
*/ | |||
public void setCenter(String newCenter) { | |||
setText(helper.setCenterSection(getText(), newCenter)); | |||
} | |||
/** | |||
* set a left string value for this element | |||
*/ | |||
public void setLeft(String newLeft) { | |||
setText(helper.setLeftSection(getText(), newLeft)); | |||
} | |||
/** | |||
* set a right string value for this element | |||
*/ | |||
public void setRight(String newRight) { | |||
setText(helper.setRightSection(getText(), newRight)); | |||
} | |||
} |
@@ -17,7 +17,6 @@ | |||
package org.apache.poi.openxml4j.opc; | |||
import java.io.ByteArrayInputStream; | |||
import java.io.ByteArrayOutputStream; | |||
import java.io.File; | |||
import java.io.FileInputStream; | |||
@@ -37,8 +36,6 @@ import org.apache.poi.openxml4j.exceptions.InvalidFormatException; | |||
import org.apache.poi.openxml4j.opc.internal.ContentTypeManager; | |||
import org.apache.poi.openxml4j.opc.internal.FileHelper; | |||
import org.apache.poi.util.TempFile; | |||
import org.apache.poi.util.IOUtils; | |||
import org.apache.poi.util.POILogger; | |||
import org.dom4j.Document; | |||
import org.dom4j.DocumentHelper; | |||
import org.dom4j.Element; | |||
@@ -64,19 +61,19 @@ public final class TestPackage extends TestCase { | |||
//ZipFileAssert.assertEquals(originalFile, targetFile); | |||
assertTrue(targetFile.delete()); | |||
} | |||
/** | |||
* Test that when we create a new Package, we give it | |||
* the correct default content types | |||
*/ | |||
public void testCreateGetsContentTypes() throws Exception { | |||
File targetFile = OpenXML4JTestDataSamples.getOutputFile("TestCreatePackageTMP.docx"); | |||
// Zap the target file, in case of an earlier run | |||
if(targetFile.exists()) targetFile.delete(); | |||
OPCPackage pkg = OPCPackage.create(targetFile); | |||
// Check it has content types for rels and xml | |||
ContentTypeManager ctm = getContentTypeManager(pkg); | |||
assertEquals( | |||
@@ -108,7 +105,7 @@ public final class TestPackage extends TestCase { | |||
// Zap the target file, in case of an earlier run | |||
if(targetFile.exists()) targetFile.delete(); | |||
// Create a package | |||
OPCPackage pkg = OPCPackage.create(targetFile); | |||
PackagePartName corePartName = PackagingURIHelper | |||
@@ -142,7 +139,7 @@ public final class TestPackage extends TestCase { | |||
//ZipFileAssert.assertEquals(expectedFile, targetFile); | |||
assertTrue(targetFile.delete()); | |||
} | |||
/** | |||
* Tests that we can create a new package, add a core | |||
* document and another part, save and re-load and | |||
@@ -151,7 +148,7 @@ public final class TestPackage extends TestCase { | |||
public void testCreatePackageWithCoreDocument() throws Exception { | |||
ByteArrayOutputStream baos = new ByteArrayOutputStream(); | |||
OPCPackage pkg = OPCPackage.create(baos); | |||
// Add a core document | |||
PackagePartName corePartName = PackagingURIHelper.createPartName("/xl/workbook.xml"); | |||
// Create main part relationship | |||
@@ -162,7 +159,7 @@ public final class TestPackage extends TestCase { | |||
OutputStream coreOut = corePart.getOutputStream(); | |||
coreOut.write("<dummy-xml />".getBytes()); | |||
coreOut.close(); | |||
// And another bit | |||
PackagePartName sheetPartName = PackagingURIHelper.createPartName("/xl/worksheets/sheet1.xml"); | |||
PackageRelationship rel = | |||
@@ -184,8 +181,8 @@ public final class TestPackage extends TestCase { | |||
assertEquals("/", coreRel.getSourceURI().toString()); | |||
assertEquals("/xl/workbook.xml", coreRel.getTargetURI().toString()); | |||
assertNotNull(pkg.getPart(coreRel)); | |||
// Save and re-load | |||
pkg.close(); | |||
File tmp = TempFile.createTempFile("testCreatePackageWithCoreDocument", ".zip"); | |||
@@ -290,7 +287,7 @@ public final class TestPackage extends TestCase { | |||
//ZipFileAssert.assertEquals(expectedFile, targetFile); | |||
assertTrue(targetFile.delete()); | |||
} | |||
/** | |||
* Checks that we can write a package to a simple | |||
* OutputStream, in addition to the normal writing | |||
@@ -318,15 +315,15 @@ public final class TestPackage extends TestCase { | |||
*/ | |||
public void testOpenFromInputStream() throws Exception { | |||
String originalFile = OpenXML4JTestDataSamples.getSampleFileName("TestPackageCommon.docx"); | |||
FileInputStream finp = new FileInputStream(originalFile); | |||
OPCPackage p = OPCPackage.open(finp); | |||
assertNotNull(p); | |||
assertNotNull(p.getRelationships()); | |||
assertEquals(12, p.getParts().size()); | |||
// Check it has the usual bits | |||
assertTrue(p.hasRelationships()); | |||
assertTrue(p.containPart(PackagingURIHelper.createPartName("/_rels/.rels"))); | |||
@@ -407,7 +404,7 @@ public final class TestPackage extends TestCase { | |||
// Don't save modifications | |||
p.revert(); | |||
} | |||
public void testDeletePartRecursive() throws InvalidFormatException { | |||
TreeMap<PackagePartName, String> expectedValues; | |||
TreeMap<PackagePartName, String> values; | |||
@@ -445,7 +442,7 @@ public final class TestPackage extends TestCase { | |||
// Don't save modifications | |||
p.revert(); | |||
} | |||
private static ContentTypeManager getContentTypeManager(OPCPackage pkg) throws Exception { | |||
Field f = OPCPackage.class.getDeclaredField("contentTypeManager"); | |||
f.setAccessible(true); |
@@ -24,7 +24,6 @@ import junit.framework.TestCase; | |||
import org.apache.poi.ss.usermodel.Cell; | |||
import org.apache.poi.ss.usermodel.CellStyle; | |||
import org.apache.poi.ss.usermodel.PictureData; | |||
import org.apache.poi.ss.usermodel.Row; | |||
import org.apache.poi.ss.usermodel.Sheet; | |||
import org.apache.poi.xssf.usermodel.XSSFWorkbook; | |||
@@ -35,8 +34,8 @@ public class TestLoadSaveXSSF extends TestCase { | |||
String filename; | |||
protected void setUp() throws Exception { | |||
super.setUp(); | |||
protected void setUp() { | |||
System.setProperty("org.apache.poi.util.POILogger", org.apache.poi.util.CommonsLogger.class.getName()); | |||
filename = System.getProperty("XSSF.testdata.path"); | |||
if (filename == null) { | |||
@@ -52,12 +51,12 @@ public class TestLoadSaveXSSF extends TestCase { | |||
Row row = sheet.getRow(0); | |||
Cell cell = row.getCell((short) 1); | |||
assertNotNull(cell); | |||
assertEquals(111.0, cell.getNumericCellValue()); | |||
assertEquals(111.0, cell.getNumericCellValue(), 0.0); | |||
cell = row.getCell((short) 0); | |||
assertEquals("Lorem", cell.getRichStringCellValue().getString()); | |||
} | |||
// TODO filename string hard coded in XSSFWorkbook constructor in order to make ant test-ooxml target be successfull. | |||
// TODO filename string hard coded in XSSFWorkbook constructor in order to make ant test-ooxml target be successful. | |||
public void testLoadStyles() throws Exception { | |||
XSSFWorkbook workbook = new XSSFWorkbook(new File(filename, "styles.xlsx").getAbsolutePath()); | |||
Sheet sheet = workbook.getSheetAt(0); | |||
@@ -67,11 +66,10 @@ public class TestLoadSaveXSSF extends TestCase { | |||
// assertNotNull(style); | |||
} | |||
// TODO filename string hard coded in XSSFWorkbook constructor in order to make ant test-ooxml target be successfull. | |||
// TODO filename string hard coded in XSSFWorkbook constructor in order to make ant test-ooxml target be successful. | |||
public void testLoadPictures() throws Exception { | |||
XSSFWorkbook workbook = new XSSFWorkbook(new File(filename, "picture.xlsx").getAbsolutePath()); | |||
List<XSSFPictureData> pictures = workbook.getAllPictures(); | |||
assertEquals(1, pictures.size()); | |||
} | |||
} |
@@ -17,21 +17,17 @@ | |||
package org.apache.poi.xssf.usermodel; | |||
import java.io.File; | |||
import java.util.List; | |||
import junit.framework.TestCase; | |||
import org.apache.poi.openxml4j.opc.OPCPackage; | |||
import org.apache.poi.POIXMLDocumentPart; | |||
import org.apache.poi.openxml4j.opc.OPCPackage; | |||
import org.apache.poi.openxml4j.opc.PackagePart; | |||
import org.apache.poi.openxml4j.opc.PackagingURIHelper; | |||
import org.apache.poi.xssf.XSSFTestDataSamples; | |||
import org.apache.poi.xssf.XSSFITestDataProvider; | |||
import org.apache.poi.ss.usermodel.BaseTestBugzillaIssues; | |||
import org.apache.poi.POIXMLDocumentPart; | |||
import org.apache.poi.xssf.XSSFITestDataProvider; | |||
import org.apache.poi.xssf.XSSFTestDataSamples; | |||
public class TestXSSFBugs extends BaseTestBugzillaIssues { | |||
public final class TestXSSFBugs extends BaseTestBugzillaIssues { | |||
@Override | |||
protected XSSFITestDataProvider getTestDataProvider(){ | |||
return XSSFITestDataProvider.getInstance(); |
@@ -17,29 +17,16 @@ | |||
package org.apache.poi.xssf.usermodel; | |||
import java.util.Calendar; | |||
import java.util.Date; | |||
import java.util.Map; | |||
import junit.framework.TestCase; | |||
import org.apache.poi.hssf.usermodel.HSSFCell; | |||
import org.apache.poi.hssf.usermodel.HSSFRichTextString; | |||
import org.apache.poi.hssf.usermodel.HSSFWorkbook; | |||
import org.apache.poi.ss.usermodel.*; | |||
import org.apache.poi.ss.ITestDataProvider; | |||
import org.apache.poi.xssf.XSSFTestDataSamples; | |||
import org.apache.poi.ss.usermodel.BaseTestDataFormat; | |||
import org.apache.poi.xssf.XSSFITestDataProvider; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellType; | |||
/** | |||
* Tests for {@link XSSFDataFormat} | |||
* | |||
*/ | |||
public final class TestXSSFDataFormat extends BaseTestDataFormat { | |||
@Override | |||
protected ITestDataProvider getTestDataProvider(){ | |||
return XSSFITestDataProvider.getInstance(); |
@@ -17,12 +17,8 @@ | |||
package org.apache.poi.xssf.usermodel; | |||
import junit.framework.TestCase; | |||
import org.apache.poi.ss.usermodel.*; | |||
import org.apache.poi.xssf.XSSFTestDataSamples; | |||
import org.apache.poi.xssf.XSSFITestDataProvider; | |||
import org.apache.poi.xssf.usermodel.XSSFColor; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBooleanProperty; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTColor; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFont; | |||
@@ -38,14 +34,14 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.STVerticalAlignRun; | |||
public final class TestXSSFFont extends BaseTestFont{ | |||
@Override | |||
protected XSSFITestDataProvider getTestDataProvider(){ | |||
return XSSFITestDataProvider.getInstance(); | |||
} | |||
@Override | |||
protected XSSFITestDataProvider getTestDataProvider() { | |||
return XSSFITestDataProvider.getInstance(); | |||
} | |||
public void testDefaultFont() { | |||
baseTestDefaultFont("Calibri", (short)220, IndexedColors.BLACK.getIndex()); | |||
} | |||
public void testDefaultFont() { | |||
baseTestDefaultFont("Calibri", (short) 220, IndexedColors.BLACK.getIndex()); | |||
} | |||
public void testConstructor() { | |||
XSSFFont xssfFont=new XSSFFont(); | |||
@@ -160,7 +156,7 @@ public final class TestXSSFFont extends BaseTestFont{ | |||
xssfFont.setUnderline(Font.U_DOUBLE); | |||
assertEquals(ctFont.getUArray().length,1); | |||
assertEquals(STUnderlineValues.DOUBLE,ctFont.getUArray(0).getVal()); | |||
xssfFont.setUnderline(FontUnderline.DOUBLE_ACCOUNTING); | |||
assertEquals(ctFont.getUArray().length,1); | |||
assertEquals(STUnderlineValues.DOUBLE_ACCOUNTING,ctFont.getUArray(0).getVal()); |
@@ -17,7 +17,6 @@ | |||
package org.apache.poi.xssf.usermodel; | |||
import junit.framework.TestCase; | |||
import org.apache.poi.xssf.XSSFTestDataSamples; | |||
import org.apache.poi.xssf.XSSFITestDataProvider; | |||
import org.apache.poi.ss.usermodel.BaseTestNamedRange; | |||
@@ -37,7 +36,7 @@ public final class TestXSSFName extends BaseTestNamedRange { | |||
// First test that setting RR&C for same sheet more than once only creates a | |||
// single Print_Titles built-in record | |||
XSSFWorkbook wb = getTestDataProvider().createWorkbook(); | |||
XSSFSheet sheet = wb.createSheet("First Sheet"); | |||
wb.createSheet("First Sheet"); | |||
wb.setRepeatingRowsAndColumns(0, -1, -1, -1, -1); | |||
@@ -77,7 +76,7 @@ public final class TestXSSFName extends BaseTestNamedRange { | |||
// check that setting RR&C on a second sheet causes a new Print_Titles built-in | |||
// name to be created | |||
sheet = nwb.createSheet("SecondSheet"); | |||
nwb.createSheet("SecondSheet"); | |||
nwb.setRepeatingRowsAndColumns(1, 1, 2, 0, 0); | |||
assertEquals(2, nwb.getNumberOfNames()); | |||
@@ -88,6 +87,4 @@ public final class TestXSSFName extends BaseTestNamedRange { | |||
nwb.setRepeatingRowsAndColumns(1, -1, -1, -1, -1); | |||
} | |||
} |
@@ -17,7 +17,6 @@ | |||
package org.apache.poi.xssf.usermodel; | |||
import junit.framework.TestCase; | |||
import org.apache.poi.ss.usermodel.ClientAnchor; | |||
import org.apache.poi.ss.usermodel.BaseTestPicture; | |||
import org.apache.poi.xssf.XSSFITestDataProvider; |
@@ -17,14 +17,12 @@ | |||
package org.apache.poi.xssf.usermodel; | |||
import java.util.Arrays; | |||
import java.util.List; | |||
import junit.framework.TestCase; | |||
import org.apache.poi.xssf.XSSFTestDataSamples; | |||
import org.apache.poi.POIXMLDocumentPart; | |||
import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTDrawing; | |||
import java.util.List; | |||
import java.util.Arrays; | |||
import java.io.IOException; | |||
import org.apache.poi.xssf.XSSFTestDataSamples; | |||
/** | |||
* @author Yegor Kozlov |
@@ -187,13 +187,13 @@ public class TestXSSFPrintSetup extends TestCase { | |||
pMargins.setHeader(1.5); | |||
pMargins.setFooter(2); | |||
XSSFPrintSetup printSetup = new XSSFPrintSetup(worksheet); | |||
assertEquals(1.5, printSetup.getHeaderMargin()); | |||
assertEquals(2.0, printSetup.getFooterMargin()); | |||
assertEquals(1.5, printSetup.getHeaderMargin(), 0.0); | |||
assertEquals(2.0, printSetup.getFooterMargin(), 0.0); | |||
printSetup.setHeaderMargin(5); | |||
printSetup.setFooterMargin(3.5); | |||
assertEquals(5.0, pMargins.getHeader()); | |||
assertEquals(3.5, pMargins.getFooter()); | |||
assertEquals(5.0, pMargins.getHeader(), 0.0); | |||
assertEquals(3.5, pMargins.getFooter(), 0.0); | |||
} | |||
public void testSetGetCopies() { |
@@ -17,23 +17,9 @@ | |||
package org.apache.poi.xssf.usermodel; | |||
import java.io.*; | |||
import java.util.ArrayList; | |||
import java.util.Calendar; | |||
import java.util.Date; | |||
import junit.framework.TestCase; | |||
import org.apache.poi.ss.usermodel.Cell; | |||
import org.apache.poi.ss.usermodel.CellStyle; | |||
import org.apache.poi.ss.usermodel.Comment; | |||
import org.apache.poi.ss.usermodel.CreationHelper; | |||
import org.apache.poi.ss.usermodel.Row; | |||
import org.apache.poi.ss.usermodel.Sheet; | |||
import org.apache.poi.ss.usermodel.Workbook; | |||
import org.apache.poi.xssf.model.CommentsTable; | |||
import org.apache.xmlbeans.XmlOptions; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.*; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst; | |||
/** | |||
* Tests functionality of the XSSFRichTextRun object | |||
@@ -42,7 +28,7 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.*; | |||
*/ | |||
public final class TestXSSFRichTextString extends TestCase { | |||
public void testCreate() throws Exception { | |||
public void testCreate() { | |||
XSSFRichTextString rt = new XSSFRichTextString("Apache POI"); | |||
assertEquals("Apache POI", rt.getString()); | |||
@@ -59,7 +45,7 @@ public final class TestXSSFRichTextString extends TestCase { | |||
} | |||
public void testApplyFont() throws Exception { | |||
public void testApplyFont() { | |||
XSSFRichTextString rt = new XSSFRichTextString(); | |||
rt.append("123"); | |||
@@ -85,7 +71,7 @@ public final class TestXSSFRichTextString extends TestCase { | |||
assertEquals(1, rt.getLengthOfFormattingRun(3)); | |||
} | |||
public void testClearFormatting() throws Exception { | |||
public void testClearFormatting() { | |||
XSSFRichTextString rt = new XSSFRichTextString("Apache POI"); | |||
assertEquals("Apache POI", rt.getString()); | |||
@@ -105,10 +91,9 @@ public final class TestXSSFRichTextString extends TestCase { | |||
rt.clearFormatting(); | |||
assertEquals("Apache POI", rt.getString()); | |||
assertEquals(0, rt.numFormattingRuns()); | |||
} | |||
public void testGetFonts() throws Exception { | |||
public void testGetFonts() { | |||
XSSFRichTextString rt = new XSSFRichTextString(); | |||
@@ -129,6 +114,5 @@ public final class TestXSSFRichTextString extends TestCase { | |||
XSSFFont font2$ = rt.getFontOfFormattingRun(1); | |||
assertEquals(font2.getBold(), font2$.getBold()); | |||
assertEquals(font2.getFontName(), font2$.getFontName()); | |||
} | |||
} |
@@ -17,21 +17,9 @@ | |||
package org.apache.poi.xssf.usermodel; | |||
import java.io.FileNotFoundException; | |||
import java.io.FileOutputStream; | |||
import java.util.Iterator; | |||
import junit.framework.TestCase; | |||
import org.apache.poi.ss.usermodel.*; | |||
import org.apache.poi.ss.SpreadsheetVersion; | |||
import org.apache.poi.xssf.model.SharedStringsTable; | |||
import org.apache.poi.xssf.XSSFTestDataSamples; | |||
import org.apache.poi.ss.usermodel.BaseTestRow; | |||
import org.apache.poi.xssf.XSSFITestDataProvider; | |||
import org.apache.poi.hssf.usermodel.HSSFSheet; | |||
import org.apache.poi.hssf.usermodel.HSSFRow; | |||
import org.apache.poi.hssf.usermodel.HSSFWorkbook; | |||
import org.apache.poi.hssf.usermodel.HSSFCell; | |||
/** | |||
* Tests for XSSFRow |
@@ -18,19 +18,23 @@ | |||
package org.apache.poi.xssf.usermodel; | |||
import java.io.File; | |||
import java.util.Iterator; | |||
import junit.framework.TestCase; | |||
import org.apache.poi.ss.usermodel.*; | |||
import org.apache.poi.ss.usermodel.BaseTestSheet; | |||
import org.apache.poi.ss.usermodel.Cell; | |||
import org.apache.poi.ss.usermodel.Workbook; | |||
import org.apache.poi.ss.util.CellRangeAddress; | |||
import org.apache.poi.xssf.XSSFITestDataProvider; | |||
import org.apache.poi.xssf.XSSFTestDataSamples; | |||
import org.apache.poi.xssf.model.CommentsTable; | |||
import org.apache.poi.xssf.model.StylesTable; | |||
import org.apache.poi.xssf.model.CalculationChain; | |||
import org.apache.poi.xssf.usermodel.helpers.ColumnHelper; | |||
import org.apache.poi.xssf.XSSFTestDataSamples; | |||
import org.apache.poi.xssf.XSSFITestDataProvider; | |||
import org.apache.poi.hssf.usermodel.HSSFWorkbook; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.*; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTComments; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTXf; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPane; | |||
public class TestXSSFSheet extends BaseTestSheet { | |||
@@ -205,14 +209,14 @@ public class TestXSSFSheet extends BaseTestSheet { | |||
CTWorksheet ctWorksheet = sheet.getCTWorksheet(); | |||
sheet.createFreezePane(2, 4); | |||
assertEquals((double) 2, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getXSplit()); | |||
assertEquals(2.0, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getXSplit(), 0.0); | |||
assertEquals(STPane.BOTTOM_RIGHT, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getActivePane()); | |||
sheet.createFreezePane(3, 6, 10, 10); | |||
assertEquals((double) 3, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getXSplit()); | |||
assertEquals(3.0, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getXSplit(), 0.0); | |||
// assertEquals(10, sheet.getTopRow()); | |||
// assertEquals(10, sheet.getLeftCol()); | |||
sheet.createSplitPane(4, 8, 12, 12, 1); | |||
assertEquals((double) 8, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getYSplit()); | |||
assertEquals(8.0, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getYSplit(), 0.0); | |||
assertEquals(STPane.BOTTOM_RIGHT, ctWorksheet.getSheetViews().getSheetViewArray(0).getPane().getActivePane()); | |||
} | |||
@@ -375,15 +379,15 @@ public class TestXSSFSheet extends BaseTestSheet { | |||
public void testSetColumnGroupCollapsed(){ | |||
Workbook wb = new XSSFWorkbook(); | |||
XSSFSheet sheet1 =(XSSFSheet) wb.createSheet(); | |||
CTCols cols=sheet1.getCTWorksheet().getColsArray(0); | |||
assertEquals(0,cols.sizeOfColArray()); | |||
sheet1.groupColumn( (short)4, (short)7 ); | |||
sheet1.groupColumn( (short)9, (short)12 ); | |||
assertEquals(2,cols.sizeOfColArray()); | |||
assertEquals(false,cols.getColArray(0).isSetHidden()); | |||
assertEquals(true, cols.getColArray(0).isSetCollapsed()); | |||
assertEquals(5, cols.getColArray(0).getMin()); // 1 based | |||
@@ -395,7 +399,7 @@ public class TestXSSFSheet extends BaseTestSheet { | |||
sheet1.groupColumn( (short)10, (short)11 ); | |||
assertEquals(4,cols.sizeOfColArray()); | |||
assertEquals(false,cols.getColArray(0).isSetHidden()); | |||
assertEquals(true, cols.getColArray(0).isSetCollapsed()); | |||
assertEquals(5, cols.getColArray(0).getMin()); // 1 based | |||
@@ -412,11 +416,11 @@ public class TestXSSFSheet extends BaseTestSheet { | |||
assertEquals(true, cols.getColArray(3).isSetCollapsed()); | |||
assertEquals(13, cols.getColArray(3).getMin()); // 1 based | |||
assertEquals(13, cols.getColArray(3).getMax()); // 1 based | |||
// collapse columns - 1 | |||
sheet1.setColumnGroupCollapsed( (short)5, true ); | |||
assertEquals(5,cols.sizeOfColArray()); | |||
assertEquals(true, cols.getColArray(0).isSetHidden()); | |||
assertEquals(true, cols.getColArray(0).isSetCollapsed()); | |||
assertEquals(5, cols.getColArray(0).getMin()); // 1 based | |||
@@ -501,7 +505,7 @@ public class TestXSSFSheet extends BaseTestSheet { | |||
//outline level 2: the line under ==> collapsed==True | |||
assertEquals(2,cols.getColArray(3).getOutlineLevel()); | |||
assertEquals(true,cols.getColArray(4).isSetCollapsed()); | |||
assertEquals(false,cols.getColArray(0).isSetHidden()); | |||
assertEquals(true, cols.getColArray(0).isSetCollapsed()); | |||
assertEquals(5, cols.getColArray(0).getMin()); // 1 based | |||
@@ -610,7 +614,7 @@ public class TestXSSFSheet extends BaseTestSheet { | |||
sheet1.groupRow( 7, 14 ); | |||
sheet1.groupRow( 16, 19 ); | |||
assertEquals(14,sheet1.getPhysicalNumberOfRows()); | |||
assertEquals(14,sheet1.getPhysicalNumberOfRows()); | |||
assertEquals(false,sheet1.getRow(6).getCTRow().isSetCollapsed()); | |||
assertEquals(false,sheet1.getRow(6).getCTRow().isSetHidden()); | |||
assertEquals(false,sheet1.getRow(7).getCTRow().isSetCollapsed()); | |||
@@ -625,7 +629,7 @@ public class TestXSSFSheet extends BaseTestSheet { | |||
assertEquals(false,sheet1.getRow(18).getCTRow().isSetHidden()); | |||
//collapsed | |||
sheet1.setRowGroupCollapsed( 7, true ); | |||
sheet1.setRowGroupCollapsed( 7, true ); | |||
assertEquals(false,sheet1.getRow(6).getCTRow().isSetCollapsed()); | |||
assertEquals(false,sheet1.getRow(6).getCTRow().isSetHidden()); | |||
@@ -698,7 +702,7 @@ public class TestXSSFSheet extends BaseTestSheet { | |||
// XML is 1 based, POI is 0 based | |||
assertEquals(2, col.getMin()); | |||
assertEquals(2, col.getMax()); | |||
assertEquals(22.0, col.getWidth()); | |||
assertEquals(22.0, col.getWidth(), 0.0); | |||
// Now set another | |||
sheet.setColumnWidth(3, 33 * 256); | |||
@@ -711,12 +715,11 @@ public class TestXSSFSheet extends BaseTestSheet { | |||
col = cols.getColArray(0); | |||
assertEquals(2, col.getMin()); // POI 1 | |||
assertEquals(2, col.getMax()); | |||
assertEquals(22.0, col.getWidth()); | |||
assertEquals(22.0, col.getWidth(), 0.0); | |||
col = cols.getColArray(1); | |||
assertEquals(4, col.getMin()); // POI 3 | |||
assertEquals(4, col.getMax()); | |||
assertEquals(33.0, col.getWidth()); | |||
assertEquals(33.0, col.getWidth(), 0.0); | |||
} | |||
} |
@@ -20,31 +20,26 @@ package org.apache.poi.xssf.usermodel; | |||
import java.io.File; | |||
import java.io.FileOutputStream; | |||
import java.io.OutputStream; | |||
import java.util.zip.CRC32; | |||
import java.util.List; | |||
import java.util.zip.CRC32; | |||
import junit.framework.TestCase; | |||
import org.apache.poi.POIXMLProperties; | |||
import org.apache.poi.hssf.HSSFTestDataSamples; | |||
import org.apache.poi.ss.usermodel.*; | |||
import org.apache.poi.ss.util.CellRangeAddress; | |||
import org.apache.poi.xssf.XSSFTestDataSamples; | |||
import org.apache.poi.xssf.XSSFITestDataProvider; | |||
import org.apache.poi.xssf.model.StylesTable; | |||
import org.apache.poi.openxml4j.opc.*; | |||
import org.apache.poi.openxml4j.opc.internal.PackagePropertiesPart; | |||
import org.apache.poi.ss.usermodel.*; | |||
import org.apache.poi.util.TempFile; | |||
import org.apache.poi.POIXMLProperties; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook; | |||
import org.apache.poi.xssf.XSSFITestDataProvider; | |||
import org.apache.poi.xssf.XSSFTestDataSamples; | |||
import org.apache.poi.xssf.model.StylesTable; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbookPr; | |||
public final class TestXSSFWorkbook extends BaseTestWorkbook { | |||
@Override | |||
protected XSSFITestDataProvider getTestDataProvider(){ | |||
return XSSFITestDataProvider.getInstance(); | |||
} | |||
@Override | |||
protected XSSFITestDataProvider getTestDataProvider(){ | |||
return XSSFITestDataProvider.getInstance(); | |||
} | |||
/** | |||
@@ -53,94 +48,94 @@ public final class TestXSSFWorkbook extends BaseTestWorkbook { | |||
public void testSaveLoadNew() throws Exception { | |||
XSSFWorkbook workbook = new XSSFWorkbook(); | |||
//check that the default date system is set to 1900 | |||
CTWorkbookPr pr = workbook.getCTWorkbook().getWorkbookPr(); | |||
assertNotNull(pr); | |||
assertTrue(pr.isSetDate1904()); | |||
assertFalse("XSSF must use the 1900 date system", pr.getDate1904()); | |||
//check that the default date system is set to 1900 | |||
CTWorkbookPr pr = workbook.getCTWorkbook().getWorkbookPr(); | |||
assertNotNull(pr); | |||
assertTrue(pr.isSetDate1904()); | |||
assertFalse("XSSF must use the 1900 date system", pr.getDate1904()); | |||
Sheet sheet1 = workbook.createSheet("sheet1"); | |||
Sheet sheet1 = workbook.createSheet("sheet1"); | |||
Sheet sheet2 = workbook.createSheet("sheet2"); | |||
workbook.createSheet("sheet3"); | |||
RichTextString rts = workbook.getCreationHelper().createRichTextString("hello world"); | |||
sheet1.createRow(0).createCell((short)0).setCellValue(1.2); | |||
sheet1.createRow(1).createCell((short)0).setCellValue(rts); | |||
sheet2.createRow(0); | |||
assertEquals(0, workbook.getSheetAt(0).getFirstRowNum()); | |||
assertEquals(1, workbook.getSheetAt(0).getLastRowNum()); | |||
assertEquals(0, workbook.getSheetAt(1).getFirstRowNum()); | |||
assertEquals(0, workbook.getSheetAt(1).getLastRowNum()); | |||
assertEquals(0, workbook.getSheetAt(2).getFirstRowNum()); | |||
assertEquals(0, workbook.getSheetAt(2).getLastRowNum()); | |||
File file = TempFile.createTempFile("poi-", ".xlsx"); | |||
OutputStream out = new FileOutputStream(file); | |||
workbook.write(out); | |||
out.close(); | |||
// Check the package contains what we'd expect it to | |||
OPCPackage pkg = OPCPackage.open(file.toString()); | |||
PackagePart wbRelPart = | |||
PackagePart wbRelPart = | |||
pkg.getPart(PackagingURIHelper.createPartName("/xl/_rels/workbook.xml.rels")); | |||
assertNotNull(wbRelPart); | |||
assertTrue(wbRelPart.isRelationshipPart()); | |||
assertEquals(ContentTypes.RELATIONSHIPS_PART, wbRelPart.getContentType()); | |||
PackagePart wbPart = | |||
PackagePart wbPart = | |||
pkg.getPart(PackagingURIHelper.createPartName("/xl/workbook.xml")); | |||
// Links to the three sheets, shared strings and styles | |||
assertTrue(wbPart.hasRelationships()); | |||
assertEquals(5, wbPart.getRelationships().size()); | |||
// Load back the XSSFWorkbook | |||
workbook = new XSSFWorkbook(pkg); | |||
assertEquals(3, workbook.getNumberOfSheets()); | |||
assertNotNull(workbook.getSheetAt(0)); | |||
assertNotNull(workbook.getSheetAt(1)); | |||
assertNotNull(workbook.getSheetAt(2)); | |||
assertNotNull(workbook.getSharedStringSource()); | |||
assertNotNull(workbook.getStylesSource()); | |||
assertEquals(0, workbook.getSheetAt(0).getFirstRowNum()); | |||
assertEquals(1, workbook.getSheetAt(0).getLastRowNum()); | |||
assertEquals(0, workbook.getSheetAt(1).getFirstRowNum()); | |||
assertEquals(0, workbook.getSheetAt(1).getLastRowNum()); | |||
assertEquals(0, workbook.getSheetAt(2).getFirstRowNum()); | |||
assertEquals(0, workbook.getSheetAt(2).getLastRowNum()); | |||
sheet1 = workbook.getSheetAt(0); | |||
assertEquals(1.2, sheet1.getRow(0).getCell(0).getNumericCellValue(), 0.0001); | |||
assertEquals("hello world", sheet1.getRow(1).getCell(0).getRichStringCellValue().getString()); | |||
} | |||
public void testExisting() throws Exception { | |||
XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("Formatting.xlsx"); | |||
assertNotNull(workbook.getSharedStringSource()); | |||
assertNotNull(workbook.getStylesSource()); | |||
// And check a few low level bits too | |||
OPCPackage pkg = OPCPackage.open(HSSFTestDataSamples.openSampleFileStream("Formatting.xlsx")); | |||
PackagePart wbPart = | |||
PackagePart wbPart = | |||
pkg.getPart(PackagingURIHelper.createPartName("/xl/workbook.xml")); | |||
// Links to the three sheets, shared, styles and themes | |||
assertTrue(wbPart.hasRelationships()); | |||
assertEquals(6, wbPart.getRelationships().size()); | |||
} | |||
public void testGetCellStyleAt(){ | |||
XSSFWorkbook workbook = new XSSFWorkbook(); | |||
short i = 0; | |||
//get default style | |||
CellStyle cellStyleAt = workbook.getCellStyleAt(i); | |||
assertNotNull(cellStyleAt); | |||
//get custom style | |||
StylesTable styleSource = workbook.getStylesSource(); | |||
XSSFCellStyle customStyle = new XSSFCellStyle(styleSource); | |||
@@ -149,9 +144,9 @@ public final class TestXSSFWorkbook extends BaseTestWorkbook { | |||
customStyle.setFont(font); | |||
int x = styleSource.putStyle(customStyle); | |||
cellStyleAt = workbook.getCellStyleAt((short)x); | |||
assertNotNull(cellStyleAt); | |||
assertNotNull(cellStyleAt); | |||
} | |||
public void testGetFontAt(){ | |||
XSSFWorkbook workbook = new XSSFWorkbook(); | |||
StylesTable styleSource = workbook.getStylesSource(); | |||
@@ -159,7 +154,7 @@ public final class TestXSSFWorkbook extends BaseTestWorkbook { | |||
//get default font | |||
Font fontAt = workbook.getFontAt(i); | |||
assertNotNull(fontAt); | |||
//get customized font | |||
XSSFFont customFont = new XSSFFont(); | |||
customFont.setItalic(true); | |||
@@ -167,23 +162,23 @@ public final class TestXSSFWorkbook extends BaseTestWorkbook { | |||
fontAt = workbook.getFontAt((short)x); | |||
assertNotNull(fontAt); | |||
} | |||
public void testGetNumCellStyles(){ | |||
XSSFWorkbook workbook = new XSSFWorkbook(); | |||
short i = workbook.getNumCellStyles(); | |||
//get default cellStyles | |||
assertEquals(1, i); | |||
//get wrong value | |||
assertNotSame(2, i); | |||
assertNotSame(2, i); | |||
} | |||
public void testLoadSave() { | |||
XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("Formatting.xlsx"); | |||
assertEquals(3, workbook.getNumberOfSheets()); | |||
assertEquals("dd/mm/yyyy", workbook.getSheetAt(0).getRow(1).getCell(0).getRichStringCellValue().getString()); | |||
assertNotNull(workbook.getSharedStringSource()); | |||
assertNotNull(workbook.getStylesSource()); | |||
// Write out, and check | |||
// Load up again, check all still there | |||
XSSFWorkbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(workbook); | |||
@@ -191,7 +186,7 @@ public final class TestXSSFWorkbook extends BaseTestWorkbook { | |||
assertNotNull(wb2.getSheetAt(0)); | |||
assertNotNull(wb2.getSheetAt(1)); | |||
assertNotNull(wb2.getSheetAt(2)); | |||
assertEquals("dd/mm/yyyy", wb2.getSheetAt(0).getRow(1).getCell(0).getRichStringCellValue().getString()); | |||
assertEquals("yyyy/mm/dd", wb2.getSheetAt(0).getRow(2).getCell(0).getRichStringCellValue().getString()); | |||
assertEquals("yyyy-mm-dd", wb2.getSheetAt(0).getRow(3).getCell(0).getRichStringCellValue().getString()); | |||
@@ -199,14 +194,14 @@ public final class TestXSSFWorkbook extends BaseTestWorkbook { | |||
assertNotNull(wb2.getSharedStringSource()); | |||
assertNotNull(wb2.getStylesSource()); | |||
} | |||
public void testStyles() { | |||
XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("Formatting.xlsx"); | |||
StylesTable ss = workbook.getStylesSource(); | |||
assertNotNull(ss); | |||
StylesTable st = ss; | |||
// Has 8 number formats | |||
assertEquals(8, st._getNumberFormatSize()); | |||
// Has 2 fonts | |||
@@ -215,20 +210,20 @@ public final class TestXSSFWorkbook extends BaseTestWorkbook { | |||
assertEquals(2, st.getFills().size()); | |||
// Has 1 border | |||
assertEquals(1, st.getBorders().size()); | |||
// Add two more styles | |||
assertEquals(StylesTable.FIRST_CUSTOM_STYLE_ID + 8, | |||
assertEquals(StylesTable.FIRST_CUSTOM_STYLE_ID + 8, | |||
st.putNumberFormat("testFORMAT")); | |||
assertEquals(StylesTable.FIRST_CUSTOM_STYLE_ID + 8, | |||
assertEquals(StylesTable.FIRST_CUSTOM_STYLE_ID + 8, | |||
st.putNumberFormat("testFORMAT")); | |||
assertEquals(StylesTable.FIRST_CUSTOM_STYLE_ID + 9, | |||
assertEquals(StylesTable.FIRST_CUSTOM_STYLE_ID + 9, | |||
st.putNumberFormat("testFORMAT2")); | |||
assertEquals(10, st._getNumberFormatSize()); | |||
// Save, load back in again, and check | |||
workbook = XSSFTestDataSamples.writeOutAndReadBack(workbook); | |||
ss = workbook.getStylesSource(); | |||
assertNotNull(ss); | |||
@@ -238,77 +233,77 @@ public final class TestXSSFWorkbook extends BaseTestWorkbook { | |||
assertEquals(1, st.getBorders().size()); | |||
} | |||
public void testIncrementSheetId() throws Exception { | |||
XSSFWorkbook wb = getTestDataProvider().createWorkbook(); | |||
int sheetId = (int)wb.createSheet().sheet.getSheetId(); | |||
assertEquals(1, sheetId); | |||
sheetId = (int)wb.createSheet().sheet.getSheetId(); | |||
assertEquals(2, sheetId); | |||
//test file with gaps in the sheetId sequence | |||
wb = getTestDataProvider().openSampleWorkbook("47089.xlsm"); | |||
int lastSheetId = (int)wb.getSheetAt(wb.getNumberOfSheets() - 1).sheet.getSheetId(); | |||
sheetId = (int)wb.createSheet().sheet.getSheetId(); | |||
assertEquals(lastSheetId+1, sheetId); | |||
} | |||
/** | |||
* Test setting of core properties such as Title and Author | |||
*/ | |||
public void testWorkbookProperties() throws Exception { | |||
XSSFWorkbook workbook = new XSSFWorkbook(); | |||
POIXMLProperties props = workbook.getProperties(); | |||
assertNotNull(props); | |||
//the Application property must be set for new workbooks, see Bugzilla #47559 | |||
assertEquals("Apache POI", props.getExtendedProperties().getUnderlyingProperties().getApplication()); | |||
PackagePropertiesPart opcProps = props.getCoreProperties().getUnderlyingProperties(); | |||
assertNotNull(opcProps); | |||
opcProps.setTitleProperty("Testing Bugzilla #47460"); | |||
assertEquals("Apache POI", opcProps.getCreatorProperty().getValue()); | |||
opcProps.setCreatorProperty("poi-dev@poi.apache.org"); | |||
workbook = XSSFTestDataSamples.writeOutAndReadBack(workbook); | |||
assertEquals("Apache POI", workbook.getProperties().getExtendedProperties().getUnderlyingProperties().getApplication()); | |||
opcProps = workbook.getProperties().getCoreProperties().getUnderlyingProperties(); | |||
assertEquals("Testing Bugzilla #47460", opcProps.getTitleProperty().getValue()); | |||
assertEquals("poi-dev@poi.apache.org", opcProps.getCreatorProperty().getValue()); | |||
} | |||
/** | |||
* Verify that the attached test data was not modified. If this test method | |||
* fails, the test data is not working properly. | |||
*/ | |||
public void test47668() throws Exception { | |||
XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("47668.xlsx"); | |||
List<XSSFPictureData> allPictures = workbook.getAllPictures(); | |||
assertEquals(2, allPictures.size()); | |||
PackagePartName imagePartName = PackagingURIHelper | |||
.createPartName("/xl/media/image1.jpeg"); | |||
PackagePart imagePart = workbook.getPackage().getPart(imagePartName); | |||
assertNotNull(imagePart); | |||
for (XSSFPictureData pictureData : allPictures) { | |||
PackagePart picturePart = pictureData.getPackagePart(); | |||
assertSame(imagePart, picturePart); | |||
} | |||
XSSFSheet sheet0 = workbook.getSheetAt(0); | |||
XSSFDrawing drawing0 = sheet0.createDrawingPatriarch(); | |||
XSSFPictureData pictureData0 = (XSSFPictureData) drawing0.getRelations().get(0); | |||
byte[] data0 = pictureData0.getData(); | |||
CRC32 crc0 = new CRC32(); | |||
crc0.update(data0); | |||
XSSFSheet sheet1 = workbook.getSheetAt(1); | |||
XSSFDrawing drawing1 = sheet1.createDrawingPatriarch(); | |||
XSSFPictureData pictureData1 = (XSSFPictureData) drawing1.getRelations().get(0); | |||
byte[] data1 = pictureData1.getData(); | |||
CRC32 crc1 = new CRC32(); | |||
crc1.update(data1); | |||
assertEquals(crc0.getValue(), crc1.getValue()); | |||
} | |||
public void testIncrementSheetId() { | |||
XSSFWorkbook wb = getTestDataProvider().createWorkbook(); | |||
int sheetId = (int)wb.createSheet().sheet.getSheetId(); | |||
assertEquals(1, sheetId); | |||
sheetId = (int)wb.createSheet().sheet.getSheetId(); | |||
assertEquals(2, sheetId); | |||
//test file with gaps in the sheetId sequence | |||
wb = getTestDataProvider().openSampleWorkbook("47089.xlsm"); | |||
int lastSheetId = (int)wb.getSheetAt(wb.getNumberOfSheets() - 1).sheet.getSheetId(); | |||
sheetId = (int)wb.createSheet().sheet.getSheetId(); | |||
assertEquals(lastSheetId+1, sheetId); | |||
} | |||
/** | |||
* Test setting of core properties such as Title and Author | |||
*/ | |||
public void testWorkbookProperties() { | |||
XSSFWorkbook workbook = new XSSFWorkbook(); | |||
POIXMLProperties props = workbook.getProperties(); | |||
assertNotNull(props); | |||
//the Application property must be set for new workbooks, see Bugzilla #47559 | |||
assertEquals("Apache POI", props.getExtendedProperties().getUnderlyingProperties().getApplication()); | |||
PackagePropertiesPart opcProps = props.getCoreProperties().getUnderlyingProperties(); | |||
assertNotNull(opcProps); | |||
opcProps.setTitleProperty("Testing Bugzilla #47460"); | |||
assertEquals("Apache POI", opcProps.getCreatorProperty().getValue()); | |||
opcProps.setCreatorProperty("poi-dev@poi.apache.org"); | |||
workbook = XSSFTestDataSamples.writeOutAndReadBack(workbook); | |||
assertEquals("Apache POI", workbook.getProperties().getExtendedProperties().getUnderlyingProperties().getApplication()); | |||
opcProps = workbook.getProperties().getCoreProperties().getUnderlyingProperties(); | |||
assertEquals("Testing Bugzilla #47460", opcProps.getTitleProperty().getValue()); | |||
assertEquals("poi-dev@poi.apache.org", opcProps.getCreatorProperty().getValue()); | |||
} | |||
/** | |||
* Verify that the attached test data was not modified. If this test method | |||
* fails, the test data is not working properly. | |||
*/ | |||
public void test47668() throws Exception { | |||
XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("47668.xlsx"); | |||
List<XSSFPictureData> allPictures = workbook.getAllPictures(); | |||
assertEquals(2, allPictures.size()); | |||
PackagePartName imagePartName = PackagingURIHelper | |||
.createPartName("/xl/media/image1.jpeg"); | |||
PackagePart imagePart = workbook.getPackage().getPart(imagePartName); | |||
assertNotNull(imagePart); | |||
for (XSSFPictureData pictureData : allPictures) { | |||
PackagePart picturePart = pictureData.getPackagePart(); | |||
assertSame(imagePart, picturePart); | |||
} | |||
XSSFSheet sheet0 = workbook.getSheetAt(0); | |||
XSSFDrawing drawing0 = sheet0.createDrawingPatriarch(); | |||
XSSFPictureData pictureData0 = (XSSFPictureData) drawing0.getRelations().get(0); | |||
byte[] data0 = pictureData0.getData(); | |||
CRC32 crc0 = new CRC32(); | |||
crc0.update(data0); | |||
XSSFSheet sheet1 = workbook.getSheetAt(1); | |||
XSSFDrawing drawing1 = sheet1.createDrawingPatriarch(); | |||
XSSFPictureData pictureData1 = (XSSFPictureData) drawing1.getRelations().get(0); | |||
byte[] data1 = pictureData1.getData(); | |||
CRC32 crc1 = new CRC32(); | |||
crc1.update(data1); | |||
assertEquals(crc0.getValue(), crc1.getValue()); | |||
} | |||
} |
@@ -22,11 +22,10 @@ import java.util.Arrays; | |||
import junit.framework.TestCase; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol; | |||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols; | |||
public class TestCTColComparator extends TestCase { | |||
public final class TestCTColComparator extends TestCase { | |||
public void testCompare() { | |||
CTColComparator comparator = new CTColComparator(); | |||
CTCol o1 = CTCol.Factory.newInstance(); | |||
@@ -44,7 +43,7 @@ public class TestCTColComparator extends TestCase { | |||
o4.setMax(80); | |||
assertEquals(-1, comparator.compare(o3, o4)); | |||
} | |||
public void testArraysSort() { | |||
CTColComparator comparator = new CTColComparator(); | |||
CTCol o1 = CTCol.Factory.newInstance(); | |||
@@ -73,5 +72,4 @@ public class TestCTColComparator extends TestCase { | |||
assertEquals(8, cols[1].getMax()); | |||
assertEquals(80, cols[2].getMax()); | |||
} | |||
} |
@@ -21,7 +21,7 @@ import java.math.BigInteger; | |||
import junit.framework.TestCase; | |||
import org.openxmlformats.schemas.officeDocument.x2006.math.STSpacingRule; | |||
import org.apache.poi.POIXMLDocument; | |||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBorder; | |||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTInd; | |||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc; | |||
@@ -40,29 +40,27 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTextAlignment; | |||
/** | |||
* Tests for XWPF Paragraphs | |||
*/ | |||
public class TestXWPFParagraph extends TestCase { | |||
public final class TestXWPFParagraph extends TestCase { | |||
/** | |||
* A simple file | |||
*/ | |||
private XWPFDocument xml; | |||
private File file; | |||
/* | |||
protected void setUp() throws Exception { | |||
super.setUp(); | |||
file = new File( | |||
File file = new File( | |||
System.getProperty("HWPF.testdata.path") + | |||
File.separator + "ThreeColHead.docx" | |||
); | |||
assertTrue(file.exists()); | |||
xml = new XWPFDocument(POIXMLDocument.openPackage(file.toString())); | |||
} | |||
*/ | |||
/** | |||
* Check that we get the right paragraph from the header | |||
*/ | |||
/* | |||
public void testHeaderParagraph() throws Exception { | |||
public void disabled_testHeaderParagraph() { | |||
XWPFHeader hdr = xml.getHeaderFooterPolicy().getDefaultHeader(); | |||
assertNotNull(hdr); | |||
@@ -74,12 +72,11 @@ public class TestXWPFParagraph extends TestCase { | |||
assertEquals("First header column!\tMid header\tRight header!", p | |||
.getText()); | |||
} | |||
*/ | |||
/** | |||
* Check that we get the right paragraphs from the document | |||
*/ | |||
/* | |||
public void testDocumentParagraph() throws Exception { | |||
public void disabled_testDocumentParagraph() { | |||
XWPFParagraph[] ps = xml.getParagraphs(); | |||
assertEquals(10, ps.length); | |||
@@ -100,23 +97,23 @@ public class TestXWPFParagraph extends TestCase { | |||
assertFalse(ps[4].isEmpty()); | |||
assertEquals("More on page one", ps[4].getText()); | |||
} | |||
*/ | |||
public void testSetGetBorderTop() { | |||
//new clean instance of paragraph | |||
XWPFDocument doc = new XWPFDocument(); | |||
XWPFParagraph p = doc.createParagraph(); | |||
assertEquals(STBorder.NONE.intValue(), p.getBorderTop().getValue()); | |||
CTP ctp = p.getCTP(); | |||
CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr(); | |||
//bordi | |||
CTPBdr bdr = ppr.addNewPBdr(); | |||
CTBorder borderTop = bdr.addNewTop(); | |||
borderTop.setVal(STBorder.DOUBLE); | |||
bdr.setTop(borderTop); | |||
assertEquals(Borders.DOUBLE, p.getBorderTop()); | |||
p.setBorderTop(Borders.SINGLE); | |||
assertEquals(STBorder.SINGLE, borderTop.getVal()); | |||
@@ -128,7 +125,7 @@ public class TestXWPFParagraph extends TestCase { | |||
XWPFParagraph p = doc.createParagraph(); | |||
assertEquals(STJc.LEFT.intValue(), p.getAlignment().getValue()); | |||
CTP ctp = p.getCTP(); | |||
CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr(); | |||
@@ -140,7 +137,7 @@ public class TestXWPFParagraph extends TestCase { | |||
assertEquals(STJc.BOTH, ppr.getJc().getVal()); | |||
} | |||
public void testSetGetSpacing() { | |||
XWPFDocument doc = new XWPFDocument(); | |||
XWPFParagraph p = doc.createParagraph(); | |||
@@ -149,7 +146,7 @@ public class TestXWPFParagraph extends TestCase { | |||
CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr(); | |||
assertEquals(-1, p.getSpacingAfter()); | |||
CTSpacing spacing = ppr.addNewSpacing(); | |||
spacing.setAfter(new BigInteger("10")); | |||
assertEquals(10, p.getSpacingAfter()); | |||
@@ -166,7 +163,7 @@ public class TestXWPFParagraph extends TestCase { | |||
CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr(); | |||
assertEquals(STLineSpacingRule.INT_AUTO, p.getSpacingLineRule().getValue()); | |||
CTSpacing spacing = ppr.addNewSpacing(); | |||
spacing.setLineRule(STLineSpacingRule.AT_LEAST); | |||
assertEquals(LineSpacingRule.AT_LEAST, p.getSpacingLineRule()); | |||
@@ -174,18 +171,18 @@ public class TestXWPFParagraph extends TestCase { | |||
p.setSpacingAfter(100); | |||
assertEquals(100, spacing.getAfter().intValue()); | |||
} | |||
public void testSetGetIndentation() { | |||
XWPFDocument doc = new XWPFDocument(); | |||
XWPFParagraph p = doc.createParagraph(); | |||
assertEquals(-1, p.getIndentationLeft()); | |||
CTP ctp = p.getCTP(); | |||
CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr(); | |||
assertEquals(-1, p.getIndentationLeft()); | |||
CTInd ind = ppr.addNewInd(); | |||
ind.setLeft(new BigInteger("10")); | |||
assertEquals(10, p.getIndentationLeft()); | |||
@@ -193,7 +190,7 @@ public class TestXWPFParagraph extends TestCase { | |||
p.setIndentationLeft(100); | |||
assertEquals(100, ind.getLeft().intValue()); | |||
} | |||
public void testSetGetVerticalAlignment() { | |||
//new clean instance of paragraph | |||
XWPFDocument doc = new XWPFDocument(); | |||
@@ -240,6 +237,4 @@ public class TestXWPFParagraph extends TestCase { | |||
p.setPageBreak(true); | |||
assertEquals(STOnOff.TRUE, ppr.getPageBreakBefore().getVal()); | |||
} | |||
} |
@@ -17,16 +17,12 @@ | |||
package org.apache.poi.hdf.extractor; | |||
import java.util.*; | |||
/** | |||
* Comment me | |||
* | |||
* @author Ryan Ackley | |||
*/ | |||
public final class StyleSheet | |||
{ | |||
public final class StyleSheet { | |||
private static final int NIL_STYLE = 4095; | |||
private static final int PAP_TYPE = 1; |
@@ -17,37 +17,25 @@ | |||
package org.apache.poi.hdf.model; | |||
//import java.io; | |||
import java.util.ArrayList; | |||
import java.io.InputStream; | |||
import java.io.FileInputStream; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.TreeSet; | |||
import org.apache.poi.hdf.model.hdftypes.*; | |||
import org.apache.poi.hdf.event.HDFLowLevelParsingListener; | |||
import org.apache.poi.hdf.model.util.BTreeSet; | |||
import org.apache.poi.hdf.model.hdftypes.*; | |||
import org.apache.poi.hdf.model.util.ParsingState; | |||
import org.apache.poi.poifs.filesystem.POIFSFileSystem; | |||
import org.apache.poi.poifs.filesystem.POIFSDocument; | |||
import org.apache.poi.poifs.filesystem.DocumentEntry; | |||
import org.apache.poi.poifs.filesystem.POIFSFileSystem; | |||
import org.apache.poi.util.LittleEndian; | |||
/** | |||
* The Object Factory takes in a stream and creates the low level objects | |||
* that represent the data. | |||
* @author andy | |||
*/ | |||
public final class HDFObjectFactory | |||
{ | |||
public final class HDFObjectFactory { | |||
/** OLE stuff*/ | |||
private POIFSFileSystem _filesystem; | |||
@@ -193,36 +181,26 @@ public final class HDFObjectFactory | |||
{ | |||
throw new IOException("The text piece table is corrupted"); | |||
} | |||
else | |||
{ | |||
//parse out the text pieces | |||
int pieceTableSize = LittleEndian.getInt(_tableBuffer, ++pos); | |||
pos += 4; | |||
int pieces = (pieceTableSize - 4) / 12; | |||
for (int x = 0; x < pieces; x++) | |||
{ | |||
int filePos = LittleEndian.getInt(_tableBuffer, pos + ((pieces + 1) * 4) + (x * 8) + 2); | |||
boolean unicode = false; | |||
if ((filePos & 0x40000000) == 0) | |||
{ | |||
unicode = true; | |||
} | |||
else | |||
{ | |||
unicode = false; | |||
filePos &= ~(0x40000000);//gives me FC in doc stream | |||
filePos /= 2; | |||
} | |||
int totLength = LittleEndian.getInt(_tableBuffer, pos + (x + 1) * 4) - | |||
LittleEndian.getInt(_tableBuffer, pos + (x * 4)); | |||
TextPiece piece = new TextPiece(filePos, totLength, unicode); | |||
_listener.text(piece); | |||
//parse out the text pieces | |||
int pieceTableSize = LittleEndian.getInt(_tableBuffer, ++pos); | |||
pos += 4; | |||
int pieces = (pieceTableSize - 4) / 12; | |||
for (int x = 0; x < pieces; x++) { | |||
int filePos = LittleEndian.getInt(_tableBuffer, pos + ((pieces + 1) * 4) + (x * 8) + 2); | |||
boolean unicode = false; | |||
if ((filePos & 0x40000000) == 0) { | |||
unicode = true; | |||
} else { | |||
unicode = false; | |||
filePos &= ~(0x40000000);//gives me FC in doc stream | |||
filePos /= 2; | |||
} | |||
int totLength = LittleEndian.getInt(_tableBuffer, pos + (x + 1) * 4) - | |||
LittleEndian.getInt(_tableBuffer, pos + (x * 4)); | |||
TextPiece piece = new TextPiece(filePos, totLength, unicode); | |||
_listener.text(piece); | |||
} | |||
} | |||
/** | |||
* initializes all of the formatting properties for a Word Document | |||
@@ -532,10 +510,7 @@ public final class HDFObjectFactory | |||
{ | |||
break; | |||
} | |||
else | |||
{ | |||
x++; | |||
} | |||
x++; | |||
} | |||
//do the header sections | |||
for (; x < arraySize; x++)// && sectionEnd <= end; x++) |
@@ -17,9 +17,6 @@ | |||
package org.apache.poi.hdf.model.hdftypes; | |||
import org.apache.poi.util.BitField; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.hdf.model.hdftypes.definitions.FIBAbstractType; | |||
@@ -17,7 +17,6 @@ | |||
package org.apache.poi.hdf.model.hdftypes; | |||
import java.util.*; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.hdf.model.hdftypes.definitions.TCAbstractType; | |||
@@ -29,9 +28,7 @@ import org.apache.poi.hdf.model.hdftypes.definitions.TCAbstractType; | |||
* | |||
* @author Ryan Ackley | |||
*/ | |||
public final class StyleSheet implements HDFType | |||
{ | |||
public final class StyleSheet implements HDFType { | |||
private static final int NIL_STYLE = 4095; | |||
private static final int PAP_TYPE = 1; |
@@ -18,12 +18,8 @@ | |||
package org.apache.poi.hdf.model.hdftypes.definitions; | |||
import org.apache.poi.util.BitField; | |||
import org.apache.poi.util.BitFieldFactory; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.StringUtil; | |||
import org.apache.poi.util.HexDump; | |||
import org.apache.poi.hdf.model.hdftypes.HDFType; | |||
/** |
@@ -22,7 +22,6 @@ package org.apache.poi.hdf.model.hdftypes.definitions; | |||
import org.apache.poi.util.BitField; | |||
import org.apache.poi.util.BitFieldFactory; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.StringUtil; | |||
import org.apache.poi.util.HexDump; | |||
import org.apache.poi.hdf.model.hdftypes.HDFType; | |||
@@ -18,11 +18,9 @@ | |||
package org.apache.poi.hdf.model.hdftypes.definitions; | |||
import org.apache.poi.util.BitField; | |||
import org.apache.poi.util.BitFieldFactory; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.StringUtil; | |||
import org.apache.poi.util.HexDump; | |||
import org.apache.poi.hdf.model.hdftypes.HDFType; | |||
@@ -18,12 +18,8 @@ | |||
package org.apache.poi.hdf.model.hdftypes.definitions; | |||
import org.apache.poi.util.BitField; | |||
import org.apache.poi.util.BitFieldFactory; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.StringUtil; | |||
import org.apache.poi.util.HexDump; | |||
import org.apache.poi.hdf.model.hdftypes.HDFType; | |||
/** |
@@ -18,11 +18,6 @@ | |||
package org.apache.poi.hdf.model.hdftypes.definitions; | |||
import org.apache.poi.util.BitField; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.StringUtil; | |||
import org.apache.poi.util.HexDump; | |||
import org.apache.poi.hdf.model.hdftypes.HDFType; | |||
/** |
@@ -17,12 +17,6 @@ | |||
package org.apache.poi.hdf.model.hdftypes.definitions; | |||
import org.apache.poi.util.BitField; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.StringUtil; | |||
import org.apache.poi.util.HexDump; | |||
import org.apache.poi.hdf.model.hdftypes.HDFType; | |||
/** |
@@ -17,13 +17,8 @@ | |||
package org.apache.poi.hdf.model.hdftypes.definitions; | |||
import org.apache.poi.util.BitField; | |||
import org.apache.poi.util.BitFieldFactory; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.StringUtil; | |||
import org.apache.poi.util.HexDump; | |||
import org.apache.poi.hdf.model.hdftypes.HDFType; | |||
/** |
@@ -26,9 +26,6 @@ import org.apache.poi.hslf.record.PersistPtrHolder; | |||
import org.apache.poi.hslf.record.Record; | |||
import org.apache.poi.hslf.record.UserEditAtom; | |||
import org.apache.poi.poifs.filesystem.POIFSFileSystem; | |||
import org.apache.poi.poifs.filesystem.DocumentEntry; | |||
import org.apache.poi.poifs.filesystem.DocumentInputStream; | |||
import org.apache.poi.util.LittleEndian; | |||
/** | |||
* This class provides helper functions for determining if a | |||
@@ -95,7 +92,9 @@ public final class EncryptedSlideShow | |||
hss.getUnderlyingBytes(), | |||
(int)cua.getCurrentEditOffset() | |||
); | |||
} catch(ArrayIndexOutOfBoundsException e) {} | |||
} catch (ArrayIndexOutOfBoundsException e) { | |||
return null; | |||
} | |||
if(r == null) { return null; } | |||
if(! (r instanceof UserEditAtom)) { return null; } | |||
UserEditAtom uea = (UserEditAtom)r; |
@@ -26,7 +26,6 @@ import java.io.InputStream; | |||
import java.io.ByteArrayInputStream; | |||
import java.io.IOException; | |||
import java.util.zip.InflaterInputStream; | |||
import java.util.zip.DeflaterOutputStream; | |||
/** | |||
* Represents EMF (Windows Enhanced Metafile) picture data. |
@@ -23,7 +23,6 @@ import org.apache.poi.hslf.usermodel.PictureData; | |||
import java.awt.*; | |||
import java.io.*; | |||
import java.util.zip.DeflaterOutputStream; | |||
import java.util.zip.InflaterInputStream; | |||
/** | |||
* Represents a metafile picture which can be one of the following types: EMF, WMF, or PICT. |
@@ -17,14 +17,14 @@ | |||
package org.apache.poi.hslf.blip; | |||
import java.io.ByteArrayInputStream; | |||
import java.io.ByteArrayOutputStream; | |||
import java.io.IOException; | |||
import java.util.zip.InflaterInputStream; | |||
import org.apache.poi.hslf.exceptions.HSLFException; | |||
import org.apache.poi.hslf.model.Picture; | |||
import org.apache.poi.hslf.model.Shape; | |||
import org.apache.poi.hslf.exceptions.HSLFException; | |||
import org.apache.poi.util.LittleEndian; | |||
import java.io.*; | |||
import java.util.zip.InflaterInputStream; | |||
import java.util.zip.DeflaterOutputStream; | |||
/** | |||
* Represents Macintosh PICT picture data. |
@@ -25,7 +25,6 @@ import org.apache.poi.hslf.exceptions.HSLFException; | |||
import java.io.*; | |||
import java.util.zip.InflaterInputStream; | |||
import java.util.zip.DeflaterOutputStream; | |||
/** | |||
* Represents a WMF (Windows Metafile) picture data. |
@@ -17,11 +17,9 @@ | |||
package org.apache.poi.hslf.dev; | |||
import java.util.*; | |||
import java.io.*; | |||
import org.apache.poi.poifs.filesystem.POIFSFileSystem; | |||
import org.apache.poi.poifs.filesystem.POIFSDocument; | |||
import org.apache.poi.poifs.filesystem.DocumentEntry; | |||
import org.apache.poi.ddf.*; |
@@ -33,7 +33,6 @@ import org.apache.poi.hslf.record.EscherTextboxWrapper; | |||
import org.apache.poi.hslf.record.TextCharsAtom; | |||
import org.apache.poi.hslf.record.TextBytesAtom; | |||
import org.apache.poi.hslf.record.StyleTextPropAtom; | |||
import org.apache.poi.hslf.record.Record; | |||
/** | |||
* This class provides a way to view the contents of a powerpoint file. |
@@ -22,7 +22,6 @@ import org.apache.poi.hslf.model.textproperties.BitMaskTextProp; | |||
import org.apache.poi.hslf.model.textproperties.TextProp; | |||
import org.apache.poi.hslf.model.textproperties.TextPropCollection; | |||
import org.apache.poi.hslf.record.*; | |||
import org.apache.poi.hslf.record.StyleTextPropAtom.*; | |||
import java.util.LinkedList; | |||
@@ -17,18 +17,13 @@ | |||
package org.apache.poi.hslf.dev; | |||
import org.apache.poi.hslf.*; | |||
import org.apache.poi.hslf.record.*; | |||
import java.io.ByteArrayOutputStream; | |||
import java.util.Hashtable; | |||
import org.apache.poi.poifs.filesystem.POIFSFileSystem; | |||
import org.apache.poi.poifs.filesystem.POIFSDocument; | |||
import org.apache.poi.poifs.filesystem.DocumentEntry; | |||
import org.apache.poi.poifs.filesystem.DocumentInputStream; | |||
import org.apache.poi.hslf.HSLFSlideShow; | |||
import org.apache.poi.hslf.record.*; | |||
import org.apache.poi.util.LittleEndian; | |||
import java.io.*; | |||
import java.util.Hashtable; | |||
/** | |||
* Uses record level code to locate UserEditAtom records, and other | |||
* persistence related atoms. Tries to match them together, to help |
@@ -21,9 +21,7 @@ import java.io.*; | |||
import java.util.Vector; | |||
import org.apache.poi.poifs.filesystem.POIFSFileSystem; | |||
import org.apache.poi.poifs.filesystem.POIFSDocument; | |||
import org.apache.poi.poifs.filesystem.DocumentEntry; | |||
import org.apache.poi.poifs.filesystem.DocumentInputStream; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.hslf.record.CString; |
@@ -20,7 +20,6 @@ package org.apache.poi.hslf.model; | |||
import org.apache.poi.ddf.*; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.POILogger; | |||
import org.apache.poi.util.HexDump; | |||
import java.awt.geom.*; | |||
import java.util.ArrayList; |
@@ -18,9 +18,6 @@ | |||
package org.apache.poi.hslf.model; | |||
import org.apache.poi.hslf.record.SheetContainer; | |||
import org.apache.poi.hslf.record.Record; | |||
import org.apache.poi.hslf.record.RecordTypes; | |||
import org.apache.poi.hslf.record.OEPlaceholderAtom; | |||
import org.apache.poi.hslf.model.textproperties.TextProp; | |||
/** | |||
@@ -55,5 +52,4 @@ public abstract class MasterSheet extends Sheet { | |||
TextShape tx = (TextShape)shape; | |||
return tx.getPlaceholderAtom() != null; | |||
} | |||
} |
@@ -28,13 +28,11 @@ import org.apache.poi.util.POILogger; | |||
import javax.imageio.ImageIO; | |||
import java.awt.image.BufferedImage; | |||
import java.awt.*; | |||
import java.awt.geom.Rectangle2D; | |||
import java.awt.geom.AffineTransform; | |||
import java.io.ByteArrayInputStream; | |||
import java.io.IOException; | |||
import java.io.UnsupportedEncodingException; | |||
import java.util.List; | |||
import java.util.Arrays; | |||
/** |
@@ -21,7 +21,6 @@ import org.apache.poi.ddf.*; | |||
import org.apache.poi.hslf.record.OEPlaceholderAtom; | |||
import org.apache.poi.hslf.exceptions.HSLFException; | |||
import java.util.List; | |||
import java.io.ByteArrayOutputStream; | |||
/** |
@@ -19,7 +19,6 @@ package org.apache.poi.hslf.model; | |||
import org.apache.poi.ddf.*; | |||
import org.apache.poi.hslf.record.ColorSchemeAtom; | |||
import org.apache.poi.hslf.record.PPDrawing; | |||
import org.apache.poi.util.POILogger; | |||
import org.apache.poi.util.POILogFactory; | |||
@@ -20,7 +20,6 @@ package org.apache.poi.hslf.model; | |||
import org.apache.poi.ddf.*; | |||
import org.apache.poi.hslf.record.*; | |||
import org.apache.poi.hslf.usermodel.SlideShow; | |||
import org.apache.poi.util.POILogger; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; |
@@ -18,7 +18,6 @@ | |||
package org.apache.poi.hslf.model; | |||
import org.apache.poi.ddf.*; | |||
import org.apache.poi.hslf.record.TextHeaderAtom; | |||
import java.awt.*; | |||
@@ -17,22 +17,24 @@ | |||
package org.apache.poi.hslf.model; | |||
import org.apache.poi.hslf.usermodel.RichTextRun; | |||
import org.apache.poi.hslf.record.TextRulerAtom; | |||
import org.apache.poi.util.POILogger; | |||
import org.apache.poi.util.POILogFactory; | |||
import java.text.AttributedString; | |||
import java.text.AttributedCharacterIterator; | |||
import java.text.BreakIterator; | |||
import java.awt.font.TextAttribute; | |||
import java.awt.Color; | |||
import java.awt.Font; | |||
import java.awt.Graphics2D; | |||
import java.awt.font.FontRenderContext; | |||
import java.awt.font.LineBreakMeasurer; | |||
import java.awt.font.TextAttribute; | |||
import java.awt.font.TextLayout; | |||
import java.awt.font.FontRenderContext; | |||
import java.awt.*; | |||
import java.awt.geom.Rectangle2D; | |||
import java.awt.geom.Point2D; | |||
import java.awt.geom.Rectangle2D; | |||
import java.text.AttributedCharacterIterator; | |||
import java.text.AttributedString; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import org.apache.poi.hslf.record.TextRulerAtom; | |||
import org.apache.poi.hslf.usermodel.RichTextRun; | |||
import org.apache.poi.util.POILogFactory; | |||
import org.apache.poi.util.POILogger; | |||
/** | |||
* Paint text into java.awt.Graphics2D | |||
@@ -162,7 +164,7 @@ public final class TextPainter { | |||
int paragraphStart = it.getBeginIndex(); | |||
int paragraphEnd = it.getEndIndex(); | |||
ArrayList lines = new ArrayList(); | |||
List<TextElement> lines = new ArrayList<TextElement>(); | |||
LineBreakMeasurer measurer = new LineBreakMeasurer(it, frc); | |||
measurer.setPosition(paragraphStart); | |||
while (measurer.getPosition() < paragraphEnd) { | |||
@@ -296,7 +298,7 @@ public final class TextPainter { | |||
//finally draw the text fragments | |||
TextElement[] elems = new TextElement[lines.size()]; | |||
return (TextElement[])lines.toArray(elems); | |||
return lines.toArray(elems); | |||
} | |||
public static class TextElement { |
@@ -19,7 +19,6 @@ package org.apache.poi.hslf.model; | |||
import java.util.LinkedList; | |||
import java.util.Vector; | |||
import java.util.List; | |||
import org.apache.poi.hslf.model.textproperties.TextPropCollection; | |||
import org.apache.poi.hslf.record.*; |
@@ -1,4 +1,3 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
@@ -30,7 +29,6 @@ import java.awt.geom.AffineTransform; | |||
import java.awt.font.FontRenderContext; | |||
import java.awt.font.TextLayout; | |||
import java.io.IOException; | |||
import java.util.Iterator; | |||
/** | |||
* A common superclass of all shapes that can hold text. | |||
@@ -88,7 +86,7 @@ public abstract class TextShape extends SimpleShape { | |||
/** | |||
* Create a TextBox object and initialize it from the supplied Record container. | |||
* | |||
* | |||
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape | |||
* @param parent the parent of the shape | |||
*/ | |||
@@ -230,23 +228,23 @@ public abstract class TextShape extends SimpleShape { | |||
String fntname = rt.getFontName(); | |||
Font font = new Font(fntname, style, size); | |||
float width = 0, height = 0, leading = 0; | |||
String[] lines = txt.split("\n"); | |||
float width = 0, height = 0, leading = 0; | |||
String[] lines = txt.split("\n"); | |||
for (int i = 0; i < lines.length; i++) { | |||
if(lines[i].length() == 0) continue; | |||
TextLayout layout = new TextLayout(lines[i], font, _frc); | |||
leading = Math.max(leading, layout.getLeading()); | |||
leading = Math.max(leading, layout.getLeading()); | |||
width = Math.max(width, layout.getAdvance()); | |||
height = Math.max(height, (height + (layout.getDescent() + layout.getAscent()))); | |||
} | |||
} | |||
// add one character to width | |||
Rectangle2D charBounds = font.getMaxCharBounds(_frc); | |||
Rectangle2D charBounds = font.getMaxCharBounds(_frc); | |||
width += getMarginLeft() + getMarginRight() + charBounds.getWidth(); | |||
// add leading to height | |||
// add leading to height | |||
height += getMarginTop() + getMarginBottom() + leading; | |||
Rectangle2D anchor = getAnchor2D(); |
@@ -19,9 +19,7 @@ package org.apache.poi.hslf.record; | |||
import java.io.IOException; | |||
import java.io.OutputStream; | |||
import java.util.Date; | |||
import org.apache.poi.hslf.util.SystemTimeUtils; | |||
import org.apache.poi.util.LittleEndian; | |||
/** | |||
@@ -29,8 +27,7 @@ import org.apache.poi.util.LittleEndian; | |||
* | |||
* @author Yegor Kozlov | |||
*/ | |||
public final class AnimationInfoAtom extends RecordAtom | |||
{ | |||
public final class AnimationInfoAtom extends RecordAtom { | |||
/** | |||
* whether the animation plays in the reverse direction |
@@ -17,7 +17,6 @@ | |||
package org.apache.poi.hslf.record; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.StringUtil; | |||
import java.io.IOException; | |||
@@ -29,9 +28,7 @@ import java.io.OutputStream; | |||
* | |||
* @author Nick Burch | |||
*/ | |||
public final class DocumentEncryptionAtom extends RecordAtom | |||
{ | |||
public final class DocumentEncryptionAtom extends RecordAtom { | |||
private byte[] _header; | |||
private static long _type = 12052l; | |||
@@ -17,11 +17,6 @@ | |||
package org.apache.poi.hslf.record; | |||
import java.io.IOException; | |||
import java.io.OutputStream; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.POILogger; | |||
/** | |||
* A container record that specifies information about a movie stored externally. | |||
@@ -50,5 +45,4 @@ public final class ExAviMovie extends ExMCIMovie { | |||
public long getRecordType() { | |||
return RecordTypes.ExAviMovie.typeID; | |||
} | |||
} |
@@ -17,11 +17,6 @@ | |||
package org.apache.poi.hslf.record; | |||
import java.io.OutputStream; | |||
import java.io.IOException; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.POILogger; | |||
/** | |||
* A container record that specifies information about an ActiveX control. It contains: |
@@ -14,15 +14,12 @@ | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.hslf.record; | |||
import java.io.IOException; | |||
import java.io.OutputStream; | |||
import java.util.Date; | |||
import org.apache.poi.hslf.util.SystemTimeUtils; | |||
import org.apache.poi.util.LittleEndian; | |||
/** | |||
@@ -31,9 +28,7 @@ import org.apache.poi.util.LittleEndian; | |||
* | |||
* @author Nick Burch | |||
*/ | |||
public class ExHyperlinkAtom extends RecordAtom | |||
{ | |||
public final class ExHyperlinkAtom extends RecordAtom { | |||
/** | |||
* Record header. | |||
*/ | |||
@@ -53,7 +48,7 @@ public class ExHyperlinkAtom extends RecordAtom | |||
LittleEndian.putShort(_header, 2, (short)getRecordType()); | |||
LittleEndian.putInt(_header, 4, _data.length); | |||
// It is fine for the other values to be zero | |||
} | |||
@@ -69,11 +64,11 @@ public class ExHyperlinkAtom extends RecordAtom | |||
// Get the header. | |||
_header = new byte[8]; | |||
System.arraycopy(source,start,_header,0,8); | |||
// Get the record data. | |||
_data = new byte[len-8]; | |||
System.arraycopy(source,start+8,_data,0,len-8); | |||
// Must be at least 4 bytes long | |||
if(_data.length < 4) { | |||
throw new IllegalArgumentException("The length of the data for a ExHyperlinkAtom must be at least 4 bytes, but was only " + _data.length); | |||
@@ -96,7 +91,7 @@ public class ExHyperlinkAtom extends RecordAtom | |||
public void setNumber(int number) { | |||
LittleEndian.putInt(_data,0,number); | |||
} | |||
/** | |||
* Gets the record type. | |||
* @return the record type. |
@@ -19,9 +19,7 @@ package org.apache.poi.hslf.record; | |||
import java.io.IOException; | |||
import java.io.OutputStream; | |||
import java.util.Date; | |||
import org.apache.poi.hslf.util.SystemTimeUtils; | |||
import org.apache.poi.util.LittleEndian; | |||
/** |
@@ -18,7 +18,6 @@ | |||
package org.apache.poi.hslf.record; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.StringUtil; | |||
import java.io.IOException; | |||
import java.io.OutputStream; | |||
import java.io.UnsupportedEncodingException; |
@@ -14,15 +14,12 @@ | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.hslf.record; | |||
import java.io.IOException; | |||
import java.io.OutputStream; | |||
import java.util.Date; | |||
import org.apache.poi.hslf.util.SystemTimeUtils; | |||
import org.apache.poi.util.LittleEndian; | |||
/** | |||
@@ -32,9 +29,7 @@ import org.apache.poi.util.LittleEndian; | |||
* @author Nick Burch | |||
* @author Yegor Kozlov | |||
*/ | |||
public class InteractiveInfoAtom extends RecordAtom | |||
{ | |||
public class InteractiveInfoAtom extends RecordAtom { | |||
/** | |||
* Action Table | |||
@@ -92,7 +87,7 @@ public class InteractiveInfoAtom extends RecordAtom | |||
LittleEndian.putShort(_header, 2, (short)getRecordType()); | |||
LittleEndian.putInt(_header, 4, _data.length); | |||
// It is fine for the other values to be zero | |||
} | |||
@@ -108,16 +103,16 @@ public class InteractiveInfoAtom extends RecordAtom | |||
// Get the header. | |||
_header = new byte[8]; | |||
System.arraycopy(source,start,_header,0,8); | |||
// Get the record data. | |||
_data = new byte[len-8]; | |||
System.arraycopy(source,start+8,_data,0,len-8); | |||
// Must be at least 16 bytes long | |||
if(_data.length < 16) { | |||
throw new IllegalArgumentException("The length of the data for a InteractiveInfoAtom must be at least 16 bytes, but was only " + _data.length); | |||
} | |||
// First 4 bytes - no idea, normally 0 | |||
// Second 4 bytes - the id of the link (from 1 onwards) | |||
// Third 4 bytes - no idea, normally 4 | |||
@@ -141,7 +136,7 @@ public class InteractiveInfoAtom extends RecordAtom | |||
public void setHyperlinkID(int number) { | |||
LittleEndian.putInt(_data,4,number); | |||
} | |||
/** | |||
* a reference to a sound in the sound collection. | |||
*/ |
@@ -21,25 +21,21 @@ import java.io.IOException; | |||
import java.io.OutputStream; | |||
import java.util.ArrayList; | |||
import org.apache.poi.util.LittleEndian; | |||
/** | |||
* Master slide | |||
* | |||
* @author Yegor Kozlov | |||
*/ | |||
public final class MainMaster extends SheetContainer | |||
{ | |||
public final class MainMaster extends SheetContainer { | |||
private byte[] _header; | |||
private static long _type = 1016; | |||
// Links to our more interesting children | |||
private SlideAtom slideAtom; | |||
private PPDrawing ppDrawing; | |||
private TxMasterStyleAtom[] txmasters; | |||
private ColorSchemeAtom[] clrscheme; | |||
private ColorSchemeAtom _colorScheme; | |||
private TxMasterStyleAtom[] txmasters; | |||
private ColorSchemeAtom[] clrscheme; | |||
private ColorSchemeAtom _colorScheme; | |||
/** | |||
* Returns the SlideAtom of this Slide | |||
@@ -52,9 +48,9 @@ public final class MainMaster extends SheetContainer | |||
*/ | |||
public PPDrawing getPPDrawing() { return ppDrawing; } | |||
public TxMasterStyleAtom[] getTxMasterStyleAtoms() { return txmasters; } | |||
public TxMasterStyleAtom[] getTxMasterStyleAtoms() { return txmasters; } | |||
public ColorSchemeAtom[] getColorSchemeAtoms() { return clrscheme; } | |||
public ColorSchemeAtom[] getColorSchemeAtoms() { return clrscheme; } | |||
/** | |||
* Set things up, and find our more interesting children | |||
@@ -67,27 +63,27 @@ public final class MainMaster extends SheetContainer | |||
// Find our children | |||
_children = Record.findChildRecords(source,start+8,len-8); | |||
ArrayList tx = new ArrayList(); | |||
ArrayList clr = new ArrayList(); | |||
ArrayList tx = new ArrayList(); | |||
ArrayList clr = new ArrayList(); | |||
// Find the interesting ones in there | |||
for(int i=0; i<_children.length; i++) { | |||
if(_children[i] instanceof SlideAtom) { | |||
slideAtom = (SlideAtom)_children[i]; | |||
} else if(_children[i] instanceof PPDrawing) { | |||
ppDrawing = (PPDrawing)_children[i]; | |||
} else if(_children[i] instanceof TxMasterStyleAtom) { | |||
tx.add(_children[i]); | |||
} else if(_children[i] instanceof ColorSchemeAtom) { | |||
clr.add(_children[i]); | |||
} else if(_children[i] instanceof TxMasterStyleAtom) { | |||
tx.add(_children[i]); | |||
} else if(_children[i] instanceof ColorSchemeAtom) { | |||
clr.add(_children[i]); | |||
} | |||
if(ppDrawing != null && _children[i] instanceof ColorSchemeAtom) { | |||
_colorScheme = (ColorSchemeAtom)_children[i]; | |||
} | |||
if(ppDrawing != null && _children[i] instanceof ColorSchemeAtom) { | |||
_colorScheme = (ColorSchemeAtom)_children[i]; | |||
} | |||
} | |||
txmasters = (TxMasterStyleAtom[])tx.toArray(new TxMasterStyleAtom[tx.size()]); | |||
clrscheme = (ColorSchemeAtom[])clr.toArray(new ColorSchemeAtom[clr.size()]); | |||
txmasters = (TxMasterStyleAtom[])tx.toArray(new TxMasterStyleAtom[tx.size()]); | |||
clrscheme = (ColorSchemeAtom[])clr.toArray(new ColorSchemeAtom[clr.size()]); | |||
} | |||
/** | |||
@@ -103,8 +99,7 @@ public final class MainMaster extends SheetContainer | |||
writeOut(_header[0],_header[1],_type,_children,out); | |||
} | |||
public ColorSchemeAtom getColorScheme(){ | |||
return _colorScheme; | |||
} | |||
public ColorSchemeAtom getColorScheme(){ | |||
return _colorScheme; | |||
} | |||
} |
@@ -19,9 +19,7 @@ package org.apache.poi.hslf.record; | |||
import java.io.IOException; | |||
import java.io.OutputStream; | |||
import java.util.Date; | |||
import org.apache.poi.hslf.util.SystemTimeUtils; | |||
import org.apache.poi.util.LittleEndian; | |||
/** |
@@ -22,7 +22,6 @@ import org.apache.poi.util.POILogger; | |||
import org.apache.poi.ddf.*; | |||
import org.apache.poi.hslf.model.ShapeTypes; | |||
import org.apache.poi.hslf.model.Shape; | |||
import java.io.IOException; | |||
import java.io.OutputStream; | |||
@@ -44,16 +43,15 @@ import java.util.Iterator; | |||
// For now, pretending to be an atom. Might not always be, but that | |||
// would require a wrapping class | |||
public final class PPDrawing extends RecordAtom | |||
{ | |||
public final class PPDrawing extends RecordAtom { | |||
private byte[] _header; | |||
private long _type; | |||
private EscherRecord[] childRecords; | |||
private EscherTextboxWrapper[] textboxWrappers; | |||
//cached EscherDgRecord | |||
private EscherDgRecord dg; | |||
//cached EscherDgRecord | |||
private EscherDgRecord dg; | |||
/** | |||
* Get access to the underlying Escher Records | |||
@@ -110,7 +108,7 @@ public final class PPDrawing extends RecordAtom | |||
public PPDrawing(){ | |||
_header = new byte[8]; | |||
LittleEndian.putUShort(_header, 0, 15); | |||
LittleEndian.putUShort(_header, 2, (int)RecordTypes.PPDrawing.typeID); | |||
LittleEndian.putUShort(_header, 2, RecordTypes.PPDrawing.typeID); | |||
LittleEndian.putInt(_header, 4, 0); | |||
textboxWrappers = new EscherTextboxWrapper[]{}; | |||
@@ -122,7 +120,7 @@ public final class PPDrawing extends RecordAtom | |||
*/ | |||
private void findEscherChildren(DefaultEscherRecordFactory erf, byte[] source, int startPos, int lenToGo, Vector found) { | |||
int escherBytes = LittleEndian.getInt( source, startPos + 4 ) + 8; | |||
int escherBytes = LittleEndian.getInt( source, startPos + 4 ) + 8; | |||
// Find the record | |||
EscherRecord r = erf.createRecord(source,startPos); | |||
@@ -137,16 +135,16 @@ public final class PPDrawing extends RecordAtom | |||
logger.log(POILogger.WARN, "Hit short DDF record at " + startPos + " - " + size); | |||
} | |||
/** | |||
* Sanity check. Always advance the cursor by the correct value. | |||
* | |||
* getRecordSize() must return exatcly the same number of bytes that was written in fillFields. | |||
* Sometimes it is not so, see an example in bug #44770. Most likely reason is that one of ddf records calculates wrong size. | |||
*/ | |||
if(size != escherBytes){ | |||
logger.log(POILogger.WARN, "Record length=" + escherBytes + " but getRecordSize() returned " + r.getRecordSize() + "; record: " + r.getClass()); | |||
size = escherBytes; | |||
} | |||
/** | |||
* Sanity check. Always advance the cursor by the correct value. | |||
* | |||
* getRecordSize() must return exatcly the same number of bytes that was written in fillFields. | |||
* Sometimes it is not so, see an example in bug #44770. Most likely reason is that one of ddf records calculates wrong size. | |||
*/ | |||
if(size != escherBytes){ | |||
logger.log(POILogger.WARN, "Record length=" + escherBytes + " but getRecordSize() returned " + r.getRecordSize() + "; record: " + r.getClass()); | |||
size = escherBytes; | |||
} | |||
startPos += size; | |||
lenToGo -= size; | |||
if(lenToGo >= 8) { | |||
@@ -163,13 +161,13 @@ public final class PPDrawing extends RecordAtom | |||
EscherTextboxRecord tbr = (EscherTextboxRecord)toSearch[i]; | |||
EscherTextboxWrapper w = new EscherTextboxWrapper(tbr); | |||
found.add(w); | |||
for (int j = i; j >= 0; j--) { | |||
if(toSearch[j] instanceof EscherSpRecord){ | |||
EscherSpRecord sp = (EscherSpRecord)toSearch[j]; | |||
w.setShapeId(sp.getShapeId()); | |||
break; | |||
} | |||
} | |||
for (int j = i; j >= 0; j--) { | |||
if(toSearch[j] instanceof EscherSpRecord){ | |||
EscherSpRecord sp = (EscherSpRecord)toSearch[j]; | |||
w.setShapeId(sp.getShapeId()); | |||
break; | |||
} | |||
} | |||
} else { | |||
// If it has children, walk them | |||
if(toSearch[i].isContainerRecord()) { | |||
@@ -297,23 +295,22 @@ public final class PPDrawing extends RecordAtom | |||
textboxWrappers = tw; | |||
} | |||
/** | |||
* Return EscherDgRecord which keeps track of the number of shapes and shapeId in this drawing group | |||
* | |||
* @return EscherDgRecord | |||
*/ | |||
public EscherDgRecord getEscherDgRecord(){ | |||
if(dg == null){ | |||
EscherContainerRecord dgContainer = (EscherContainerRecord)childRecords[0]; | |||
for(Iterator<EscherRecord> it = dgContainer.getChildIterator(); it.hasNext();){ | |||
EscherRecord r = it.next(); | |||
if(r instanceof EscherDgRecord){ | |||
dg = (EscherDgRecord)r; | |||
break; | |||
} | |||
} | |||
} | |||
return dg; | |||
} | |||
/** | |||
* Return EscherDgRecord which keeps track of the number of shapes and shapeId in this drawing group | |||
* | |||
* @return EscherDgRecord | |||
*/ | |||
public EscherDgRecord getEscherDgRecord(){ | |||
if(dg == null){ | |||
EscherContainerRecord dgContainer = (EscherContainerRecord)childRecords[0]; | |||
for(Iterator<EscherRecord> it = dgContainer.getChildIterator(); it.hasNext();){ | |||
EscherRecord r = it.next(); | |||
if(r instanceof EscherDgRecord){ | |||
dg = (EscherDgRecord)r; | |||
break; | |||
} | |||
} | |||
} | |||
return dg; | |||
} | |||
} |
@@ -23,7 +23,6 @@ import org.apache.poi.util.LittleEndian; | |||
import java.io.OutputStream; | |||
import java.io.IOException; | |||
import java.io.ByteArrayOutputStream; | |||
import java.util.List; | |||
import java.util.Iterator; | |||
/** |
@@ -19,10 +19,6 @@ package org.apache.poi.hslf.record; | |||
import java.io.IOException; | |||
import java.io.OutputStream; | |||
import java.util.Date; | |||
import org.apache.poi.hslf.util.SystemTimeUtils; | |||
import org.apache.poi.util.LittleEndian; | |||
/** | |||
* An atom record that specifies that a shape is a header or footer placeholder shape | |||
@@ -30,9 +26,7 @@ import org.apache.poi.util.LittleEndian; | |||
* @since PowerPoint 2007 | |||
* @author Yegor Kozlov | |||
*/ | |||
public final class RoundTripHFPlaceholder12 extends RecordAtom | |||
{ | |||
public final class RoundTripHFPlaceholder12 extends RecordAtom { | |||
/** | |||
* Record header. | |||
*/ |
@@ -17,7 +17,6 @@ | |||
package org.apache.poi.hslf.record; | |||
import org.apache.poi.util.ArrayUtil; | |||
import org.apache.poi.util.LittleEndian; | |||
import java.io.IOException; | |||
@@ -46,26 +45,25 @@ import java.util.Vector; | |||
*/ | |||
// For now, pretend to be an atom | |||
public final class SlideListWithText extends RecordContainer | |||
{ | |||
/** | |||
* Instance filed of the record header indicates that this SlideListWithText stores | |||
* references to slides | |||
*/ | |||
public static final int SLIDES = 0; | |||
/** | |||
* Instance filed of the record header indicates that this SlideListWithText stores | |||
* references to master slides | |||
*/ | |||
public static final int MASTER = 1; | |||
/** | |||
* Instance filed of the record header indicates that this SlideListWithText stores | |||
* references to notes | |||
*/ | |||
public static final int NOTES = 2; | |||
private byte[] _header; | |||
public final class SlideListWithText extends RecordContainer { | |||
/** | |||
* Instance filed of the record header indicates that this SlideListWithText stores | |||
* references to slides | |||
*/ | |||
public static final int SLIDES = 0; | |||
/** | |||
* Instance filed of the record header indicates that this SlideListWithText stores | |||
* references to master slides | |||
*/ | |||
public static final int MASTER = 1; | |||
/** | |||
* Instance filed of the record header indicates that this SlideListWithText stores | |||
* references to notes | |||
*/ | |||
public static final int NOTES = 2; | |||
private byte[] _header; | |||
private static long _type = 4080; | |||
private SlideAtomsSet[] slideAtomsSets; | |||
@@ -148,23 +146,23 @@ public final class SlideListWithText extends RecordContainer | |||
slideAtomsSets = sas; | |||
} | |||
public int getInstance(){ | |||
return LittleEndian.getShort(_header, 0) >> 4; | |||
} | |||
public int getInstance(){ | |||
return LittleEndian.getShort(_header, 0) >> 4; | |||
} | |||
public void setInstance(int inst){ | |||
LittleEndian.putShort(_header, (short)((inst << 4) | 0xF)); | |||
} | |||
public void setInstance(int inst){ | |||
LittleEndian.putShort(_header, (short)((inst << 4) | 0xF)); | |||
} | |||
/** | |||
/** | |||
* Get access to the SlideAtomsSets of the children of this record | |||
*/ | |||
public SlideAtomsSet[] getSlideAtomsSets() { return slideAtomsSets; } | |||
/** | |||
* Get access to the SlideAtomsSets of the children of this record | |||
*/ | |||
public void setSlideAtomsSets( SlideAtomsSet[] sas ) { slideAtomsSets = sas; } | |||
/** | |||
* Get access to the SlideAtomsSets of the children of this record | |||
*/ | |||
public void setSlideAtomsSets( SlideAtomsSet[] sas ) { slideAtomsSets = sas; } | |||
/** | |||
* Return the value we were given at creation |
@@ -17,8 +17,6 @@ | |||
package org.apache.poi.hslf.record; | |||
import org.apache.poi.util.POILogger; | |||
import java.io.OutputStream; | |||
import java.io.IOException; | |||
@@ -17,11 +17,8 @@ | |||
package org.apache.poi.hslf.record; | |||
import java.io.ByteArrayInputStream; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import java.io.OutputStream; | |||
import java.util.zip.InflaterInputStream; | |||
import org.apache.poi.util.LittleEndian; | |||
@@ -17,11 +17,8 @@ | |||
package org.apache.poi.hslf.record; | |||
import java.io.ByteArrayInputStream; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import java.io.OutputStream; | |||
import java.util.zip.InflaterInputStream; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.POILogger; |