mirror of https://github.com/apache/poi.git
: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:
parent
240b02daec
commit
088d1dd197
|
@ -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 {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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),
|
||||||
|
@ -186,9 +188,9 @@ public enum RecordTypes {
|
||||||
}
|
}
|
||||||
|
|
||||||
public final short typeID;
|
public final short typeID;
|
||||||
public final RecordConstructor recordConstructor;
|
public final RecordConstructor<?> recordConstructor;
|
||||||
|
|
||||||
RecordTypes(int typeID, RecordConstructor recordConstructor) {
|
RecordTypes(int typeID, RecordConstructor<?> recordConstructor) {
|
||||||
this.typeID = (short)typeID;
|
this.typeID = (short)typeID;
|
||||||
this.recordConstructor = recordConstructor;
|
this.recordConstructor = recordConstructor;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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 " " to output, so browser won't collapse
|
* is empty, add " " 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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.
|
||||||
*
|
*
|
||||||
|
|
|
@ -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 -> paragraph mapping is
|
||||||
* broken. Fast too.
|
* broken. Fast too.
|
||||||
*/
|
*/
|
||||||
public String getTextFromPieces() {
|
public String getTextFromPieces() {
|
||||||
|
|
|
@ -50,7 +50,7 @@ public interface CharIndexTranslator {
|
||||||
boolean isIndexInTable(int bytePos);
|
boolean isIndexInTable(int bytePos);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return first index >= bytePos that is in table
|
* Return first index >= 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 <= 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
|
||||||
|
|
|
@ -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 > that available
|
||||||
*/
|
*/
|
||||||
public ListLevel getLevel(int lsid, int level)
|
public ListLevel getLevel(int lsid, int level)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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 -> Picture -> 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 > 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 > 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
|
}
|
||||||
|
|
|
@ -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 & 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 & size)
|
||||||
* @return the fHtmlUnsupported field value.
|
* @return the fHtmlUnsupported field value.
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
|
|
|
@ -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 >= 0 and <= 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 >= 0 and <= 64..
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
public void setItbdMac( int field_72_itbdMac )
|
public void setItbdMac( int field_72_itbdMac )
|
||||||
|
|
|
@ -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 >= 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 >= 0 and less than or equal to 64..
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
public void setItcMac( short field_26_itcMac )
|
public void setItcMac( short field_26_itcMac )
|
||||||
|
|
|
@ -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 >= 0 and <= 64.
|
||||||
* 64.
|
|
||||||
*
|
*
|
||||||
* @return number of tabs stops defined for paragraph. Must be >= 0 and <=
|
* @return number of tabs stops defined for paragraph. Must be >= 0 and <= 64
|
||||||
* 64
|
|
||||||
*/
|
*/
|
||||||
public int getTabStopsNumber()
|
public int getTabStopsNumber()
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue