:poi-scratchpad - fix javadocs - link to dependent/external project javadocs

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1888746 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Andreas Beeker 2021-04-13 21:37:33 +00:00
parent 240b02daec
commit 088d1dd197
20 changed files with 1097 additions and 1264 deletions

View File

@ -31,6 +31,7 @@ final String VERSIONS9 = 'META-INF/versions/9'
configurations { configurations {
tests tests
javadocs
} }
sourceSets { sourceSets {
@ -56,6 +57,9 @@ dependencies {
testImplementation project(path: ':poi', configuration: 'tests') testImplementation project(path: ':poi', configuration: 'tests')
testImplementation "org.junit.jupiter:junit-jupiter-api:${junitVersion}" testImplementation "org.junit.jupiter:junit-jupiter-api:${junitVersion}"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${junitVersion}" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${junitVersion}"
javadocs project(':poi')
javadocs project(':poi-ooxml')
} }
final MODULE_NAME = 'org.apache.poi.scratchpad' final MODULE_NAME = 'org.apache.poi.scratchpad'
@ -202,11 +206,20 @@ test {
} }
javadoc { javadoc {
// fails currently, need to fix the sources failOnError = true
failOnError = false doFirst {
// if(JavaVersion.current().isJava9Compatible()) { options {
// options.addBooleanOption('html5', true) if (JavaVersion.current().isJava9Compatible()) {
// } addBooleanOption('html5', true)
}
links 'https://poi.apache.org/apidocs/dev/'
links 'https://docs.oracle.com/javase/8/docs/api/'
use = true
splitIndex = true
source = "1.8"
classpath += configurations.javadocs.files
}
}
} }
publishing { publishing {

View File

@ -99,7 +99,7 @@ public final class HPBFDumper {
/** /**
* Dump out the escher parts of the file. * Dump out the escher parts of the file.
* Escher -> EscherStm and EscherDelayStm * Escher -> EscherStm and EscherDelayStm
*/ */
public void dumpEscher() throws IOException { public void dumpEscher() throws IOException {
DirectoryNode escherDir = (DirectoryNode) DirectoryNode escherDir = (DirectoryNode)

View File

@ -97,7 +97,7 @@ public final class AnimationInfoAtom extends RecordAtom {
/** /**
* Record header. * Record header.
*/ */
private byte[] _header; private final byte[] _header;
/** /**
* record data * record data
@ -246,7 +246,7 @@ public final class AnimationInfoAtom extends RecordAtom {
* A signed integer that specifies the order of the animation in the slide. * A signed integer that specifies the order of the animation in the slide.
* It MUST be greater than or equal to -2. The value -2 specifies that this animation follows the order of * It MUST be greater than or equal to -2. The value -2 specifies that this animation follows the order of
* the corresponding placeholder shape on the main master slide or title master slide. * the corresponding placeholder shape on the main master slide or title master slide.
* The value -1 SHOULD NOT <105> be used. * The value -1 SHOULD NOT be used.
*/ */
public int getOrderID(){ public int getOrderID(){
return LittleEndian.getInt(_recdata, 16); return LittleEndian.getInt(_recdata, 16);
@ -256,7 +256,7 @@ public final class AnimationInfoAtom extends RecordAtom {
* A signed integer that specifies the order of the animation in the slide. * A signed integer that specifies the order of the animation in the slide.
* It MUST be greater than or equal to -2. The value -2 specifies that this animation follows the order of * It MUST be greater than or equal to -2. The value -2 specifies that this animation follows the order of
* the corresponding placeholder shape on the main master slide or title master slide. * the corresponding placeholder shape on the main master slide or title master slide.
* The value -1 SHOULD NOT <105> be used. * The value -1 SHOULD NOT be used.
*/ */
public void setOrderID(int id){ public void setOrderID(int id){
LittleEndian.putInt(_recdata, 16, id); LittleEndian.putInt(_recdata, 16, id);

View File

@ -24,8 +24,10 @@ import java.util.Map;
* List of all known record types in a PowerPoint document, and the * List of all known record types in a PowerPoint document, and the
* classes that handle them. * classes that handle them.
* There are two categories of records: * There are two categories of records:
* <li> PowerPoint records: 0 <= info <= 10002 (will carry class info) * <ul>
* <li> Escher records: info >= 0xF000 (handled by DDF, so no class info) * <li> PowerPoint records: {@code 0 <= info <= 10002} (will carry class info)
* <li> Escher records: {@code info >= 0xF000} (handled by DDF, so no class info)
* </ul>
*/ */
public enum RecordTypes { public enum RecordTypes {
Unknown(0,null), Unknown(0,null),
@ -183,12 +185,12 @@ public enum RecordTypes {
for(RecordTypes s : values()) { for(RecordTypes s : values()) {
LOOKUP.put(s.typeID, s); LOOKUP.put(s.typeID, s);
} }
} }
public final short typeID;
public final RecordConstructor recordConstructor;
RecordTypes(int typeID, RecordConstructor recordConstructor) { public final short typeID;
public final RecordConstructor<?> recordConstructor;
RecordTypes(int typeID, RecordConstructor<?> recordConstructor) {
this.typeID = (short)typeID; this.typeID = (short)typeID;
this.recordConstructor = recordConstructor; this.recordConstructor = recordConstructor;
} }

View File

@ -101,8 +101,8 @@ public class OutlookTextExtractor implements POIOLE2TextExtractor {
} }
try { try {
s.append("From: " + msg.getDisplayFrom() + "\n"); s.append("From: ").append(msg.getDisplayFrom()).append("\n");
} catch (ChunkNotFoundException e) { } catch (ChunkNotFoundException ignored) {
} }
// For To, CC and BCC, try to match the names // For To, CC and BCC, try to match the names
@ -111,15 +111,15 @@ public class OutlookTextExtractor implements POIOLE2TextExtractor {
// people in To + CC + BCC. // people in To + CC + BCC.
try { try {
handleEmails(s, "To", msg.getDisplayTo(), emails); handleEmails(s, "To", msg.getDisplayTo(), emails);
} catch (ChunkNotFoundException e) { } catch (ChunkNotFoundException ignored) {
} }
try { try {
handleEmails(s, "CC", msg.getDisplayCC(), emails); handleEmails(s, "CC", msg.getDisplayCC(), emails);
} catch (ChunkNotFoundException e) { } catch (ChunkNotFoundException ignored) {
} }
try { try {
handleEmails(s, "BCC", msg.getDisplayBCC(), emails); handleEmails(s, "BCC", msg.getDisplayBCC(), emails);
} catch (ChunkNotFoundException e) { } catch (ChunkNotFoundException ignored) {
} }
// Date - try two ways to find it // Date - try two ways to find it
@ -145,7 +145,7 @@ public class OutlookTextExtractor implements POIOLE2TextExtractor {
try { try {
s.append("Subject: ").append(msg.getSubject()).append("\n"); s.append("Subject: ").append(msg.getSubject()).append("\n");
} catch (ChunkNotFoundException e) { } catch (ChunkNotFoundException ignored) {
} }
// Display attachment names // Display attachment names
@ -164,7 +164,7 @@ public class OutlookTextExtractor implements POIOLE2TextExtractor {
try { try {
s.append("\n").append(msg.getTextBody()).append("\n"); s.append("\n").append(msg.getTextBody()).append("\n");
} catch (ChunkNotFoundException e) { } catch (ChunkNotFoundException ignored) {
} }
return s.toString(); return s.toString();
@ -173,7 +173,7 @@ public class OutlookTextExtractor implements POIOLE2TextExtractor {
/** /**
* Takes a Display focused string, eg "Nick; Jim" and an iterator * Takes a Display focused string, eg "Nick; Jim" and an iterator
* of emails, and does its best to return something like * of emails, and does its best to return something like
* "Nick <nick@example.com>; Jim <jim@example.com>" * {@code "Nick <nick@example.com>; Jim <jim@example.com>"}
*/ */
protected void handleEmails(StringBuilder s, String type, String displayText, Iterator<String> emails) { protected void handleEmails(StringBuilder s, String type, String displayText, Iterator<String> emails) {
if (displayText == null || displayText.length() == 0) { if (displayText == null || displayText.length() == 0) {

View File

@ -19,6 +19,7 @@ package org.apache.poi.hssf.converter;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.hssf.util.HSSFColor;
@ -27,112 +28,114 @@ import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.util.Beta; import org.apache.poi.util.Internal;
/** /**
* Common class for {@link ExcelToFoUtils} and {@link ExcelToHtmlUtils} * Common class for {@link ExcelToFoConverter} and {@link ExcelToHtmlConverter}
* *
* @author Sergey Vladimirov (vlsergey {at} gmail {dot} com)
* @see AbstractWordUtils * @see AbstractWordUtils
* @since POI 3.8 beta 5 * @since POI 3.8 beta 5
*/ */
@Beta @Internal
public class AbstractExcelUtils { class AbstractExcelUtils {
/*package*/ static final String EMPTY = ""; /*package*/ static final String EMPTY = "";
private static final short EXCEL_COLUMN_WIDTH_FACTOR = 256; private static final short EXCEL_COLUMN_WIDTH_FACTOR = 256;
private static final int UNIT_OFFSET_LENGTH = 7; private static final int UNIT_OFFSET_LENGTH = 7;
public static String getAlign( HorizontalAlignment alignment ) { public static String getAlign(HorizontalAlignment alignment) {
switch ( alignment ) { switch (alignment) {
case CENTER: case CENTER:
return "center"; case CENTER_SELECTION:
case CENTER_SELECTION: return "center";
return "center"; case FILL:
case FILL: // XXX: shall we support fill?
// XXX: shall we support fill? return "";
return ""; case JUSTIFY:
case GENERAL: return "justify";
return ""; case LEFT:
case JUSTIFY: return "left";
return "justify"; case RIGHT:
case LEFT: return "right";
return "left"; default:
case RIGHT: case GENERAL:
return "right"; return "";
default:
return "";
} }
} }
public static String getBorderStyle( BorderStyle xlsBorder ) { public static String getBorderStyle(BorderStyle xlsBorder) {
final String borderStyle; final String borderStyle;
switch ( xlsBorder ) { switch (xlsBorder) {
case NONE: case NONE:
borderStyle = "none"; borderStyle = "none";
break; break;
case DASH_DOT: case DASH_DOT:
case DASH_DOT_DOT: case DASH_DOT_DOT:
case DOTTED: case DOTTED:
case HAIR: case HAIR:
case MEDIUM_DASH_DOT: case MEDIUM_DASH_DOT:
case MEDIUM_DASH_DOT_DOT: case MEDIUM_DASH_DOT_DOT:
case SLANTED_DASH_DOT: case SLANTED_DASH_DOT:
borderStyle = "dotted"; borderStyle = "dotted";
break; break;
case DASHED: case DASHED:
case MEDIUM_DASHED: case MEDIUM_DASHED:
borderStyle = "dashed"; borderStyle = "dashed";
break; break;
case DOUBLE: case DOUBLE:
borderStyle = "double"; borderStyle = "double";
break; break;
default: default:
borderStyle = "solid"; borderStyle = "solid";
break; break;
} }
return borderStyle; return borderStyle;
} }
public static String getBorderWidth( BorderStyle xlsBorder ) { public static String getBorderWidth(BorderStyle xlsBorder) {
final String borderWidth; final String borderWidth;
switch ( xlsBorder ) { switch (xlsBorder) {
case MEDIUM_DASH_DOT: case MEDIUM_DASH_DOT:
case MEDIUM_DASH_DOT_DOT: case MEDIUM_DASH_DOT_DOT:
case MEDIUM_DASHED: case MEDIUM_DASHED:
borderWidth = "2pt"; borderWidth = "2pt";
break; break;
case THICK: case THICK:
borderWidth = "thick"; borderWidth = "thick";
break; break;
default: default:
borderWidth = "thin"; borderWidth = "thin";
break; break;
} }
return borderWidth; return borderWidth;
} }
public static String getColor( HSSFColor color ) { public static String getColor(HSSFColor color) {
StringBuilder stringBuilder = new StringBuilder( 7 ); StringBuilder stringBuilder = new StringBuilder(7);
stringBuilder.append( '#' ); stringBuilder.append('#');
for ( short s : color.getTriplet() ) { for (short s : color.getTriplet()) {
if ( s < 10 ) if (s < 10) {
stringBuilder.append( '0' ); stringBuilder.append('0');
}
stringBuilder.append( Integer.toHexString( s ) ); stringBuilder.append(Integer.toHexString(s));
} }
String result = stringBuilder.toString(); String result = stringBuilder.toString();
if ( result.equals( "#ffffff" ) ) if (result.equals("#ffffff")) {
return "white"; return "white";
}
if ( result.equals( "#c0c0c0" ) ) if (result.equals("#c0c0c0")) {
return "silver"; return "silver";
}
if ( result.equals( "#808080" ) ) if (result.equals("#808080")) {
return "gray"; return "gray";
}
if ( result.equals( "#000000" ) ) if (result.equals("#000000")) {
return "black"; return "black";
}
return result; return result;
} }
@ -142,47 +145,93 @@ public class AbstractExcelUtils {
* "http://apache-poi.1045710.n5.nabble.com/Excel-Column-Width-Unit-Converter-pixels-excel-column-width-units-td2301481.html" * "http://apache-poi.1045710.n5.nabble.com/Excel-Column-Width-Unit-Converter-pixels-excel-column-width-units-td2301481.html"
* >here</a> for Xio explanation and details * >here</a> for Xio explanation and details
*/ */
public static int getColumnWidthInPx( int widthUnits ) { public static int getColumnWidthInPx(int widthUnits) {
int pixels = ( widthUnits / EXCEL_COLUMN_WIDTH_FACTOR ) int pixels = (widthUnits / EXCEL_COLUMN_WIDTH_FACTOR)
* UNIT_OFFSET_LENGTH; * UNIT_OFFSET_LENGTH;
int offsetWidthUnits = widthUnits % EXCEL_COLUMN_WIDTH_FACTOR; int offsetWidthUnits = widthUnits % EXCEL_COLUMN_WIDTH_FACTOR;
pixels += Math.round( offsetWidthUnits pixels += Math.round(offsetWidthUnits
/ ( (float) EXCEL_COLUMN_WIDTH_FACTOR / UNIT_OFFSET_LENGTH ) ); / ((float) EXCEL_COLUMN_WIDTH_FACTOR / UNIT_OFFSET_LENGTH));
return pixels; return pixels;
} }
/** /**
* @param mergedRanges * @param mergedRanges map of sheet merged ranges built with
* map of sheet merged ranges built with * {@link #buildMergedRangesMap(Sheet)}
* {@link ExcelToHtmlUtils#buildMergedRangesMap(Sheet)}
* @return {@link CellRangeAddress} from map if cell with specified row and * @return {@link CellRangeAddress} from map if cell with specified row and
* column numbers contained in found range, <tt>null</tt> otherwise * column numbers contained in found range, <tt>null</tt> otherwise
*/ */
public static CellRangeAddress getMergedRange( public static CellRangeAddress getMergedRange(
CellRangeAddress[][] mergedRanges, int rowNumber, int columnNumber ) { CellRangeAddress[][] mergedRanges, int rowNumber, int columnNumber) {
CellRangeAddress[] mergedRangeRowInfo = rowNumber < mergedRanges.length ? mergedRanges[rowNumber] CellRangeAddress[] mergedRangeRowInfo = rowNumber < mergedRanges.length ? mergedRanges[rowNumber]
: null; : null;
return mergedRangeRowInfo != null return mergedRangeRowInfo != null
&& columnNumber < mergedRangeRowInfo.length ? mergedRangeRowInfo[columnNumber] && columnNumber < mergedRangeRowInfo.length ? mergedRangeRowInfo[columnNumber]
: null; : null;
} }
static boolean isEmpty( String str ) static boolean isEmpty(String str) {
{
return str == null || str.length() == 0; return str == null || str.length() == 0;
} }
static boolean isNotEmpty( String str ) static boolean isNotEmpty(String str) {
{ return !isEmpty(str);
return !isEmpty( str );
} }
public static HSSFWorkbook loadXls(File xlsFile ) throws IOException { public static HSSFWorkbook loadXls(File xlsFile) throws IOException {
try (final FileInputStream inputStream = new FileInputStream( xlsFile )) { try (final FileInputStream inputStream = new FileInputStream(xlsFile)) {
return new HSSFWorkbook( inputStream ); return new HSSFWorkbook(inputStream);
} }
} }
public static void appendAlign(StringBuilder style, HorizontalAlignment alignment) {
String cssAlign = getAlign(alignment);
if (isEmpty(cssAlign)) {
return;
}
style.append("text-align:");
style.append(cssAlign);
style.append(";");
}
/**
* Creates a map (i.e. two-dimensional array) filled with ranges. Allow fast
* retrieving {@link CellRangeAddress} of any cell, if cell is contained in
* range.
*
* @see #getMergedRange(CellRangeAddress[][], int, int)
*/
public static CellRangeAddress[][] buildMergedRangesMap(Sheet sheet) {
CellRangeAddress[][] mergedRanges = new CellRangeAddress[1][];
for (final CellRangeAddress cellRangeAddress : sheet.getMergedRegions()) {
final int requiredHeight = cellRangeAddress.getLastRow() + 1;
if (mergedRanges.length < requiredHeight) {
mergedRanges = Arrays.copyOf(mergedRanges, requiredHeight, CellRangeAddress[][].class);
}
for (int r = cellRangeAddress.getFirstRow(); r <= cellRangeAddress
.getLastRow(); r++) {
final int requiredWidth = cellRangeAddress.getLastColumn() + 1;
CellRangeAddress[] rowMerged = mergedRanges[r];
if (rowMerged == null) {
rowMerged = new CellRangeAddress[requiredWidth];
mergedRanges[r] = rowMerged;
} else {
final int rowMergedLength = rowMerged.length;
if (rowMergedLength < requiredWidth) {
rowMerged = mergedRanges[r] =
Arrays.copyOf(rowMerged, requiredWidth, CellRangeAddress[].class);
}
}
Arrays.fill(rowMerged, cellRangeAddress.getFirstColumn(),
cellRangeAddress.getLastColumn() + 1, cellRangeAddress);
}
}
return mergedRanges;
}
} }

View File

@ -16,6 +16,16 @@
==================================================================== */ ==================================================================== */
package org.apache.poi.hssf.converter; package org.apache.poi.hssf.converter;
import static org.apache.poi.hssf.converter.AbstractExcelUtils.appendAlign;
import static org.apache.poi.hssf.converter.AbstractExcelUtils.buildMergedRangesMap;
import static org.apache.poi.hssf.converter.AbstractExcelUtils.getBorderStyle;
import static org.apache.poi.hssf.converter.AbstractExcelUtils.getBorderWidth;
import static org.apache.poi.hssf.converter.AbstractExcelUtils.getColor;
import static org.apache.poi.hssf.converter.AbstractExcelUtils.getMergedRange;
import static org.apache.poi.hssf.converter.AbstractExcelUtils.isEmpty;
import static org.apache.poi.hssf.converter.AbstractExcelUtils.isNotEmpty;
import static org.apache.poi.hssf.converter.AbstractExcelUtils.loadXls;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@ -53,8 +63,6 @@ import org.w3c.dom.Text;
/** /**
* Converts xls files (97-2007) to HTML file. * Converts xls files (97-2007) to HTML file.
*
* @author Sergey Vladimirov (vlsergey {at} gmail {dot} com)
*/ */
@Beta @Beta
public class ExcelToHtmlConverter extends AbstractExcelConverter { public class ExcelToHtmlConverter extends AbstractExcelConverter {
@ -69,37 +77,36 @@ public class ExcelToHtmlConverter extends AbstractExcelConverter {
* Where infile is an input .xls file ( Word 97-2007) which will be rendered * Where infile is an input .xls file ( Word 97-2007) which will be rendered
* as HTML into outfile * as HTML into outfile
*/ */
public static void main( String[] args ) throws Exception { public static void main(String[] args) throws Exception {
if ( args.length < 2 ) { if (args.length < 2) {
System.err.println( "Usage: ExcelToHtmlConverter <inputFile.xls> <saveTo.html>" ); System.err.println("Usage: ExcelToHtmlConverter <inputFile.xls> <saveTo.html>");
return; return;
} }
System.out.println( "Converting " + args[0] ); System.out.println("Converting " + args[0]);
System.out.println( "Saving output to " + args[1] ); System.out.println("Saving output to " + args[1]);
Document doc = ExcelToHtmlConverter.process( new File( args[0] ) ); Document doc = ExcelToHtmlConverter.process(new File(args[0]));
DOMSource domSource = new DOMSource( doc ); DOMSource domSource = new DOMSource(doc);
StreamResult streamResult = new StreamResult( new File(args[1]) ); StreamResult streamResult = new StreamResult(new File(args[1]));
Transformer serializer = XMLHelper.newTransformer(); Transformer serializer = XMLHelper.newTransformer();
// TODO set encoding from a command argument // TODO set encoding from a command argument
serializer.setOutputProperty( OutputKeys.METHOD, "html" ); serializer.setOutputProperty(OutputKeys.METHOD, "html");
serializer.transform( domSource, streamResult ); serializer.transform(domSource, streamResult);
} }
/** /**
* Converts Excel file (97-2007) into HTML file. * Converts Excel file (97-2007) into HTML file.
* *
* @param xlsFile * @param xlsFile workbook file to process
* workbook file to process
* @return DOM representation of result HTML * @return DOM representation of result HTML
* @throws IOException If an error occurs reading or writing files * @throws IOException If an error occurs reading or writing files
* @throws ParserConfigurationException If configuration is incorrect * @throws ParserConfigurationException If configuration is incorrect
*/ */
public static Document process( File xlsFile ) throws IOException, ParserConfigurationException { public static Document process(File xlsFile) throws IOException, ParserConfigurationException {
try (HSSFWorkbook workbook = AbstractExcelUtils.loadXls(xlsFile)) { try (HSSFWorkbook workbook = loadXls(xlsFile)) {
return ExcelToHtmlConverter.process(workbook); return ExcelToHtmlConverter.process(workbook);
} }
} }
@ -109,10 +116,10 @@ public class ExcelToHtmlConverter extends AbstractExcelConverter {
* *
* @param xlsStream workbook stream to process * @param xlsStream workbook stream to process
* @return DOM representation of result HTML * @return DOM representation of result HTML
* @throws IOException If an error occurs reading or writing files * @throws IOException If an error occurs reading or writing files
* @throws ParserConfigurationException If configuration is incorrect * @throws ParserConfigurationException If configuration is incorrect
*/ */
public static Document process( InputStream xlsStream ) throws IOException, ParserConfigurationException { public static Document process(InputStream xlsStream) throws IOException, ParserConfigurationException {
try (HSSFWorkbook workbook = new HSSFWorkbook(xlsStream)) { try (HSSFWorkbook workbook = new HSSFWorkbook(xlsStream)) {
return ExcelToHtmlConverter.process(workbook); return ExcelToHtmlConverter.process(workbook);
} }
@ -123,13 +130,13 @@ public class ExcelToHtmlConverter extends AbstractExcelConverter {
* *
* @param workbook workbook instance to process * @param workbook workbook instance to process
* @return DOM representation of result HTML * @return DOM representation of result HTML
* @throws IOException If an error occurs reading or writing files * @throws IOException If an error occurs reading or writing files
* @throws ParserConfigurationException If configuration is incorrect * @throws ParserConfigurationException If configuration is incorrect
*/ */
public static Document process( HSSFWorkbook workbook ) throws IOException, ParserConfigurationException { public static Document process(HSSFWorkbook workbook) throws IOException, ParserConfigurationException {
ExcelToHtmlConverter excelToHtmlConverter = new ExcelToHtmlConverter( ExcelToHtmlConverter excelToHtmlConverter = new ExcelToHtmlConverter(
XMLHelper.newDocumentBuilder().newDocument() ); XMLHelper.newDocumentBuilder().newDocument());
excelToHtmlConverter.processWorkbook( workbook ); excelToHtmlConverter.processWorkbook(workbook);
return excelToHtmlConverter.getDocument(); return excelToHtmlConverter.getDocument();
} }
@ -145,221 +152,215 @@ public class ExcelToHtmlConverter extends AbstractExcelConverter {
private String cssClassPrefixTable = "t"; private String cssClassPrefixTable = "t";
private Map<Short, String> excelStyleToClass = new LinkedHashMap<>(); private final Map<Short, String> excelStyleToClass = new LinkedHashMap<>();
private final HtmlDocumentFacade htmlDocumentFacade; private final HtmlDocumentFacade htmlDocumentFacade;
private boolean useDivsToSpan; private boolean useDivsToSpan;
public ExcelToHtmlConverter( Document doc ) public ExcelToHtmlConverter(Document doc) {
{ htmlDocumentFacade = new HtmlDocumentFacade(doc);
htmlDocumentFacade = new HtmlDocumentFacade( doc );
} }
public ExcelToHtmlConverter( HtmlDocumentFacade htmlDocumentFacade ) { public ExcelToHtmlConverter(HtmlDocumentFacade htmlDocumentFacade) {
this.htmlDocumentFacade = htmlDocumentFacade; this.htmlDocumentFacade = htmlDocumentFacade;
} }
protected String buildStyle( HSSFWorkbook workbook, HSSFCellStyle cellStyle ) { protected String buildStyle(HSSFWorkbook workbook, HSSFCellStyle cellStyle) {
StringBuilder style = new StringBuilder(); StringBuilder style = new StringBuilder();
style.append( "white-space:pre-wrap;" ); style.append("white-space:pre-wrap;");
ExcelToHtmlUtils.appendAlign( style, cellStyle.getAlignment() ); appendAlign(style, cellStyle.getAlignment());
switch (cellStyle.getFillPattern()) { switch (cellStyle.getFillPattern()) {
// no fill // no fill
case NO_FILL: break; case NO_FILL:
break;
case SOLID_FOREGROUND: case SOLID_FOREGROUND:
final HSSFColor foregroundColor = cellStyle.getFillForegroundColorColor(); final HSSFColor foregroundColor = cellStyle.getFillForegroundColorColor();
if ( foregroundColor == null ) break; if (foregroundColor == null) {
String fgCol = AbstractExcelUtils.getColor( foregroundColor ); break;
}
String fgCol = getColor(foregroundColor);
style.append("background-color:").append(fgCol).append(";"); style.append("background-color:").append(fgCol).append(";");
break; break;
default: default:
final HSSFColor backgroundColor = cellStyle.getFillBackgroundColorColor(); final HSSFColor backgroundColor = cellStyle.getFillBackgroundColorColor();
if ( backgroundColor == null ) break; if (backgroundColor == null) {
String bgCol = AbstractExcelUtils.getColor( backgroundColor ); break;
}
String bgCol = getColor(backgroundColor);
style.append("background-color:").append(bgCol).append(";"); style.append("background-color:").append(bgCol).append(";");
break; break;
} }
buildStyle_border( workbook, style, "top", cellStyle.getBorderTop(), buildStyle_border(workbook, style, "top", cellStyle.getBorderTop(),
cellStyle.getTopBorderColor() ); cellStyle.getTopBorderColor());
buildStyle_border( workbook, style, "right", buildStyle_border(workbook, style, "right",
cellStyle.getBorderRight(), cellStyle.getRightBorderColor() ); cellStyle.getBorderRight(), cellStyle.getRightBorderColor());
buildStyle_border( workbook, style, "bottom", buildStyle_border(workbook, style, "bottom",
cellStyle.getBorderBottom(), cellStyle.getBottomBorderColor() ); cellStyle.getBorderBottom(), cellStyle.getBottomBorderColor());
buildStyle_border( workbook, style, "left", cellStyle.getBorderLeft(), buildStyle_border(workbook, style, "left", cellStyle.getBorderLeft(),
cellStyle.getLeftBorderColor() ); cellStyle.getLeftBorderColor());
HSSFFont font = cellStyle.getFont( workbook ); HSSFFont font = cellStyle.getFont(workbook);
buildStyle_font( workbook, style, font ); buildStyle_font(workbook, style, font);
return style.toString(); return style.toString();
} }
private void buildStyle_border( HSSFWorkbook workbook, StringBuilder style, private void buildStyle_border(HSSFWorkbook workbook, StringBuilder style,
String type, BorderStyle xlsBorder, short borderColor ) { String type, BorderStyle xlsBorder, short borderColor) {
if ( xlsBorder == BorderStyle.NONE ) { if (xlsBorder == BorderStyle.NONE) {
return; return;
} }
StringBuilder borderStyle = new StringBuilder(); StringBuilder borderStyle = new StringBuilder();
borderStyle.append( AbstractExcelUtils.getBorderWidth( xlsBorder ) ); borderStyle.append(getBorderWidth(xlsBorder));
borderStyle.append( ' ' ); borderStyle.append(' ');
borderStyle.append( AbstractExcelUtils.getBorderStyle( xlsBorder ) ); borderStyle.append(getBorderStyle(xlsBorder));
final HSSFColor color = workbook.getCustomPalette().getColor( final HSSFColor color = workbook.getCustomPalette().getColor(borderColor);
borderColor ); if (color != null) {
if ( color != null ) borderStyle.append(' ');
{ borderStyle.append(getColor(color));
borderStyle.append( ' ' );
borderStyle.append( AbstractExcelUtils.getColor( color ) );
} }
style.append("border-").append(type).append(":").append(borderStyle).append(";"); style.append("border-").append(type).append(":").append(borderStyle).append(";");
} }
void buildStyle_font( HSSFWorkbook workbook, StringBuilder style, void buildStyle_font(HSSFWorkbook workbook, StringBuilder style,
HSSFFont font ) { HSSFFont font) {
if ( font.getBold() ) if (font.getBold()) {
{ style.append("font-weight:bold;");
style.append( "font-weight:bold;" );
} }
final HSSFColor fontColor = workbook.getCustomPalette().getColor( final HSSFColor fontColor = workbook.getCustomPalette().getColor(
font.getColor() ); font.getColor());
if ( fontColor != null ) if (fontColor != null) {
style.append("color: ").append(AbstractExcelUtils.getColor(fontColor)).append("; "); style.append("color: ").append(getColor(fontColor)).append("; ");
}
if ( font.getFontHeightInPoints() != 0 ) if (font.getFontHeightInPoints() != 0) {
style.append("font-size:").append(font.getFontHeightInPoints()).append("pt;"); style.append("font-size:").append(font.getFontHeightInPoints()).append("pt;");
}
if ( font.getItalic() ) if (font.getItalic()) {
{ style.append("font-style:italic;");
style.append( "font-style:italic;" );
} }
} }
public String getCssClassPrefixCell() public String getCssClassPrefixCell() {
{
return cssClassPrefixCell; return cssClassPrefixCell;
} }
public String getCssClassPrefixDiv() public String getCssClassPrefixDiv() {
{
return cssClassPrefixDiv; return cssClassPrefixDiv;
} }
public String getCssClassPrefixRow() public String getCssClassPrefixRow() {
{
return cssClassPrefixRow; return cssClassPrefixRow;
} }
public String getCssClassPrefixTable() public String getCssClassPrefixTable() {
{
return cssClassPrefixTable; return cssClassPrefixTable;
} }
public Document getDocument() public Document getDocument() {
{
return htmlDocumentFacade.getDocument(); return htmlDocumentFacade.getDocument();
} }
protected String getStyleClassName( HSSFWorkbook workbook, protected String getStyleClassName(HSSFWorkbook workbook,
HSSFCellStyle cellStyle ) { HSSFCellStyle cellStyle) {
final Short cellStyleKey = Short.valueOf( cellStyle.getIndex() ); final Short cellStyleKey = Short.valueOf(cellStyle.getIndex());
String knownClass = excelStyleToClass.get( cellStyleKey ); String knownClass = excelStyleToClass.get(cellStyleKey);
if ( knownClass != null ) if (knownClass != null) {
return knownClass; return knownClass;
}
String cssStyle = buildStyle( workbook, cellStyle ); String cssStyle = buildStyle(workbook, cellStyle);
String cssClass = htmlDocumentFacade.getOrCreateCssClass( String cssClass = htmlDocumentFacade.getOrCreateCssClass(
cssClassPrefixCell, cssStyle ); cssClassPrefixCell, cssStyle);
excelStyleToClass.put( cellStyleKey, cssClass ); excelStyleToClass.put(cellStyleKey, cssClass);
return cssClass; return cssClass;
} }
public boolean isUseDivsToSpan() public boolean isUseDivsToSpan() {
{
return useDivsToSpan; return useDivsToSpan;
} }
protected boolean processCell( HSSFCell cell, Element tableCellElement, protected boolean processCell(HSSFCell cell, Element tableCellElement,
int normalWidthPx, int maxSpannedWidthPx, float normalHeightPt ) { int normalWidthPx, int maxSpannedWidthPx, float normalHeightPt) {
final HSSFCellStyle cellStyle = cell.getCellStyle(); final HSSFCellStyle cellStyle = cell.getCellStyle();
String value; String value;
switch ( cell.getCellType() ) { switch (cell.getCellType()) {
case STRING:
// XXX: enrich
value = cell.getRichStringCellValue().getString();
break;
case FORMULA:
switch ( cell.getCachedFormulaResultType() ) {
case STRING: case STRING:
HSSFRichTextString str = cell.getRichStringCellValue(); // XXX: enrich
if ( str != null && str.length() > 0 ) value = cell.getRichStringCellValue().getString();
{ break;
value = ( str.toString() ); case FORMULA:
} switch (cell.getCachedFormulaResultType()) {
else case STRING:
{ HSSFRichTextString str = cell.getRichStringCellValue();
value = AbstractExcelUtils.EMPTY; if (str != null && str.length() > 0) {
value = (str.toString());
} else {
value = AbstractExcelUtils.EMPTY;
}
break;
case NUMERIC:
double nValue = cell.getNumericCellValue();
short df = cellStyle.getDataFormat();
String dfs = cellStyle.getDataFormatString();
value = _formatter.formatRawCellContents(nValue, df, dfs);
break;
case BOOLEAN:
value = String.valueOf(cell.getBooleanCellValue());
break;
case ERROR:
value = ErrorEval.getText(cell.getErrorCellValue());
break;
default:
LOG.atWarn().log("Unexpected cell cachedFormulaResultType ({})", cell.getCachedFormulaResultType());
value = AbstractExcelUtils.EMPTY;
break;
} }
break; break;
case NUMERIC: case BLANK:
double nValue = cell.getNumericCellValue();
short df = cellStyle.getDataFormat();
String dfs = cellStyle.getDataFormatString();
value = _formatter.formatRawCellContents(nValue, df, dfs);
break;
case BOOLEAN:
value = String.valueOf( cell.getBooleanCellValue() );
break;
case ERROR:
value = ErrorEval.getText( cell.getErrorCellValue() );
break;
default:
LOG.atWarn().log("Unexpected cell cachedFormulaResultType ({})", cell.getCachedFormulaResultType());
value = AbstractExcelUtils.EMPTY; value = AbstractExcelUtils.EMPTY;
break; break;
} case NUMERIC:
break; value = _formatter.formatCellValue(cell);
case BLANK: break;
value = AbstractExcelUtils.EMPTY; case BOOLEAN:
break; value = String.valueOf(cell.getBooleanCellValue());
case NUMERIC: break;
value = _formatter.formatCellValue( cell ); case ERROR:
break; value = ErrorEval.getText(cell.getErrorCellValue());
case BOOLEAN: break;
value = String.valueOf( cell.getBooleanCellValue() ); default:
break; LOG.atWarn().log("Unexpected cell type ({})", cell.getCellType());
case ERROR: return true;
value = ErrorEval.getText( cell.getErrorCellValue() );
break;
default:
LOG.atWarn().log("Unexpected cell type ({})", cell.getCellType());
return true;
} }
final boolean noText = AbstractExcelUtils.isEmpty( value ); final boolean noText = isEmpty(value);
final boolean wrapInDivs = !noText && isUseDivsToSpan() && !cellStyle.getWrapText(); final boolean wrapInDivs = !noText && isUseDivsToSpan() && !cellStyle.getWrapText();
if ( cellStyle.getIndex() != 0 ) { if (cellStyle.getIndex() != 0) {
@SuppressWarnings("resource") @SuppressWarnings("resource")
HSSFWorkbook workbook = cell.getRow().getSheet().getWorkbook(); HSSFWorkbook workbook = cell.getRow().getSheet().getWorkbook();
String mainCssClass = getStyleClassName( workbook, cellStyle ); String mainCssClass = getStyleClassName(workbook, cellStyle);
if ( wrapInDivs ) { if (wrapInDivs) {
tableCellElement.setAttribute( "class", mainCssClass + " " tableCellElement.setAttribute("class", mainCssClass + " "
+ cssClassContainerCell ); + cssClassContainerCell);
} else { } else {
tableCellElement.setAttribute( "class", mainCssClass ); tableCellElement.setAttribute("class", mainCssClass);
} }
if ( noText ) { if (noText) {
/* /*
* if cell style is defined (like borders, etc.) but cell text * if cell style is defined (like borders, etc.) but cell text
* is empty, add "&nbsp;" to output, so browser won't collapse * is empty, add "&nbsp;" to output, so browser won't collapse
@ -369,216 +370,219 @@ public class ExcelToHtmlConverter extends AbstractExcelConverter {
} }
} }
if ( isOutputLeadingSpacesAsNonBreaking() && value.startsWith( " " ) ) { if (isOutputLeadingSpacesAsNonBreaking() && value.startsWith(" ")) {
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
for ( int c = 0; c < value.length(); c++ ) for (int c = 0; c < value.length(); c++) {
{ if (value.charAt(c) != ' ') {
if ( value.charAt( c ) != ' ' )
break; break;
builder.append( '\u00a0' ); }
builder.append('\u00a0');
} }
if ( value.length() != builder.length() ) if (value.length() != builder.length()) {
builder.append( value.substring( builder.length() ) ); builder.append(value.substring(builder.length()));
}
value = builder.toString(); value = builder.toString();
} }
Text text = htmlDocumentFacade.createText( value ); Text text = htmlDocumentFacade.createText(value);
if ( wrapInDivs ) { if (wrapInDivs) {
Element outerDiv = htmlDocumentFacade.createBlock(); Element outerDiv = htmlDocumentFacade.createBlock();
outerDiv.setAttribute( "class", this.cssClassContainerDiv ); outerDiv.setAttribute("class", this.cssClassContainerDiv);
Element innerDiv = htmlDocumentFacade.createBlock(); Element innerDiv = htmlDocumentFacade.createBlock();
StringBuilder innerDivStyle = new StringBuilder(); StringBuilder innerDivStyle = new StringBuilder();
innerDivStyle.append( "position:absolute;min-width:" ); innerDivStyle.append("position:absolute;min-width:");
innerDivStyle.append( normalWidthPx ); innerDivStyle.append(normalWidthPx);
innerDivStyle.append( "px;" ); innerDivStyle.append("px;");
if ( maxSpannedWidthPx != Integer.MAX_VALUE ) { if (maxSpannedWidthPx != Integer.MAX_VALUE) {
innerDivStyle.append( "max-width:" ); innerDivStyle.append("max-width:");
innerDivStyle.append( maxSpannedWidthPx ); innerDivStyle.append(maxSpannedWidthPx);
innerDivStyle.append( "px;" ); innerDivStyle.append("px;");
} }
innerDivStyle.append( "overflow:hidden;max-height:" ); innerDivStyle.append("overflow:hidden;max-height:");
innerDivStyle.append( normalHeightPt ); innerDivStyle.append(normalHeightPt);
innerDivStyle.append( "pt;white-space:nowrap;" ); innerDivStyle.append("pt;white-space:nowrap;");
ExcelToHtmlUtils.appendAlign( innerDivStyle, cellStyle.getAlignment() ); appendAlign(innerDivStyle, cellStyle.getAlignment());
htmlDocumentFacade.addStyleClass( outerDiv, cssClassPrefixDiv, htmlDocumentFacade.addStyleClass(outerDiv, cssClassPrefixDiv,
innerDivStyle.toString() ); innerDivStyle.toString());
innerDiv.appendChild( text ); innerDiv.appendChild(text);
outerDiv.appendChild( innerDiv ); outerDiv.appendChild(innerDiv);
tableCellElement.appendChild( outerDiv ); tableCellElement.appendChild(outerDiv);
} else { } else {
tableCellElement.appendChild( text ); tableCellElement.appendChild(text);
} }
return AbstractExcelUtils.isEmpty( value ) && (cellStyle.getIndex() == 0); return isEmpty(value) && (cellStyle.getIndex() == 0);
} }
protected void processColumnHeaders( HSSFSheet sheet, int maxSheetColumns, protected void processColumnHeaders(HSSFSheet sheet, int maxSheetColumns,
Element table ) { Element table) {
Element tableHeader = htmlDocumentFacade.createTableHeader(); Element tableHeader = htmlDocumentFacade.createTableHeader();
table.appendChild( tableHeader ); table.appendChild(tableHeader);
Element tr = htmlDocumentFacade.createTableRow(); Element tr = htmlDocumentFacade.createTableRow();
if ( isOutputRowNumbers() ) { if (isOutputRowNumbers()) {
// empty row at left-top corner // empty row at left-top corner
tr.appendChild( htmlDocumentFacade.createTableHeaderCell() ); tr.appendChild(htmlDocumentFacade.createTableHeaderCell());
} }
for ( int c = 0; c < maxSheetColumns; c++ ) { for (int c = 0; c < maxSheetColumns; c++) {
if ( !isOutputHiddenColumns() && sheet.isColumnHidden( c ) ) if (!isOutputHiddenColumns() && sheet.isColumnHidden(c)) {
continue; continue;
}
Element th = htmlDocumentFacade.createTableHeaderCell(); Element th = htmlDocumentFacade.createTableHeaderCell();
String text = getColumnName( c ); String text = getColumnName(c);
th.appendChild( htmlDocumentFacade.createText( text ) ); th.appendChild(htmlDocumentFacade.createText(text));
tr.appendChild( th ); tr.appendChild(th);
} }
tableHeader.appendChild( tr ); tableHeader.appendChild(tr);
} }
/** /**
* Creates COLGROUP element with width specified for all columns. (Except * Creates COLGROUP element with width specified for all columns. (Except
* first if <tt>{@link #isOutputRowNumbers()}==true</tt>) * first if <tt>{@link #isOutputRowNumbers()}==true</tt>)
*/ */
protected void processColumnWidths( HSSFSheet sheet, int maxSheetColumns, protected void processColumnWidths(HSSFSheet sheet, int maxSheetColumns,
Element table ) { Element table) {
// draw COLS after we know max column number // draw COLS after we know max column number
Element columnGroup = htmlDocumentFacade.createTableColumnGroup(); Element columnGroup = htmlDocumentFacade.createTableColumnGroup();
if ( isOutputRowNumbers() ) if (isOutputRowNumbers()) {
{ columnGroup.appendChild(htmlDocumentFacade.createTableColumn());
columnGroup.appendChild( htmlDocumentFacade.createTableColumn() );
} }
for ( int c = 0; c < maxSheetColumns; c++ ) for (int c = 0; c < maxSheetColumns; c++) {
{ if (!isOutputHiddenColumns() && sheet.isColumnHidden(c)) {
if ( !isOutputHiddenColumns() && sheet.isColumnHidden( c ) )
continue; continue;
}
Element col = htmlDocumentFacade.createTableColumn(); Element col = htmlDocumentFacade.createTableColumn();
col.setAttribute( "width", col.setAttribute("width",
String.valueOf( getColumnWidth( sheet, c ) ) ); String.valueOf(getColumnWidth(sheet, c)));
columnGroup.appendChild( col ); columnGroup.appendChild(col);
} }
table.appendChild( columnGroup ); table.appendChild(columnGroup);
} }
protected void processDocumentInformation(SummaryInformation summaryInformation ) { protected void processDocumentInformation(SummaryInformation summaryInformation) {
if ( AbstractExcelUtils.isNotEmpty( summaryInformation.getTitle() ) ) if (isNotEmpty(summaryInformation.getTitle())) {
htmlDocumentFacade.setTitle( summaryInformation.getTitle() ); htmlDocumentFacade.setTitle(summaryInformation.getTitle());
}
if ( AbstractExcelUtils.isNotEmpty( summaryInformation.getAuthor() ) ) if (isNotEmpty(summaryInformation.getAuthor())) {
htmlDocumentFacade.addAuthor( summaryInformation.getAuthor() ); htmlDocumentFacade.addAuthor(summaryInformation.getAuthor());
}
if ( AbstractExcelUtils.isNotEmpty( summaryInformation.getKeywords() ) ) if (isNotEmpty(summaryInformation.getKeywords())) {
htmlDocumentFacade.addKeywords( summaryInformation.getKeywords() ); htmlDocumentFacade.addKeywords(summaryInformation.getKeywords());
}
if ( AbstractExcelUtils.isNotEmpty( summaryInformation.getComments() ) ) if (isNotEmpty(summaryInformation.getComments())) {
htmlDocumentFacade htmlDocumentFacade
.addDescription( summaryInformation.getComments() ); .addDescription(summaryInformation.getComments());
}
} }
/** /**
* @return maximum 1-base index of column that were rendered, zero if none * @return maximum 1-base index of column that were rendered, zero if none
*/ */
protected int processRow( CellRangeAddress[][] mergedRanges, HSSFRow row, protected int processRow(CellRangeAddress[][] mergedRanges, HSSFRow row,
Element tableRowElement ) { Element tableRowElement) {
final HSSFSheet sheet = row.getSheet(); final HSSFSheet sheet = row.getSheet();
final short maxColIx = row.getLastCellNum(); final short maxColIx = row.getLastCellNum();
if ( maxColIx <= 0 ) if (maxColIx <= 0) {
return 0; return 0;
}
final List<Element> emptyCells = new ArrayList<>(maxColIx); final List<Element> emptyCells = new ArrayList<>(maxColIx);
if ( isOutputRowNumbers() ) if (isOutputRowNumbers()) {
{
Element tableRowNumberCellElement = htmlDocumentFacade Element tableRowNumberCellElement = htmlDocumentFacade
.createTableHeaderCell(); .createTableHeaderCell();
processRowNumber( row, tableRowNumberCellElement ); processRowNumber(row, tableRowNumberCellElement);
emptyCells.add( tableRowNumberCellElement ); emptyCells.add(tableRowNumberCellElement);
} }
int maxRenderedColumn = 0; int maxRenderedColumn = 0;
for ( int colIx = 0; colIx < maxColIx; colIx++ ) for (int colIx = 0; colIx < maxColIx; colIx++) {
{ if (!isOutputHiddenColumns() && sheet.isColumnHidden(colIx)) {
if ( !isOutputHiddenColumns() && sheet.isColumnHidden( colIx ) )
continue; continue;
}
CellRangeAddress range = AbstractExcelUtils.getMergedRange( CellRangeAddress range = getMergedRange(mergedRanges, row.getRowNum(), colIx);
mergedRanges, row.getRowNum(), colIx );
if ( range != null if (range != null
&& ( range.getFirstColumn() != colIx || range.getFirstRow() != row && (range.getFirstColumn() != colIx || range.getFirstRow() != row
.getRowNum() ) ) .getRowNum())) {
continue; continue;
}
HSSFCell cell = row.getCell( colIx ); HSSFCell cell = row.getCell(colIx);
int divWidthPx = 0; int divWidthPx = 0;
if ( isUseDivsToSpan() ) if (isUseDivsToSpan()) {
{ divWidthPx = getColumnWidth(sheet, colIx);
divWidthPx = getColumnWidth( sheet, colIx );
boolean hasBreaks = false; boolean hasBreaks = false;
for ( int nextColumnIndex = colIx + 1; nextColumnIndex < maxColIx; nextColumnIndex++ ) for (int nextColumnIndex = colIx + 1; nextColumnIndex < maxColIx; nextColumnIndex++) {
{ if (!isOutputHiddenColumns()
if ( !isOutputHiddenColumns() && sheet.isColumnHidden(nextColumnIndex)) {
&& sheet.isColumnHidden( nextColumnIndex ) )
continue; continue;
}
if ( row.getCell( nextColumnIndex ) != null if (row.getCell(nextColumnIndex) != null
&& !isTextEmpty( row.getCell( nextColumnIndex ) ) ) && !isTextEmpty(row.getCell(nextColumnIndex))) {
{
hasBreaks = true; hasBreaks = true;
break; break;
} }
divWidthPx += getColumnWidth( sheet, nextColumnIndex ); divWidthPx += getColumnWidth(sheet, nextColumnIndex);
} }
if ( !hasBreaks ) if (!hasBreaks) {
divWidthPx = Integer.MAX_VALUE; divWidthPx = Integer.MAX_VALUE;
}
} }
Element tableCellElement = htmlDocumentFacade.createTableCell(); Element tableCellElement = htmlDocumentFacade.createTableCell();
if ( range != null ) if (range != null) {
{ if (range.getFirstColumn() != range.getLastColumn()) {
if ( range.getFirstColumn() != range.getLastColumn() )
tableCellElement.setAttribute( tableCellElement.setAttribute(
"colspan", "colspan",
String.valueOf( range.getLastColumn() String.valueOf(range.getLastColumn()
- range.getFirstColumn() + 1 ) ); - range.getFirstColumn() + 1));
if ( range.getFirstRow() != range.getLastRow() ) }
if (range.getFirstRow() != range.getLastRow()) {
tableCellElement.setAttribute( tableCellElement.setAttribute(
"rowspan", "rowspan",
String.valueOf( range.getLastRow() String.valueOf(range.getLastRow()
- range.getFirstRow() + 1 ) ); - range.getFirstRow() + 1));
}
} }
boolean emptyCell; boolean emptyCell;
if ( cell != null ) if (cell != null) {
{ emptyCell = processCell(cell, tableCellElement,
emptyCell = processCell( cell, tableCellElement, getColumnWidth(sheet, colIx), divWidthPx,
getColumnWidth( sheet, colIx ), divWidthPx, row.getHeight() / 20f);
row.getHeight() / 20f );
} else { } else {
emptyCell = true; emptyCell = true;
} }
if ( emptyCell ) { if (emptyCell) {
emptyCells.add( tableCellElement ); emptyCells.add(tableCellElement);
} else { } else {
for ( Element emptyCellElement : emptyCells ) for (Element emptyCellElement : emptyCells) {
{ tableRowElement.appendChild(emptyCellElement);
tableRowElement.appendChild( emptyCellElement );
} }
emptyCells.clear(); emptyCells.clear();
tableRowElement.appendChild( tableCellElement ); tableRowElement.appendChild(tableCellElement);
maxRenderedColumn = colIx; maxRenderedColumn = colIx;
} }
} }
@ -586,122 +590,120 @@ public class ExcelToHtmlConverter extends AbstractExcelConverter {
return maxRenderedColumn + 1; return maxRenderedColumn + 1;
} }
protected void processRowNumber( HSSFRow row, protected void processRowNumber(HSSFRow row,
Element tableRowNumberCellElement ) { Element tableRowNumberCellElement) {
tableRowNumberCellElement.setAttribute( "class", "rownumber" ); tableRowNumberCellElement.setAttribute("class", "rownumber");
Text text = htmlDocumentFacade.createText( getRowName( row ) ); Text text = htmlDocumentFacade.createText(getRowName(row));
tableRowNumberCellElement.appendChild( text ); tableRowNumberCellElement.appendChild(text);
} }
protected void processSheet( HSSFSheet sheet ) { protected void processSheet(HSSFSheet sheet) {
processSheetHeader( htmlDocumentFacade.getBody(), sheet ); processSheetHeader(htmlDocumentFacade.getBody(), sheet);
final int physicalNumberOfRows = sheet.getPhysicalNumberOfRows(); final int physicalNumberOfRows = sheet.getPhysicalNumberOfRows();
if ( physicalNumberOfRows <= 0 ) if (physicalNumberOfRows <= 0) {
return; return;
}
Element table = htmlDocumentFacade.createTable(); Element table = htmlDocumentFacade.createTable();
htmlDocumentFacade.addStyleClass( table, cssClassPrefixTable, htmlDocumentFacade.addStyleClass(table, cssClassPrefixTable,
"border-collapse:collapse;border-spacing:0;" ); "border-collapse:collapse;border-spacing:0;");
Element tableBody = htmlDocumentFacade.createTableBody(); Element tableBody = htmlDocumentFacade.createTableBody();
final CellRangeAddress[][] mergedRanges = ExcelToHtmlUtils final CellRangeAddress[][] mergedRanges = buildMergedRangesMap(sheet);
.buildMergedRangesMap( sheet );
final List<Element> emptyRowElements = new ArrayList<>( final List<Element> emptyRowElements = new ArrayList<>(
physicalNumberOfRows); physicalNumberOfRows);
int maxSheetColumns = 1; int maxSheetColumns = 1;
for ( int r = sheet.getFirstRowNum(); r <= sheet.getLastRowNum(); r++ ) { for (int r = sheet.getFirstRowNum(); r <= sheet.getLastRowNum(); r++) {
HSSFRow row = sheet.getRow( r ); HSSFRow row = sheet.getRow(r);
if ( row == null ) if (row == null) {
continue; continue;
}
if ( !isOutputHiddenRows() && row.getZeroHeight() ) if (!isOutputHiddenRows() && row.getZeroHeight()) {
continue; continue;
}
Element tableRowElement = htmlDocumentFacade.createTableRow(); Element tableRowElement = htmlDocumentFacade.createTableRow();
htmlDocumentFacade.addStyleClass( tableRowElement, htmlDocumentFacade.addStyleClass(tableRowElement,
cssClassPrefixRow, "height:" + ( row.getHeight() / 20f ) cssClassPrefixRow, "height:" + (row.getHeight() / 20f)
+ "pt;" ); + "pt;");
int maxRowColumnNumber = processRow( mergedRanges, row, int maxRowColumnNumber = processRow(mergedRanges, row,
tableRowElement ); tableRowElement);
if ( maxRowColumnNumber == 0 ) { if (maxRowColumnNumber == 0) {
emptyRowElements.add( tableRowElement ); emptyRowElements.add(tableRowElement);
} else { } else {
if ( !emptyRowElements.isEmpty() ) { if (!emptyRowElements.isEmpty()) {
for ( Element emptyRowElement : emptyRowElements ) { for (Element emptyRowElement : emptyRowElements) {
tableBody.appendChild( emptyRowElement ); tableBody.appendChild(emptyRowElement);
} }
emptyRowElements.clear(); emptyRowElements.clear();
} }
tableBody.appendChild( tableRowElement ); tableBody.appendChild(tableRowElement);
} }
maxSheetColumns = Math.max( maxSheetColumns, maxRowColumnNumber ); maxSheetColumns = Math.max(maxSheetColumns, maxRowColumnNumber);
} }
processColumnWidths( sheet, maxSheetColumns, table ); processColumnWidths(sheet, maxSheetColumns, table);
if ( isOutputColumnHeaders() ) { if (isOutputColumnHeaders()) {
processColumnHeaders( sheet, maxSheetColumns, table ); processColumnHeaders(sheet, maxSheetColumns, table);
} }
table.appendChild( tableBody ); table.appendChild(tableBody);
htmlDocumentFacade.getBody().appendChild( table ); htmlDocumentFacade.getBody().appendChild(table);
} }
protected void processSheetHeader( Element htmlBody, HSSFSheet sheet ) { protected void processSheetHeader(Element htmlBody, HSSFSheet sheet) {
Element h2 = htmlDocumentFacade.createHeader2(); Element h2 = htmlDocumentFacade.createHeader2();
h2.appendChild( htmlDocumentFacade.createText( sheet.getSheetName() ) ); h2.appendChild(htmlDocumentFacade.createText(sheet.getSheetName()));
htmlBody.appendChild( h2 ); htmlBody.appendChild(h2);
} }
public void processWorkbook( HSSFWorkbook workbook ) { public void processWorkbook(HSSFWorkbook workbook) {
final SummaryInformation summaryInformation = workbook final SummaryInformation summaryInformation = workbook
.getSummaryInformation(); .getSummaryInformation();
if ( summaryInformation != null ) { if (summaryInformation != null) {
processDocumentInformation( summaryInformation ); processDocumentInformation(summaryInformation);
} }
if ( isUseDivsToSpan() ) { if (isUseDivsToSpan()) {
// prepare CSS classes for later usage // prepare CSS classes for later usage
this.cssClassContainerCell = htmlDocumentFacade this.cssClassContainerCell = htmlDocumentFacade
.getOrCreateCssClass( cssClassPrefixCell, .getOrCreateCssClass(cssClassPrefixCell,
"padding:0;margin:0;align:left;vertical-align:top;" ); "padding:0;margin:0;align:left;vertical-align:top;");
this.cssClassContainerDiv = htmlDocumentFacade.getOrCreateCssClass( this.cssClassContainerDiv = htmlDocumentFacade.getOrCreateCssClass(
cssClassPrefixDiv, "position:relative;" ); cssClassPrefixDiv, "position:relative;");
} }
for ( int s = 0; s < workbook.getNumberOfSheets(); s++ ) { for (int s = 0; s < workbook.getNumberOfSheets(); s++) {
HSSFSheet sheet = workbook.getSheetAt( s ); HSSFSheet sheet = workbook.getSheetAt(s);
processSheet( sheet ); processSheet(sheet);
} }
htmlDocumentFacade.updateStylesheet(); htmlDocumentFacade.updateStylesheet();
} }
public void setCssClassPrefixCell( String cssClassPrefixCell ) public void setCssClassPrefixCell(String cssClassPrefixCell) {
{
this.cssClassPrefixCell = cssClassPrefixCell; this.cssClassPrefixCell = cssClassPrefixCell;
} }
public void setCssClassPrefixDiv( String cssClassPrefixDiv ) public void setCssClassPrefixDiv(String cssClassPrefixDiv) {
{
this.cssClassPrefixDiv = cssClassPrefixDiv; this.cssClassPrefixDiv = cssClassPrefixDiv;
} }
public void setCssClassPrefixRow( String cssClassPrefixRow ) public void setCssClassPrefixRow(String cssClassPrefixRow) {
{
this.cssClassPrefixRow = cssClassPrefixRow; this.cssClassPrefixRow = cssClassPrefixRow;
} }
public void setCssClassPrefixTable( String cssClassPrefixTable ) public void setCssClassPrefixTable(String cssClassPrefixTable) {
{
this.cssClassPrefixTable = cssClassPrefixTable; this.cssClassPrefixTable = cssClassPrefixTable;
} }
@ -713,8 +715,7 @@ public class ExcelToHtmlConverter extends AbstractExcelConverter {
* with INDENT=YES option, because line breaks will make additional * with INDENT=YES option, because line breaks will make additional
* (unwanted) changes * (unwanted) changes
*/ */
public void setUseDivsToSpan( boolean useDivsToSpan ) public void setUseDivsToSpan(boolean useDivsToSpan) {
{
this.useDivsToSpan = useDivsToSpan; this.useDivsToSpan = useDivsToSpan;
} }
} }

View File

@ -1,75 +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.converter;
import java.util.Arrays;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.util.Beta;
@Beta
public class ExcelToHtmlUtils extends AbstractExcelUtils {
public static void appendAlign( StringBuilder style, HorizontalAlignment alignment ) {
String cssAlign = getAlign( alignment );
if ( isEmpty( cssAlign ) )
return;
style.append( "text-align:" );
style.append( cssAlign );
style.append( ";" );
}
/**
* Creates a map (i.e. two-dimensional array) filled with ranges. Allow fast
* retrieving {@link CellRangeAddress} of any cell, if cell is contained in
* range.
*
* @see #getMergedRange(CellRangeAddress[][], int, int)
*/
public static CellRangeAddress[][] buildMergedRangesMap( Sheet sheet ) {
CellRangeAddress[][] mergedRanges = new CellRangeAddress[1][];
for ( final CellRangeAddress cellRangeAddress : sheet.getMergedRegions() ) {
final int requiredHeight = cellRangeAddress.getLastRow() + 1;
if ( mergedRanges.length < requiredHeight ) {
mergedRanges = Arrays.copyOf(mergedRanges, requiredHeight, CellRangeAddress[][].class);
}
for ( int r = cellRangeAddress.getFirstRow(); r <= cellRangeAddress
.getLastRow(); r++ ) {
final int requiredWidth = cellRangeAddress.getLastColumn() + 1;
CellRangeAddress[] rowMerged = mergedRanges[r];
if ( rowMerged == null ) {
rowMerged = new CellRangeAddress[requiredWidth];
mergedRanges[r] = rowMerged;
} else {
final int rowMergedLength = rowMerged.length;
if ( rowMergedLength < requiredWidth ) {
rowMerged = mergedRanges[r] =
Arrays.copyOf(rowMerged, requiredWidth, CellRangeAddress[].class);
}
}
Arrays.fill( rowMerged, cellRangeAddress.getFirstColumn(),
cellRangeAddress.getLastColumn() + 1, cellRangeAddress );
}
}
return mergedRanges;
}
}

View File

@ -58,7 +58,7 @@ public class HwmfBitmapDib implements GenericRecord {
public enum BitCount { public enum BitCount {
/** /**
* The image SHOULD be in either JPEG or PNG format. <6> Neither of these formats includes * The image SHOULD be in either JPEG or PNG format. Neither of these formats includes
* a color table, so this value specifies that no color table is present. See [JFIF] and [RFC2083] * a color table, so this value specifies that no color table is present. See [JFIF] and [RFC2083]
* for more information concerning JPEG and PNG compression formats. * for more information concerning JPEG and PNG compression formats.
*/ */
@ -257,7 +257,7 @@ public class HwmfBitmapDib implements GenericRecord {
headerCompression == Compression.BI_RGB || headerCompression == Compression.BI_RGB ||
headerCompression == Compression.BI_BITFIELDS || headerCompression == Compression.BI_BITFIELDS ||
headerCompression == Compression.BI_CMYK) { headerCompression == Compression.BI_CMYK) {
int fileSize = (int)Math.min(introSize+bodySize,recordSize); int fileSize = Math.min(introSize+bodySize,recordSize);
imageData = IOUtils.safelyAllocate(fileSize, MAX_RECORD_LENGTH); imageData = IOUtils.safelyAllocate(fileSize, MAX_RECORD_LENGTH);
leis.readFully(imageData, 0, introSize); leis.readFully(imageData, 0, introSize);
leis.skipFully(recordSize-fileSize); leis.skipFully(recordSize-fileSize);
@ -271,10 +271,10 @@ public class HwmfBitmapDib implements GenericRecord {
} }
} }
protected int readHeader(LittleEndianInputStream leis) throws IOException { protected int readHeader(LittleEndianInputStream leis) {
int size = 0; int size = 0;
/** /*
* DIBHeaderInfo (variable): Either a BitmapCoreHeader Object or a * DIBHeaderInfo (variable): Either a BitmapCoreHeader Object or a
* BitmapInfoHeader Object that specifies information about the image. * BitmapInfoHeader Object that specifies information about the image.
* *

View File

@ -205,7 +205,7 @@ public final class WordExtractor implements POIOLE2TextExtractor {
/** /**
* Grab the text out of the text pieces. Might also include various bits of * Grab the text out of the text pieces. Might also include various bits of
* crud, but will work in cases where the text piece -> paragraph mapping is * crud, but will work in cases where the text piece -&gt; paragraph mapping is
* broken. Fast too. * broken. Fast too.
*/ */
public String getTextFromPieces() { public String getTextFromPieces() {

View File

@ -23,7 +23,7 @@ import org.apache.poi.util.Internal;
public interface CharIndexTranslator { public interface CharIndexTranslator {
/** /**
* Calculates the byte index of the given char index. * Calculates the byte index of the given char index.
* *
* @param charPos * @param charPos
* The char position * The char position
* @return The byte index * @return The byte index
@ -32,7 +32,7 @@ public interface CharIndexTranslator {
/** /**
* Finds character ranges that includes specified byte range. * Finds character ranges that includes specified byte range.
* *
* @param startBytePosInclusive * @param startBytePosInclusive
* start byte range * start byte range
* @param endBytePosExclusive * @param endBytePosExclusive
@ -43,14 +43,14 @@ public interface CharIndexTranslator {
/** /**
* Check if index is in table * Check if index is in table
* *
* @param bytePos * @param bytePos
* @return true if index in table, false if not * @return true if index in table, false if not
*/ */
boolean isIndexInTable(int bytePos); boolean isIndexInTable(int bytePos);
/** /**
* Return first index >= bytePos that is in table * Return first index &gt;= bytePos that is in table
* *
* @param bytePos * @param bytePos
* @return first index greater or equal to bytePos that is in table * @return first index greater or equal to bytePos that is in table
@ -58,7 +58,7 @@ public interface CharIndexTranslator {
int lookIndexForward(int bytePos); int lookIndexForward(int bytePos);
/** /**
* Return last index <= bytePos that is in table * Return last index &lt;= bytePos that is in table
* *
* @param bytePos * @param bytePos
* @return last index less of equal to bytePos that is in table * @return last index less of equal to bytePos that is in table

View File

@ -137,7 +137,7 @@ public final class ListTables
/** /**
* Get the ListLevel for a given lsid and level * Get the ListLevel for a given lsid and level
* @return ListLevel if found, or <code>null</code> if ListData can't be found or if level is > that available * @return ListLevel if found, or {@code null} if ListData can't be found or if level is &gt; that available
*/ */
public ListLevel getLevel(int lsid, int level) public ListLevel getLevel(int lsid, int level)
{ {

View File

@ -17,6 +17,8 @@
package org.apache.poi.hwpf.model; package org.apache.poi.hwpf.model;
import static org.apache.logging.log4j.util.Unbox.box;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -36,13 +38,11 @@ import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.util.Internal; import org.apache.poi.util.Internal;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndian;
import static org.apache.logging.log4j.util.Unbox.box;
/** /**
* Holds information about all pictures embedded in Word Document either via "Insert -> Picture -> From File" or via * Holds information about all pictures embedded in Word Document either via "Insert -&gt; Picture -&gt; From File" or via
* clipboard. Responsible for images extraction and determining whether some document's piece contains embedded image. * clipboard. Responsible for images extraction and determining whether some document's piece contains embedded image.
* Analyzes raw data bytestream 'Data' (where Word stores all embedded objects) provided by HWPFDocument. * Analyzes raw data bytestream 'Data' (where Word stores all embedded objects) provided by HWPFDocument.
* * <p>
* Word stores images as is within so called "Data stream" - the stream within a Word docfile containing various data * Word stores images as is within so called "Data stream" - the stream within a Word docfile containing various data
* that hang off of characters in the main stream. For example, binary data describing in-line pictures and/or * that hang off of characters in the main stream. For example, binary data describing in-line pictures and/or
* formfields an also embedded objects-native data. Word picture structures are concatenated one after the other in * formfields an also embedded objects-native data. Word picture structures are concatenated one after the other in
@ -60,194 +60,171 @@ public final class PicturesTable {
private static final Logger LOG = LogManager.getLogger(PicturesTable.class); private static final Logger LOG = LogManager.getLogger(PicturesTable.class);
static final int TYPE_IMAGE = 0x08; static final int TYPE_IMAGE = 0x08;
static final int TYPE_IMAGE_WORD2000 = 0x00; static final int TYPE_IMAGE_WORD2000 = 0x00;
static final int TYPE_IMAGE_PASTED_FROM_CLIPBOARD = 0xA; static final int TYPE_IMAGE_PASTED_FROM_CLIPBOARD = 0xA;
static final int TYPE_IMAGE_PASTED_FROM_CLIPBOARD_WORD2000 = 0x2; static final int TYPE_IMAGE_PASTED_FROM_CLIPBOARD_WORD2000 = 0x2;
static final int TYPE_HORIZONTAL_LINE = 0xE; static final int TYPE_HORIZONTAL_LINE = 0xE;
static final int BLOCK_TYPE_OFFSET = 0xE; static final int BLOCK_TYPE_OFFSET = 0xE;
static final int MM_MODE_TYPE_OFFSET = 0x6; static final int MM_MODE_TYPE_OFFSET = 0x6;
private HWPFDocument _document; private final HWPFDocument _document;
private byte[] _dataStream; private final byte[] _dataStream;
private byte[] _mainStream; private final byte[] _mainStream;
@Deprecated @Deprecated
private FSPATable _fspa; private FSPATable _fspa;
@Deprecated @Deprecated
private OfficeArtContent _dgg; private OfficeArtContent _dgg;
/** @link dependency @Deprecated
* @stereotype instantiate*/ public PicturesTable(HWPFDocument _document, byte[] _dataStream, byte[] _mainStream, FSPATable fspa, OfficeArtContent dgg) {
/*# Picture lnkPicture; */ this._document = _document;
this._dataStream = _dataStream;
this._mainStream = _mainStream;
this._fspa = fspa;
this._dgg = dgg;
}
/** public PicturesTable(HWPFDocument _document, byte[] _dataStream,
* byte[] _mainStream) {
* @param _document
* @param _dataStream
*/
@Deprecated
public PicturesTable(HWPFDocument _document, byte[] _dataStream, byte[] _mainStream, FSPATable fspa, OfficeArtContent dgg)
{
this._document = _document;
this._dataStream = _dataStream;
this._mainStream = _mainStream;
this._fspa = fspa;
this._dgg = dgg;
}
public PicturesTable( HWPFDocument _document, byte[] _dataStream,
byte[] _mainStream )
{
this._document = _document; this._document = _document;
this._dataStream = _dataStream; this._dataStream = _dataStream;
this._mainStream = _mainStream; this._mainStream = _mainStream;
} }
/** /**
* determines whether specified CharacterRun contains reference to a picture * determines whether specified CharacterRun contains reference to a picture
* @param run */
*/ public boolean hasPicture(CharacterRun run) {
public boolean hasPicture(CharacterRun run) { if (run == null) {
if (run==null) { return false;
}
if (run.isSpecialCharacter() && !run.isObj() && !run.isOle2() && !run.isData()) {
// Image should be in it's own run, or in a run with the end-of-special marker
if ("\u0001".equals(run.text()) || "\u0001\u0015".equals(run.text())) {
return isBlockContainsImage(run.getPicOffset());
}
}
return false; return false;
} }
if (run.isSpecialCharacter() && !run.isObj() && !run.isOle2() && !run.isData()) { public boolean hasEscherPicture(CharacterRun run) {
// Image should be in it's own run, or in a run with the end-of-special marker return run.isSpecialCharacter() && !run.isObj() && !run.isOle2() && !run.isData() && run.text().startsWith("\u0008");
if("\u0001".equals(run.text()) || "\u0001\u0015".equals(run.text())) {
return isBlockContainsImage(run.getPicOffset());
}
} }
return false;
}
public boolean hasEscherPicture(CharacterRun run) { /**
if (run.isSpecialCharacter() && !run.isObj() && !run.isOle2() && !run.isData() && run.text().startsWith("\u0008")) { * determines whether specified CharacterRun contains reference to a picture
return true; */
public boolean hasHorizontalLine(CharacterRun run) {
if (run.isSpecialCharacter() && "\u0001".equals(run.text())) {
return isBlockContainsHorizontalLine(run.getPicOffset());
}
return false;
} }
return false;
}
/** private boolean isPictureRecognized(short blockType, short mappingModeOfMETAFILEPICT) {
* determines whether specified CharacterRun contains reference to a picture return blockType == TYPE_IMAGE
* @param run || blockType == TYPE_IMAGE_PASTED_FROM_CLIPBOARD
*/ || blockType == TYPE_IMAGE_WORD2000 && mappingModeOfMETAFILEPICT == 0x64
public boolean hasHorizontalLine(CharacterRun run) { || blockType == TYPE_IMAGE_PASTED_FROM_CLIPBOARD_WORD2000 && mappingModeOfMETAFILEPICT == 0x64;
if (run.isSpecialCharacter() && "\u0001".equals(run.text())) {
return isBlockContainsHorizontalLine(run.getPicOffset());
} }
return false;
}
private boolean isPictureRecognized(short blockType, short mappingModeOfMETAFILEPICT) { private static short getBlockType(byte[] dataStream, int pictOffset) {
return (blockType == TYPE_IMAGE || blockType == TYPE_IMAGE_PASTED_FROM_CLIPBOARD || (blockType==TYPE_IMAGE_WORD2000 && mappingModeOfMETAFILEPICT==0x64) || (blockType==TYPE_IMAGE_PASTED_FROM_CLIPBOARD_WORD2000 && mappingModeOfMETAFILEPICT==0x64)); return LittleEndian.getShort(dataStream, pictOffset + BLOCK_TYPE_OFFSET);
}
private static short getBlockType(byte[] dataStream, int pictOffset) {
return LittleEndian.getShort(dataStream, pictOffset + BLOCK_TYPE_OFFSET);
}
private static short getMmMode(byte[] dataStream, int pictOffset) {
return LittleEndian.getShort(dataStream, pictOffset + MM_MODE_TYPE_OFFSET);
}
/**
* Returns picture object tied to specified CharacterRun
* @param run
* @param fillBytes if true, Picture will be returned with filled byte array that represent picture's contents. If you don't want
* to have that byte array in memory but only write picture's contents to stream, pass false and then use Picture.writeImageContent
* @see Picture#writeImageContent(OutputStream)
* @return a Picture object if picture exists for specified CharacterRun, null otherwise. PicturesTable.hasPicture is used to determine this.
* @see #hasPicture(CharacterRun)
*/
public Picture extractPicture(CharacterRun run, boolean fillBytes) {
if (hasPicture(run)) {
return new Picture(run.getPicOffset(), _dataStream, fillBytes);
} }
return null;
}
/** private static short getMmMode(byte[] dataStream, int pictOffset) {
return LittleEndian.getShort(dataStream, pictOffset + MM_MODE_TYPE_OFFSET);
}
/**
* Returns picture object tied to specified CharacterRun
*
* @param fillBytes if true, Picture will be returned with filled byte array that represent picture's contents. If you don't want
* to have that byte array in memory but only write picture's contents to stream, pass false and then use Picture.writeImageContent
* @return a Picture object if picture exists for specified CharacterRun, null otherwise. PicturesTable.hasPicture is used to determine this.
* @see Picture#writeImageContent(OutputStream)
* @see #hasPicture(CharacterRun)
*/
public Picture extractPicture(CharacterRun run, boolean fillBytes) {
if (hasPicture(run)) {
return new Picture(run.getPicOffset(), _dataStream, fillBytes);
}
return null;
}
/**
* Performs a search for pictures in the given list of escher records. * Performs a search for pictures in the given list of escher records.
* *
* @param escherRecords the escher records. * @param escherRecords the escher records.
* @param pictures the list to populate with the pictures. * @param pictures the list to populate with the pictures.
*/ */
private void searchForPictures(List<EscherRecord> escherRecords, List<Picture> pictures) private void searchForPictures(List<EscherRecord> escherRecords, List<Picture> pictures) {
{ for (EscherRecord escherRecord : escherRecords) {
for(EscherRecord escherRecord : escherRecords) { if (escherRecord instanceof EscherBSERecord) {
if (escherRecord instanceof EscherBSERecord) { EscherBSERecord bse = (EscherBSERecord) escherRecord;
EscherBSERecord bse = (EscherBSERecord) escherRecord; EscherBlipRecord blip = bse.getBlipRecord();
EscherBlipRecord blip = bse.getBlipRecord(); if (blip != null) {
if (blip != null) pictures.add(new Picture(blip));
{ } else if (bse.getOffset() > 0) {
pictures.add(new Picture(blip)); try {
}
else if ( bse.getOffset() > 0 )
{
try
{
// Blip stored in delay stream, which in a word doc, is // Blip stored in delay stream, which in a word doc, is
// the main stream // the main stream
EscherRecordFactory recordFactory = new DefaultEscherRecordFactory(); EscherRecordFactory recordFactory = new DefaultEscherRecordFactory();
EscherRecord record = recordFactory.createRecord( EscherRecord record = recordFactory.createRecord(
_mainStream, bse.getOffset() ); _mainStream, bse.getOffset());
if ( record instanceof EscherBlipRecord ) if (record instanceof EscherBlipRecord) {
{ record.fillFields(_mainStream, bse.getOffset(),
record.fillFields( _mainStream, bse.getOffset(), recordFactory);
recordFactory );
blip = (EscherBlipRecord) record; blip = (EscherBlipRecord) record;
pictures.add( new Picture( blip ) ); pictures.add(new Picture(blip));
} }
} } catch (Exception exc) {
catch ( Exception exc )
{
LOG.atWarn().withThrowable(exc).log("Unable to load picture from BLIP record at offset #{}", box(bse.getOffset())); LOG.atWarn().withThrowable(exc).log("Unable to load picture from BLIP record at offset #{}", box(bse.getOffset()));
} }
} }
} }
} }
} }
/** /**
* Not all documents have all the images concatenated in the data stream * Not all documents have all the images concatenated in the data stream
* although MS claims so. The best approach is to scan all character runs. * although MS claims so. The best approach is to scan all character runs.
* *
* @return a list of Picture objects found in current document * @return a list of Picture objects found in current document
*/ */
public List<Picture> getAllPictures() { public List<Picture> getAllPictures() {
ArrayList<Picture> pictures = new ArrayList<>(); ArrayList<Picture> pictures = new ArrayList<>();
Range range = _document.getOverallRange(); Range range = _document.getOverallRange();
for (int i = 0; i < range.numCharacterRuns(); i++) { for (int i = 0; i < range.numCharacterRuns(); i++) {
CharacterRun run = range.getCharacterRun(i); CharacterRun run = range.getCharacterRun(i);
if (run==null) { if (run == null) {
continue; continue;
}
Picture picture = extractPicture(run, false);
if (picture != null) {
pictures.add(picture);
}
} }
Picture picture = extractPicture(run, false); EscherContainerRecord bStore = _dgg.getBStoreContainer();
if (picture != null) { if (bStore != null) {
pictures.add(picture); searchForPictures(bStore.getChildRecords(), pictures);
} }
}
EscherContainerRecord bStore = _dgg.getBStoreContainer(); return pictures;
if (bStore != null) { }
searchForPictures(bStore.getChildRecords(), pictures);
}
return pictures; private boolean isBlockContainsImage(int i) {
} return isPictureRecognized(getBlockType(_dataStream, i), getMmMode(_dataStream, i));
}
private boolean isBlockContainsImage(int i) private boolean isBlockContainsHorizontalLine(int i) {
{ return getBlockType(_dataStream, i) == TYPE_HORIZONTAL_LINE && getMmMode(_dataStream, i) == 0x64;
return isPictureRecognized(getBlockType(_dataStream, i), getMmMode(_dataStream, i)); }
}
private boolean isBlockContainsHorizontalLine(int i)
{
return getBlockType(_dataStream, i)==TYPE_HORIZONTAL_LINE && getMmMode(_dataStream, i)==0x64;
}
} }

View File

@ -56,17 +56,13 @@ public abstract class FRDAbstractType {
public String toString() public String toString()
{ {
StringBuilder builder = new StringBuilder(); return "[FRD]\n" +
builder.append( "[FRD]\n" ); " .nAuto = (" + getNAuto() + " )\n" +
builder.append( " .nAuto = " ); "[/FRD]\n";
builder.append( " (" ).append( getNAuto() ).append( " )\n" );
builder.append( "[/FRD]\n" );
return builder.toString();
} }
/** /**
* If > 0, the note is an automatically numbered note, otherwise it has a * If &gt; 0, the note is an automatically numbered note, otherwise it has a
* custom mark. * custom mark.
*/ */
public short getNAuto() public short getNAuto()
@ -75,7 +71,7 @@ public abstract class FRDAbstractType {
} }
/** /**
* If > 0, the note is an automatically numbered note, otherwise it has a * If &gt; 0, the note is an automatically numbered note, otherwise it has a
* custom mark. * custom mark.
*/ */
public void setNAuto( short field_1_nAuto ) public void setNAuto( short field_1_nAuto )
@ -83,4 +79,4 @@ public abstract class FRDAbstractType {
this.field_1_nAuto = field_1_nAuto; this.field_1_nAuto = field_1_nAuto;
} }
} // END OF CLASS }

View File

@ -81,7 +81,7 @@ public abstract class GrfhicAbstractType
*/ */
public static int getSize() public static int getSize()
{ {
return 0 + 1; return 1;
} }
@Override @Override
@ -94,9 +94,7 @@ public abstract class GrfhicAbstractType
if ( getClass() != obj.getClass() ) if ( getClass() != obj.getClass() )
return false; return false;
GrfhicAbstractType other = (GrfhicAbstractType) obj; GrfhicAbstractType other = (GrfhicAbstractType) obj;
if ( field_1_grfhic != other.field_1_grfhic ) return field_1_grfhic == other.field_1_grfhic;
return false;
return true;
} }
@Override @Override
@ -106,22 +104,19 @@ public abstract class GrfhicAbstractType
public String toString() public String toString()
{ {
StringBuilder builder = new StringBuilder(); String builder = "[Grfhic]\n" +
" .grfhic = " +
builder.append("[Grfhic]\n"); " ( " + field_1_grfhic + " )\n" +
builder.append( " .grfhic = " ); " .fHtmlChecked = " + isFHtmlChecked() + '\n' +
builder.append(" ( ").append( field_1_grfhic ).append( " )\n" ); " .fHtmlUnsupported = " + isFHtmlUnsupported() + '\n' +
builder.append(" .fHtmlChecked = ").append(isFHtmlChecked()).append('\n'); " .fHtmlListTextNotSharpDot = " + isFHtmlListTextNotSharpDot() + '\n' +
builder.append(" .fHtmlUnsupported = ").append(isFHtmlUnsupported()).append('\n'); " .fHtmlNotPeriod = " + isFHtmlNotPeriod() + '\n' +
builder.append(" .fHtmlListTextNotSharpDot = ").append(isFHtmlListTextNotSharpDot()).append('\n'); " .fHtmlFirstLineMismatch = " + isFHtmlFirstLineMismatch() + '\n' +
builder.append(" .fHtmlNotPeriod = ").append(isFHtmlNotPeriod()).append('\n'); " .fHtmlTabLeftIndentMismatch = " + isFHtmlTabLeftIndentMismatch() + '\n' +
builder.append(" .fHtmlFirstLineMismatch = ").append(isFHtmlFirstLineMismatch()).append('\n'); " .fHtmlHangingIndentBeneathNumber = " + isFHtmlHangingIndentBeneathNumber() + '\n' +
builder.append(" .fHtmlTabLeftIndentMismatch = ").append(isFHtmlTabLeftIndentMismatch()).append('\n'); " .fHtmlBuiltInBullet = " + isFHtmlBuiltInBullet() + '\n' +
builder.append(" .fHtmlHangingIndentBeneathNumber = ").append(isFHtmlHangingIndentBeneathNumber()).append('\n'); "[/Grfhic]";
builder.append(" .fHtmlBuiltInBullet = ").append(isFHtmlBuiltInBullet()).append('\n'); return builder;
builder.append("[/Grfhic]");
return builder.toString();
} }
/** /**
@ -164,7 +159,7 @@ public abstract class GrfhicAbstractType
/** /**
* Sets the fHtmlUnsupported field value. * Sets the fHtmlUnsupported field value.
* The numbering sequence or format is unsupported (includes tab & size) * The numbering sequence or format is unsupported (includes tab &amp; size)
*/ */
@Internal @Internal
public void setFHtmlUnsupported( boolean value ) public void setFHtmlUnsupported( boolean value )
@ -173,7 +168,7 @@ public abstract class GrfhicAbstractType
} }
/** /**
* The numbering sequence or format is unsupported (includes tab & size) * The numbering sequence or format is unsupported (includes tab &amp; size)
* @return the fHtmlUnsupported field value. * @return the fHtmlUnsupported field value.
*/ */
@Internal @Internal

View File

@ -247,174 +247,91 @@ public abstract class PAPAbstractType {
} }
public String toString() public String toString() {
{ return "[PAP]\n" +
StringBuilder builder = new StringBuilder(); " .istd = (" + getIstd() + " )\n" +
builder.append("[PAP]\n"); " .fSideBySide = (" + getFSideBySide() + " )\n" +
builder.append(" .istd = "); " .fKeep = (" + getFKeep() + " )\n" +
builder.append(" (").append(getIstd()).append(" )\n"); " .fKeepFollow = (" + getFKeepFollow() + " )\n" +
builder.append(" .fSideBySide = "); " .fPageBreakBefore = (" + getFPageBreakBefore() + " )\n" +
builder.append(" (").append(getFSideBySide()).append(" )\n"); " .brcl = (" + getBrcl() + " )\n" +
builder.append(" .fKeep = "); " .brcp = (" + getBrcp() + " )\n" +
builder.append(" (").append(getFKeep()).append(" )\n"); " .ilvl = (" + getIlvl() + " )\n" +
builder.append(" .fKeepFollow = "); " .ilfo = (" + getIlfo() + " )\n" +
builder.append(" (").append(getFKeepFollow()).append(" )\n"); " .fNoLnn = (" + getFNoLnn() + " )\n" +
builder.append(" .fPageBreakBefore = "); " .lspd = (" + getLspd() + " )\n" +
builder.append(" (").append(getFPageBreakBefore()).append(" )\n"); " .dyaBefore = (" + getDyaBefore() + " )\n" +
builder.append(" .brcl = "); " .dyaAfter = (" + getDyaAfter() + " )\n" +
builder.append(" (").append(getBrcl()).append(" )\n"); " .fInTable = (" + getFInTable() + " )\n" +
builder.append(" .brcp = "); " .finTableW97 = (" + getFinTableW97() + " )\n" +
builder.append(" (").append(getBrcp()).append(" )\n"); " .fTtp = (" + getFTtp() + " )\n" +
builder.append(" .ilvl = "); " .dxaAbs = (" + getDxaAbs() + " )\n" +
builder.append(" (").append(getIlvl()).append(" )\n"); " .dyaAbs = (" + getDyaAbs() + " )\n" +
builder.append(" .ilfo = "); " .dxaWidth = (" + getDxaWidth() + " )\n" +
builder.append(" (").append(getIlfo()).append(" )\n"); " .fBrLnAbove = (" + getFBrLnAbove() + " )\n" +
builder.append(" .fNoLnn = "); " .fBrLnBelow = (" + getFBrLnBelow() + " )\n" +
builder.append(" (").append(getFNoLnn()).append(" )\n"); " .pcVert = (" + getPcVert() + " )\n" +
builder.append(" .lspd = "); " .pcHorz = (" + getPcHorz() + " )\n" +
builder.append(" (").append(getLspd()).append(" )\n"); " .wr = (" + getWr() + " )\n" +
builder.append(" .dyaBefore = "); " .fNoAutoHyph = (" + getFNoAutoHyph() + " )\n" +
builder.append(" (").append(getDyaBefore()).append(" )\n"); " .dyaHeight = (" + getDyaHeight() + " )\n" +
builder.append(" .dyaAfter = "); " .fMinHeight = (" + getFMinHeight() + " )\n" +
builder.append(" (").append(getDyaAfter()).append(" )\n"); " .dcs = (" + getDcs() + " )\n" +
builder.append(" .fInTable = "); " .dyaFromText = (" + getDyaFromText() + " )\n" +
builder.append(" (").append(getFInTable()).append(" )\n"); " .dxaFromText = (" + getDxaFromText() + " )\n" +
builder.append(" .finTableW97 = "); " .fLocked = (" + getFLocked() + " )\n" +
builder.append(" (").append(getFinTableW97()).append(" )\n"); " .fWidowControl = (" + getFWidowControl() + " )\n" +
builder.append(" .fTtp = "); " .fKinsoku = (" + getFKinsoku() + " )\n" +
builder.append(" (").append(getFTtp()).append(" )\n"); " .fWordWrap = (" + getFWordWrap() + " )\n" +
builder.append(" .dxaAbs = "); " .fOverflowPunct = (" + getFOverflowPunct() + " )\n" +
builder.append(" (").append(getDxaAbs()).append(" )\n"); " .fTopLinePunct = (" + getFTopLinePunct() + " )\n" +
builder.append(" .dyaAbs = "); " .fAutoSpaceDE = (" + getFAutoSpaceDE() + " )\n" +
builder.append(" (").append(getDyaAbs()).append(" )\n"); " .fAutoSpaceDN = (" + getFAutoSpaceDN() + " )\n" +
builder.append(" .dxaWidth = "); " .wAlignFont = (" + getWAlignFont() + " )\n" +
builder.append(" (").append(getDxaWidth()).append(" )\n"); " .fontAlign = (" + getFontAlign() + " )\n" +
builder.append(" .fBrLnAbove = "); " .fVertical = " + isFVertical() + '\n' +
builder.append(" (").append(getFBrLnAbove()).append(" )\n"); " .fBackward = " + isFBackward() + '\n' +
builder.append(" .fBrLnBelow = "); " .fRotateFont = " + isFRotateFont() + '\n' +
builder.append(" (").append(getFBrLnBelow()).append(" )\n"); " .lvl = (" + getLvl() + " )\n" +
builder.append(" .pcVert = "); " .fBiDi = (" + getFBiDi() + " )\n" +
builder.append(" (").append(getPcVert()).append(" )\n"); " .fNumRMIns = (" + getFNumRMIns() + " )\n" +
builder.append(" .pcHorz = "); " .fCrLf = (" + getFCrLf() + " )\n" +
builder.append(" (").append(getPcHorz()).append(" )\n"); " .fUsePgsuSettings = (" + getFUsePgsuSettings() + " )\n" +
builder.append(" .wr = "); " .fAdjustRight = (" + getFAdjustRight() + " )\n" +
builder.append(" (").append(getWr()).append(" )\n"); " .itap = (" + getItap() + " )\n" +
builder.append(" .fNoAutoHyph = "); " .fInnerTableCell = (" + getFInnerTableCell() + " )\n" +
builder.append(" (").append(getFNoAutoHyph()).append(" )\n"); " .fOpenTch = (" + getFOpenTch() + " )\n" +
builder.append(" .dyaHeight = "); " .fTtpEmbedded = (" + getFTtpEmbedded() + " )\n" +
builder.append(" (").append(getDyaHeight()).append(" )\n"); " .dxcRight = (" + getDxcRight() + " )\n" +
builder.append(" .fMinHeight = "); " .dxcLeft = (" + getDxcLeft() + " )\n" +
builder.append(" (").append(getFMinHeight()).append(" )\n"); " .dxcLeft1 = (" + getDxcLeft1() + " )\n" +
builder.append(" .dcs = "); " .fDyaBeforeAuto = (" + getFDyaBeforeAuto() + " )\n" +
builder.append(" (").append(getDcs()).append(" )\n"); " .fDyaAfterAuto = (" + getFDyaAfterAuto() + " )\n" +
builder.append(" .dyaFromText = "); " .dxaRight = (" + getDxaRight() + " )\n" +
builder.append(" (").append(getDyaFromText()).append(" )\n"); " .dxaLeft = (" + getDxaLeft() + " )\n" +
builder.append(" .dxaFromText = "); " .dxaLeft1 = (" + getDxaLeft1() + " )\n" +
builder.append(" (").append(getDxaFromText()).append(" )\n"); " .jc = (" + getJc() + " )\n" +
builder.append(" .fLocked = "); " .brcTop = (" + getBrcTop() + " )\n" +
builder.append(" (").append(getFLocked()).append(" )\n"); " .brcLeft = (" + getBrcLeft() + " )\n" +
builder.append(" .fWidowControl = "); " .brcBottom = (" + getBrcBottom() + " )\n" +
builder.append(" (").append(getFWidowControl()).append(" )\n"); " .brcRight = (" + getBrcRight() + " )\n" +
builder.append(" .fKinsoku = "); " .brcBetween = (" + getBrcBetween() + " )\n" +
builder.append(" (").append(getFKinsoku()).append(" )\n"); " .brcBar = (" + getBrcBar() + " )\n" +
builder.append(" .fWordWrap = "); " .shd = (" + getShd() + " )\n" +
builder.append(" (").append(getFWordWrap()).append(" )\n"); " .anld = (" + Arrays.toString(getAnld()) + " )\n" +
builder.append(" .fOverflowPunct = "); " .phe = (" + Arrays.toString(getPhe()) + " )\n" +
builder.append(" (").append(getFOverflowPunct()).append(" )\n"); " .fPropRMark = (" + getFPropRMark() + " )\n" +
builder.append(" .fTopLinePunct = "); " .ibstPropRMark = (" + getIbstPropRMark() + " )\n" +
builder.append(" (").append(getFTopLinePunct()).append(" )\n"); " .dttmPropRMark = (" + getDttmPropRMark() + " )\n" +
builder.append(" .fAutoSpaceDE = "); " .itbdMac = (" + getItbdMac() + " )\n" +
builder.append(" (").append(getFAutoSpaceDE()).append(" )\n"); " .rgdxaTab = (" + Arrays.toString(getRgdxaTab()) + " )\n" +
builder.append(" .fAutoSpaceDN = "); " .rgtbd = (" + Arrays.toString(getRgtbd()) + " )\n" +
builder.append(" (").append(getFAutoSpaceDN()).append(" )\n"); " .numrm = (" + Arrays.toString(getNumrm()) + " )\n" +
builder.append(" .wAlignFont = "); " .ptap = (" + Arrays.toString(getPtap()) + " )\n" +
builder.append(" (").append(getWAlignFont()).append(" )\n"); " .fNoAllowOverlap = (" + getFNoAllowOverlap() + " )\n" +
builder.append(" .fontAlign = "); " .ipgp = (" + getIpgp() + " )\n" +
builder.append(" (").append(getFontAlign()).append(" )\n"); " .rsid = (" + getRsid() + " )\n" +
builder.append(" .fVertical = ").append(isFVertical()).append('\n'); "[/PAP]\n";
builder.append(" .fBackward = ").append(isFBackward()).append('\n');
builder.append(" .fRotateFont = ").append(isFRotateFont()).append('\n');
builder.append(" .lvl = ");
builder.append(" (").append(getLvl()).append(" )\n");
builder.append(" .fBiDi = ");
builder.append(" (").append(getFBiDi()).append(" )\n");
builder.append(" .fNumRMIns = ");
builder.append(" (").append(getFNumRMIns()).append(" )\n");
builder.append(" .fCrLf = ");
builder.append(" (").append(getFCrLf()).append(" )\n");
builder.append(" .fUsePgsuSettings = ");
builder.append(" (").append(getFUsePgsuSettings()).append(" )\n");
builder.append(" .fAdjustRight = ");
builder.append(" (").append(getFAdjustRight()).append(" )\n");
builder.append(" .itap = ");
builder.append(" (").append(getItap()).append(" )\n");
builder.append(" .fInnerTableCell = ");
builder.append(" (").append(getFInnerTableCell()).append(" )\n");
builder.append(" .fOpenTch = ");
builder.append(" (").append(getFOpenTch()).append(" )\n");
builder.append(" .fTtpEmbedded = ");
builder.append(" (").append(getFTtpEmbedded()).append(" )\n");
builder.append(" .dxcRight = ");
builder.append(" (").append(getDxcRight()).append(" )\n");
builder.append(" .dxcLeft = ");
builder.append(" (").append(getDxcLeft()).append(" )\n");
builder.append(" .dxcLeft1 = ");
builder.append(" (").append(getDxcLeft1()).append(" )\n");
builder.append(" .fDyaBeforeAuto = ");
builder.append(" (").append(getFDyaBeforeAuto()).append(" )\n");
builder.append(" .fDyaAfterAuto = ");
builder.append(" (").append(getFDyaAfterAuto()).append(" )\n");
builder.append(" .dxaRight = ");
builder.append(" (").append(getDxaRight()).append(" )\n");
builder.append(" .dxaLeft = ");
builder.append(" (").append(getDxaLeft()).append(" )\n");
builder.append(" .dxaLeft1 = ");
builder.append(" (").append(getDxaLeft1()).append(" )\n");
builder.append(" .jc = ");
builder.append(" (").append(getJc()).append(" )\n");
builder.append(" .brcTop = ");
builder.append(" (").append(getBrcTop()).append(" )\n");
builder.append(" .brcLeft = ");
builder.append(" (").append(getBrcLeft()).append(" )\n");
builder.append(" .brcBottom = ");
builder.append(" (").append(getBrcBottom()).append(" )\n");
builder.append(" .brcRight = ");
builder.append(" (").append(getBrcRight()).append(" )\n");
builder.append(" .brcBetween = ");
builder.append(" (").append(getBrcBetween()).append(" )\n");
builder.append(" .brcBar = ");
builder.append(" (").append(getBrcBar()).append(" )\n");
builder.append(" .shd = ");
builder.append(" (").append(getShd()).append(" )\n");
builder.append(" .anld = ");
builder.append(" (").append(Arrays.toString(getAnld())).append(" )\n");
builder.append(" .phe = ");
builder.append(" (").append(Arrays.toString(getPhe())).append(" )\n");
builder.append(" .fPropRMark = ");
builder.append(" (").append(getFPropRMark()).append(" )\n");
builder.append(" .ibstPropRMark = ");
builder.append(" (").append(getIbstPropRMark()).append(" )\n");
builder.append(" .dttmPropRMark = ");
builder.append(" (").append(getDttmPropRMark()).append(" )\n");
builder.append(" .itbdMac = ");
builder.append(" (").append(getItbdMac()).append(" )\n");
builder.append(" .rgdxaTab = ");
builder.append(" (").append(Arrays.toString(getRgdxaTab())).append(" )\n");
builder.append(" .rgtbd = ");
builder.append(" (").append(Arrays.toString(getRgtbd())).append(" )\n");
builder.append(" .numrm = ");
builder.append(" (").append(Arrays.toString(getNumrm())).append(" )\n");
builder.append(" .ptap = ");
builder.append(" (").append(Arrays.toString(getPtap())).append(" )\n");
builder.append(" .fNoAllowOverlap = ");
builder.append(" (").append(getFNoAllowOverlap()).append(" )\n");
builder.append(" .ipgp = ");
builder.append(" (").append(getIpgp()).append(" )\n");
builder.append(" .rsid = ");
builder.append(" (").append(getRsid()).append(" )\n");
builder.append("[/PAP]\n");
return builder.toString();
} }
/** /**
@ -1785,7 +1702,7 @@ public abstract class PAPAbstractType {
} }
/** /**
* Number of tabs stops defined for paragraph. Must be >= 0 and <= 64.. * Number of tabs stops defined for paragraph. Must be &gt;= 0 and &lt;= 64..
*/ */
@Internal @Internal
public int getItbdMac() public int getItbdMac()
@ -1794,7 +1711,7 @@ public abstract class PAPAbstractType {
} }
/** /**
* Number of tabs stops defined for paragraph. Must be >= 0 and <= 64.. * Number of tabs stops defined for paragraph. Must be &gt;= 0 and &lt;= 64..
*/ */
@Internal @Internal
public void setItbdMac( int field_72_itbdMac ) public void setItbdMac( int field_72_itbdMac )

View File

@ -895,7 +895,7 @@ public abstract class TAPAbstractType {
} }
/** /**
* Count of cells defined for this row. itcMac must be >= 0 and less than or equal to 64.. * Count of cells defined for this row. itcMac must be &gt;= 0 and less than or equal to 64..
*/ */
@Internal @Internal
public short getItcMac() public short getItcMac()
@ -904,7 +904,7 @@ public abstract class TAPAbstractType {
} }
/** /**
* Count of cells defined for this row. itcMac must be >= 0 and less than or equal to 64.. * Count of cells defined for this row. itcMac must be &gt;= 0 and less than or equal to 64..
*/ */
@Internal @Internal
public void setItcMac( short field_26_itcMac ) public void setItcMac( short field_26_itcMac )

View File

@ -547,11 +547,9 @@ public class Paragraph extends Range implements Duplicatable {
} }
/** /**
* Returns number of tabs stops defined for paragraph. Must be >= 0 and <= * Returns number of tabs stops defined for paragraph. Must be &gt;= 0 and &lt;= 64.
* 64.
* *
* @return number of tabs stops defined for paragraph. Must be >= 0 and <= * @return number of tabs stops defined for paragraph. Must be &gt;= 0 and &lt;= 64
* 64
*/ */
public int getTabStopsNumber() public int getTabStopsNumber()
{ {

View File

@ -65,7 +65,7 @@ public class TestExcelConverterSuite
{ {
HSSFWorkbook workbook; HSSFWorkbook workbook;
try { try {
workbook = ExcelToHtmlUtils.loadXls( child ); workbook = AbstractExcelUtils.loadXls( child );
} catch ( Exception exc ) { } catch ( Exception exc ) {
// unable to parse file -- not ExcelToFoConverter fault // unable to parse file -- not ExcelToFoConverter fault
return; return;
@ -91,7 +91,7 @@ public class TestExcelConverterSuite
{ {
HSSFWorkbook workbook; HSSFWorkbook workbook;
try { try {
workbook = ExcelToHtmlUtils.loadXls( child ); workbook = AbstractExcelUtils.loadXls( child );
} catch ( Exception exc ) { } catch ( Exception exc ) {
// unable to parse file -- not ExcelToFoConverter fault // unable to parse file -- not ExcelToFoConverter fault
return; return;