mirror of https://github.com/apache/poi.git
fix FO errors and add cells formatting
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1162776 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
289d9722e6
commit
0648c81942
|
@ -23,6 +23,9 @@ import org.apache.poi.hssf.usermodel.HSSFRichTextString;
|
||||||
import org.apache.poi.hssf.usermodel.HSSFRow;
|
import org.apache.poi.hssf.usermodel.HSSFRow;
|
||||||
import org.apache.poi.hssf.usermodel.HSSFSheet;
|
import org.apache.poi.hssf.usermodel.HSSFSheet;
|
||||||
import org.apache.poi.hwpf.converter.AbstractWordConverter;
|
import org.apache.poi.hwpf.converter.AbstractWordConverter;
|
||||||
|
import org.apache.poi.hwpf.converter.DefaultFontReplacer;
|
||||||
|
import org.apache.poi.hwpf.converter.FontReplacer;
|
||||||
|
import org.apache.poi.hwpf.converter.NumberFormatter;
|
||||||
import org.apache.poi.ss.formula.eval.ErrorEval;
|
import org.apache.poi.ss.formula.eval.ErrorEval;
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Beta;
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
|
@ -44,6 +47,8 @@ public abstract class AbstractExcelConverter
|
||||||
|
|
||||||
protected final HSSFDataFormatter _formatter = new HSSFDataFormatter();
|
protected final HSSFDataFormatter _formatter = new HSSFDataFormatter();
|
||||||
|
|
||||||
|
private FontReplacer fontReplacer = new DefaultFontReplacer();
|
||||||
|
|
||||||
private boolean outputColumnHeaders = true;
|
private boolean outputColumnHeaders = true;
|
||||||
|
|
||||||
private boolean outputHiddenColumns = false;
|
private boolean outputHiddenColumns = false;
|
||||||
|
@ -63,11 +68,16 @@ public abstract class AbstractExcelConverter
|
||||||
*/
|
*/
|
||||||
protected String getColumnName( int columnIndex )
|
protected String getColumnName( int columnIndex )
|
||||||
{
|
{
|
||||||
return String.valueOf( columnIndex + 1 );
|
return NumberFormatter.getNumber( columnIndex + 1, 3 );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract Document getDocument();
|
protected abstract Document getDocument();
|
||||||
|
|
||||||
|
public FontReplacer getFontReplacer()
|
||||||
|
{
|
||||||
|
return fontReplacer;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates name for output as row number in case
|
* Generates name for output as row number in case
|
||||||
* <tt>{@link #isOutputRowNumbers()} == true</tt>
|
* <tt>{@link #isOutputRowNumbers()} == true</tt>
|
||||||
|
@ -162,6 +172,11 @@ public abstract class AbstractExcelConverter
|
||||||
return ExcelToHtmlUtils.isEmpty( value );
|
return ExcelToHtmlUtils.isEmpty( value );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setFontReplacer( FontReplacer fontReplacer )
|
||||||
|
{
|
||||||
|
this.fontReplacer = fontReplacer;
|
||||||
|
}
|
||||||
|
|
||||||
public void setOutputColumnHeaders( boolean outputColumnHeaders )
|
public void setOutputColumnHeaders( boolean outputColumnHeaders )
|
||||||
{
|
{
|
||||||
this.outputColumnHeaders = outputColumnHeaders;
|
this.outputColumnHeaders = outputColumnHeaders;
|
||||||
|
|
|
@ -20,8 +20,12 @@ import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
|
||||||
|
import org.apache.poi.hssf.usermodel.HSSFSheet;
|
||||||
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.hwpf.converter.AbstractWordUtils;
|
import org.apache.poi.hwpf.converter.AbstractWordUtils;
|
||||||
|
import org.apache.poi.ss.util.CellRangeAddress;
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Beta;
|
||||||
import org.apache.poi.util.IOUtils;
|
import org.apache.poi.util.IOUtils;
|
||||||
|
|
||||||
|
@ -38,6 +42,109 @@ public class AbstractExcelUtils
|
||||||
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( short alignment )
|
||||||
|
{
|
||||||
|
switch ( alignment )
|
||||||
|
{
|
||||||
|
case HSSFCellStyle.ALIGN_CENTER:
|
||||||
|
return "center";
|
||||||
|
case HSSFCellStyle.ALIGN_CENTER_SELECTION:
|
||||||
|
return "center";
|
||||||
|
case HSSFCellStyle.ALIGN_FILL:
|
||||||
|
// XXX: shall we support fill?
|
||||||
|
return "";
|
||||||
|
case HSSFCellStyle.ALIGN_GENERAL:
|
||||||
|
return "";
|
||||||
|
case HSSFCellStyle.ALIGN_JUSTIFY:
|
||||||
|
return "justify";
|
||||||
|
case HSSFCellStyle.ALIGN_LEFT:
|
||||||
|
return "left";
|
||||||
|
case HSSFCellStyle.ALIGN_RIGHT:
|
||||||
|
return "right";
|
||||||
|
default:
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getBorderStyle( short xlsBorder )
|
||||||
|
{
|
||||||
|
final String borderStyle;
|
||||||
|
switch ( xlsBorder )
|
||||||
|
{
|
||||||
|
case HSSFCellStyle.BORDER_NONE:
|
||||||
|
borderStyle = "none";
|
||||||
|
break;
|
||||||
|
case HSSFCellStyle.BORDER_DASH_DOT:
|
||||||
|
case HSSFCellStyle.BORDER_DASH_DOT_DOT:
|
||||||
|
case HSSFCellStyle.BORDER_DOTTED:
|
||||||
|
case HSSFCellStyle.BORDER_HAIR:
|
||||||
|
case HSSFCellStyle.BORDER_MEDIUM_DASH_DOT:
|
||||||
|
case HSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOT:
|
||||||
|
case HSSFCellStyle.BORDER_SLANTED_DASH_DOT:
|
||||||
|
borderStyle = "dotted";
|
||||||
|
break;
|
||||||
|
case HSSFCellStyle.BORDER_DASHED:
|
||||||
|
case HSSFCellStyle.BORDER_MEDIUM_DASHED:
|
||||||
|
borderStyle = "dashed";
|
||||||
|
break;
|
||||||
|
case HSSFCellStyle.BORDER_DOUBLE:
|
||||||
|
borderStyle = "double";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
borderStyle = "solid";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return borderStyle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getBorderWidth( short xlsBorder )
|
||||||
|
{
|
||||||
|
final String borderWidth;
|
||||||
|
switch ( xlsBorder )
|
||||||
|
{
|
||||||
|
case HSSFCellStyle.BORDER_MEDIUM_DASH_DOT:
|
||||||
|
case HSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOT:
|
||||||
|
case HSSFCellStyle.BORDER_MEDIUM_DASHED:
|
||||||
|
borderWidth = "2pt";
|
||||||
|
break;
|
||||||
|
case HSSFCellStyle.BORDER_THICK:
|
||||||
|
borderWidth = "thick";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
borderWidth = "thin";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return borderWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getColor( HSSFColor color )
|
||||||
|
{
|
||||||
|
StringBuilder stringBuilder = new StringBuilder( 7 );
|
||||||
|
stringBuilder.append( '#' );
|
||||||
|
for ( short s : color.getTriplet() )
|
||||||
|
{
|
||||||
|
if ( s < 10 )
|
||||||
|
stringBuilder.append( '0' );
|
||||||
|
|
||||||
|
stringBuilder.append( Integer.toHexString( s ) );
|
||||||
|
}
|
||||||
|
String result = stringBuilder.toString();
|
||||||
|
|
||||||
|
if ( result.equals( "#ffffff" ) )
|
||||||
|
return "white";
|
||||||
|
|
||||||
|
if ( result.equals( "#c0c0c0" ) )
|
||||||
|
return "silver";
|
||||||
|
|
||||||
|
if ( result.equals( "#808080" ) )
|
||||||
|
return "gray";
|
||||||
|
|
||||||
|
if ( result.equals( "#000000" ) )
|
||||||
|
return "black";
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* See <a href=
|
* See <a href=
|
||||||
* "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"
|
||||||
|
@ -55,6 +162,25 @@ public class AbstractExcelUtils
|
||||||
return pixels;
|
return pixels;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mergedRanges
|
||||||
|
* map of sheet merged ranges built with
|
||||||
|
* {@link #buildMergedRangesMap(HSSFSheet)}
|
||||||
|
* @return {@link CellRangeAddress} from map if cell with specified row and
|
||||||
|
* column numbers contained in found range, <tt>null</tt> otherwise
|
||||||
|
*/
|
||||||
|
public static CellRangeAddress getMergedRange(
|
||||||
|
CellRangeAddress[][] mergedRanges, int rowNumber, int columnNumber )
|
||||||
|
{
|
||||||
|
CellRangeAddress[] mergedRangeRowInfo = rowNumber < mergedRanges.length ? mergedRanges[rowNumber]
|
||||||
|
: null;
|
||||||
|
CellRangeAddress cellRangeAddress = mergedRangeRowInfo != null
|
||||||
|
&& columnNumber < mergedRangeRowInfo.length ? mergedRangeRowInfo[columnNumber]
|
||||||
|
: null;
|
||||||
|
|
||||||
|
return cellRangeAddress;
|
||||||
|
}
|
||||||
|
|
||||||
static boolean isEmpty( String str )
|
static boolean isEmpty( String str )
|
||||||
{
|
{
|
||||||
return str == null || str.length() == 0;
|
return str == null || str.length() == 0;
|
||||||
|
|
|
@ -31,11 +31,14 @@ import javax.xml.transform.stream.StreamResult;
|
||||||
import org.apache.poi.hpsf.SummaryInformation;
|
import org.apache.poi.hpsf.SummaryInformation;
|
||||||
import org.apache.poi.hssf.usermodel.HSSFCell;
|
import org.apache.poi.hssf.usermodel.HSSFCell;
|
||||||
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
|
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
|
||||||
|
import org.apache.poi.hssf.usermodel.HSSFFont;
|
||||||
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
|
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
|
||||||
import org.apache.poi.hssf.usermodel.HSSFRow;
|
import org.apache.poi.hssf.usermodel.HSSFRow;
|
||||||
import org.apache.poi.hssf.usermodel.HSSFSheet;
|
import org.apache.poi.hssf.usermodel.HSSFSheet;
|
||||||
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.hwpf.converter.FoDocumentFacade;
|
import org.apache.poi.hwpf.converter.FoDocumentFacade;
|
||||||
|
import org.apache.poi.hwpf.converter.FontReplacer.Triplet;
|
||||||
import org.apache.poi.ss.formula.eval.ErrorEval;
|
import org.apache.poi.ss.formula.eval.ErrorEval;
|
||||||
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.Beta;
|
||||||
|
@ -196,8 +199,9 @@ public class ExcelToFoConverter extends AbstractExcelConverter
|
||||||
return width;
|
return width;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean processCell( HSSFCell cell, Element tableCellElement,
|
protected boolean processCell( HSSFWorkbook workbook, HSSFCell cell,
|
||||||
int normalWidthPx, int maxSpannedWidthPx, float normalHeightPt )
|
Element tableCellElement, int normalWidthPx, int maxSpannedWidthPx,
|
||||||
|
float normalHeightPt )
|
||||||
{
|
{
|
||||||
final HSSFCellStyle cellStyle = cell.getCellStyle();
|
final HSSFCellStyle cellStyle = cell.getCellStyle();
|
||||||
|
|
||||||
|
@ -315,6 +319,8 @@ public class ExcelToFoConverter extends AbstractExcelConverter
|
||||||
}
|
}
|
||||||
|
|
||||||
Text text = foDocumentFacade.createText( value );
|
Text text = foDocumentFacade.createText( value );
|
||||||
|
Element block = foDocumentFacade.createBlock();
|
||||||
|
block.appendChild( text );
|
||||||
|
|
||||||
// if ( wrapInDivs )
|
// if ( wrapInDivs )
|
||||||
// {
|
// {
|
||||||
|
@ -340,18 +346,123 @@ public class ExcelToFoConverter extends AbstractExcelConverter
|
||||||
// htmlDocumentFacade.addStyleClass( outerDiv, "d",
|
// htmlDocumentFacade.addStyleClass( outerDiv, "d",
|
||||||
// innerDivStyle.toString() );
|
// innerDivStyle.toString() );
|
||||||
//
|
//
|
||||||
// innerDiv.appendChild( text );
|
// innerDiv.appendChild( block );
|
||||||
// outerDiv.appendChild( innerDiv );
|
// outerDiv.appendChild( innerDiv );
|
||||||
// tableCellElement.appendChild( outerDiv );
|
// tableCellElement.appendChild( outerDiv );
|
||||||
// }
|
// }
|
||||||
// else
|
// else
|
||||||
{
|
{
|
||||||
tableCellElement.appendChild( text );
|
processCellStyle( workbook, cell.getCellStyle(), tableCellElement,
|
||||||
|
block );
|
||||||
|
tableCellElement.appendChild( block );
|
||||||
}
|
}
|
||||||
|
|
||||||
return ExcelToHtmlUtils.isEmpty( value ) && cellStyleIndex == 0;
|
return ExcelToHtmlUtils.isEmpty( value ) && cellStyleIndex == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void processCellStyle( HSSFWorkbook workbook,
|
||||||
|
HSSFCellStyle cellStyle, Element cellTarget, Element blockTarget )
|
||||||
|
{
|
||||||
|
blockTarget.setAttribute( "white-space-collapse", "false" );
|
||||||
|
{
|
||||||
|
String textAlign = ExcelToFoUtils.getAlign( cellStyle
|
||||||
|
.getAlignment() );
|
||||||
|
if ( ExcelToFoUtils.isNotEmpty( textAlign ) )
|
||||||
|
blockTarget.setAttribute( "text-align", textAlign );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( cellStyle.getFillPattern() == 0 )
|
||||||
|
{
|
||||||
|
// no fill
|
||||||
|
}
|
||||||
|
else if ( cellStyle.getFillPattern() == 1 )
|
||||||
|
{
|
||||||
|
final HSSFColor foregroundColor = cellStyle
|
||||||
|
.getFillForegroundColorColor();
|
||||||
|
if ( foregroundColor != null )
|
||||||
|
cellTarget.setAttribute( "background-color",
|
||||||
|
ExcelToFoUtils.getColor( foregroundColor ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
final HSSFColor backgroundColor = cellStyle
|
||||||
|
.getFillBackgroundColorColor();
|
||||||
|
if ( backgroundColor != null )
|
||||||
|
cellTarget.setAttribute( "background-color",
|
||||||
|
ExcelToHtmlUtils.getColor( backgroundColor ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
processCellStyleBorder( workbook, cellTarget, "top",
|
||||||
|
cellStyle.getBorderTop(), cellStyle.getTopBorderColor() );
|
||||||
|
processCellStyleBorder( workbook, cellTarget, "right",
|
||||||
|
cellStyle.getBorderRight(), cellStyle.getRightBorderColor() );
|
||||||
|
processCellStyleBorder( workbook, cellTarget, "bottom",
|
||||||
|
cellStyle.getBorderBottom(), cellStyle.getBottomBorderColor() );
|
||||||
|
processCellStyleBorder( workbook, cellTarget, "left",
|
||||||
|
cellStyle.getBorderLeft(), cellStyle.getLeftBorderColor() );
|
||||||
|
|
||||||
|
HSSFFont font = cellStyle.getFont( workbook );
|
||||||
|
processCellStyleFont( workbook, blockTarget, font );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void processCellStyleBorder( HSSFWorkbook workbook,
|
||||||
|
Element cellTarget, String type, short xlsBorder, short borderColor )
|
||||||
|
{
|
||||||
|
if ( xlsBorder == HSSFCellStyle.BORDER_NONE )
|
||||||
|
return;
|
||||||
|
|
||||||
|
StringBuilder borderStyle = new StringBuilder();
|
||||||
|
borderStyle.append( ExcelToHtmlUtils.getBorderWidth( xlsBorder ) );
|
||||||
|
borderStyle.append( ' ' );
|
||||||
|
borderStyle.append( ExcelToHtmlUtils.getBorderStyle( xlsBorder ) );
|
||||||
|
|
||||||
|
final HSSFColor color = workbook.getCustomPalette().getColor(
|
||||||
|
borderColor );
|
||||||
|
if ( color != null )
|
||||||
|
{
|
||||||
|
borderStyle.append( ' ' );
|
||||||
|
borderStyle.append( ExcelToHtmlUtils.getColor( color ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
cellTarget.setAttribute( "border-" + type, borderStyle.toString() );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void processCellStyleFont( HSSFWorkbook workbook,
|
||||||
|
Element blockTarget, HSSFFont font )
|
||||||
|
{
|
||||||
|
Triplet triplet = new Triplet();
|
||||||
|
triplet.fontName = font.getFontName();
|
||||||
|
|
||||||
|
switch ( font.getBoldweight() )
|
||||||
|
{
|
||||||
|
case HSSFFont.BOLDWEIGHT_BOLD:
|
||||||
|
triplet.bold = true;
|
||||||
|
break;
|
||||||
|
case HSSFFont.BOLDWEIGHT_NORMAL:
|
||||||
|
triplet.bold = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( font.getItalic() )
|
||||||
|
{
|
||||||
|
triplet.italic = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
getFontReplacer().update( triplet );
|
||||||
|
setBlockProperties( blockTarget, triplet );
|
||||||
|
|
||||||
|
final HSSFColor fontColor = workbook.getCustomPalette().getColor(
|
||||||
|
font.getColor() );
|
||||||
|
if ( fontColor != null )
|
||||||
|
blockTarget.setAttribute( "color",
|
||||||
|
ExcelToHtmlUtils.getColor( fontColor ) );
|
||||||
|
|
||||||
|
if ( font.getFontHeightInPoints() != 0 )
|
||||||
|
blockTarget.setAttribute( "font-size", font.getFontHeightInPoints()
|
||||||
|
+ "pt" );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
protected void processColumnHeaders( HSSFSheet sheet, int maxSheetColumns,
|
protected void processColumnHeaders( HSSFSheet sheet, int maxSheetColumns,
|
||||||
Element table )
|
Element table )
|
||||||
{
|
{
|
||||||
|
@ -361,7 +472,9 @@ public class ExcelToFoConverter extends AbstractExcelConverter
|
||||||
if ( isOutputRowNumbers() )
|
if ( isOutputRowNumbers() )
|
||||||
{
|
{
|
||||||
// empty cell at left-top corner
|
// empty cell at left-top corner
|
||||||
row.appendChild( foDocumentFacade.createTableCell() );
|
final Element tableCellElement = foDocumentFacade.createTableCell();
|
||||||
|
tableCellElement.appendChild( foDocumentFacade.createBlock() );
|
||||||
|
row.appendChild( tableCellElement );
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( int c = 0; c < maxSheetColumns; c++ )
|
for ( int c = 0; c < maxSheetColumns; c++ )
|
||||||
|
@ -370,8 +483,14 @@ public class ExcelToFoConverter extends AbstractExcelConverter
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Element cell = foDocumentFacade.createTableCell();
|
Element cell = foDocumentFacade.createTableCell();
|
||||||
|
Element block = foDocumentFacade.createBlock();
|
||||||
|
block.setAttribute( "text-align", "center" );
|
||||||
|
block.setAttribute( "font-weight", "bold" );
|
||||||
|
|
||||||
String text = getColumnName( c );
|
String text = getColumnName( c );
|
||||||
cell.appendChild( foDocumentFacade.createText( text ) );
|
block.appendChild( foDocumentFacade.createText( text ) );
|
||||||
|
|
||||||
|
cell.appendChild( block );
|
||||||
row.appendChild( cell );
|
row.appendChild( cell );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -422,21 +541,25 @@ public class ExcelToFoConverter extends AbstractExcelConverter
|
||||||
/**
|
/**
|
||||||
* @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( HSSFWorkbook workbook,
|
||||||
|
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 )
|
||||||
|
{
|
||||||
|
Element emptyCellElement = foDocumentFacade.createTableCell();
|
||||||
|
emptyCellElement.appendChild( foDocumentFacade.createBlock() );
|
||||||
|
tableRowElement.appendChild( emptyCellElement );
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
final List<Element> emptyCells = new ArrayList<Element>( maxColIx );
|
final List<Element> emptyCells = new ArrayList<Element>( maxColIx );
|
||||||
|
|
||||||
if ( isOutputRowNumbers() )
|
if ( isOutputRowNumbers() )
|
||||||
{
|
{
|
||||||
Element tableRowNumberCellElement = foDocumentFacade
|
Element tableRowNumberCellElement = processRowNumber( row );
|
||||||
.createTableCell();
|
|
||||||
processRowNumber( row, tableRowNumberCellElement );
|
|
||||||
emptyCells.add( tableRowNumberCellElement );
|
emptyCells.add( tableRowNumberCellElement );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -502,12 +625,13 @@ public class ExcelToFoConverter extends AbstractExcelConverter
|
||||||
boolean emptyCell;
|
boolean emptyCell;
|
||||||
if ( cell != null )
|
if ( cell != null )
|
||||||
{
|
{
|
||||||
emptyCell = processCell( cell, tableCellElement,
|
emptyCell = processCell( workbook, cell, tableCellElement,
|
||||||
getColumnWidth( sheet, colIx ), divWidthPx,
|
getColumnWidth( sheet, colIx ), divWidthPx,
|
||||||
row.getHeight() / 20f );
|
row.getHeight() / 20f );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
tableCellElement.appendChild( foDocumentFacade.createBlock() );
|
||||||
emptyCell = true;
|
emptyCell = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -531,14 +655,23 @@ public class ExcelToFoConverter extends AbstractExcelConverter
|
||||||
return maxRenderedColumn + 1;
|
return maxRenderedColumn + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void processRowNumber( HSSFRow row,
|
protected Element processRowNumber( HSSFRow row )
|
||||||
Element tableRowNumberCellElement )
|
|
||||||
{
|
{
|
||||||
|
Element tableRowNumberCellElement = foDocumentFacade.createTableCell();
|
||||||
|
|
||||||
|
Element block = foDocumentFacade.createBlock();
|
||||||
|
block.setAttribute( "text-align", "right" );
|
||||||
|
block.setAttribute( "font-weight", "bold" );
|
||||||
|
|
||||||
Text text = foDocumentFacade.createText( getRowName( row ) );
|
Text text = foDocumentFacade.createText( getRowName( row ) );
|
||||||
tableRowNumberCellElement.appendChild( text );
|
block.appendChild( text );
|
||||||
|
|
||||||
|
tableRowNumberCellElement.appendChild( block );
|
||||||
|
return tableRowNumberCellElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected int processSheet( HSSFSheet sheet, Element flow )
|
protected int processSheet( HSSFWorkbook workbook, HSSFSheet sheet,
|
||||||
|
Element flow )
|
||||||
{
|
{
|
||||||
final int physicalNumberOfRows = sheet.getPhysicalNumberOfRows();
|
final int physicalNumberOfRows = sheet.getPhysicalNumberOfRows();
|
||||||
if ( physicalNumberOfRows <= 0 )
|
if ( physicalNumberOfRows <= 0 )
|
||||||
|
@ -569,7 +702,7 @@ public class ExcelToFoConverter extends AbstractExcelConverter
|
||||||
tableRowElement.setAttribute( "height", row.getHeight() / 20f
|
tableRowElement.setAttribute( "height", row.getHeight() / 20f
|
||||||
+ "pt" );
|
+ "pt" );
|
||||||
|
|
||||||
int maxRowColumnNumber = processRow( mergedRanges, row,
|
int maxRowColumnNumber = processRow( workbook, mergedRanges, row,
|
||||||
tableRowElement );
|
tableRowElement );
|
||||||
|
|
||||||
if ( maxRowColumnNumber == 0 )
|
if ( maxRowColumnNumber == 0 )
|
||||||
|
@ -608,11 +741,26 @@ public class ExcelToFoConverter extends AbstractExcelConverter
|
||||||
protected void processSheetName( HSSFSheet sheet, Element flow )
|
protected void processSheetName( HSSFSheet sheet, Element flow )
|
||||||
{
|
{
|
||||||
Element titleBlock = foDocumentFacade.createBlock();
|
Element titleBlock = foDocumentFacade.createBlock();
|
||||||
|
|
||||||
|
Triplet triplet = new Triplet();
|
||||||
|
triplet.bold = true;
|
||||||
|
triplet.italic = false;
|
||||||
|
triplet.fontName = "Arial";
|
||||||
|
getFontReplacer().update( triplet );
|
||||||
|
|
||||||
|
setBlockProperties( titleBlock, triplet );
|
||||||
|
titleBlock.setAttribute( "font-size", "200%" );
|
||||||
|
|
||||||
Element titleInline = foDocumentFacade.createInline();
|
Element titleInline = foDocumentFacade.createInline();
|
||||||
titleInline.appendChild( foDocumentFacade.createText( sheet
|
titleInline.appendChild( foDocumentFacade.createText( sheet
|
||||||
.getSheetName() ) );
|
.getSheetName() ) );
|
||||||
titleBlock.appendChild( titleInline );
|
titleBlock.appendChild( titleInline );
|
||||||
flow.appendChild( titleBlock );
|
flow.appendChild( titleBlock );
|
||||||
|
|
||||||
|
Element titleBlock2 = foDocumentFacade.createBlock();
|
||||||
|
Element titleInline2 = foDocumentFacade.createInline();
|
||||||
|
titleBlock2.appendChild( titleInline2 );
|
||||||
|
flow.appendChild( titleBlock2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processWorkbook( HSSFWorkbook workbook )
|
public void processWorkbook( HSSFWorkbook workbook )
|
||||||
|
@ -629,16 +777,31 @@ public class ExcelToFoConverter extends AbstractExcelConverter
|
||||||
String pageMasterName = "sheet-" + s;
|
String pageMasterName = "sheet-" + s;
|
||||||
|
|
||||||
Element pageSequence = foDocumentFacade
|
Element pageSequence = foDocumentFacade
|
||||||
.addPageSequence( pageMasterName );
|
.createPageSequence( pageMasterName );
|
||||||
Element flow = foDocumentFacade.addFlowToPageSequence(
|
Element flow = foDocumentFacade.addFlowToPageSequence(
|
||||||
pageSequence, "xsl-region-body" );
|
pageSequence, "xsl-region-body" );
|
||||||
|
|
||||||
HSSFSheet sheet = workbook.getSheetAt( s );
|
HSSFSheet sheet = workbook.getSheetAt( s );
|
||||||
int maxSheetColumns = processSheet( sheet, flow );
|
int maxSheetColumns = processSheet( workbook, sheet, flow );
|
||||||
|
|
||||||
if ( maxSheetColumns != 0 )
|
if ( maxSheetColumns != 0 )
|
||||||
|
{
|
||||||
createPageMaster( sheet, maxSheetColumns, pageMasterName );
|
createPageMaster( sheet, maxSheetColumns, pageMasterName );
|
||||||
|
foDocumentFacade.addPageSequence( pageSequence );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setBlockProperties( Element textBlock, Triplet triplet )
|
||||||
|
{
|
||||||
|
if ( triplet.bold )
|
||||||
|
textBlock.setAttribute( "font-weight", "bold" );
|
||||||
|
|
||||||
|
if ( triplet.italic )
|
||||||
|
textBlock.setAttribute( "font-style", "italic" );
|
||||||
|
|
||||||
|
if ( ExcelToFoUtils.isNotEmpty( triplet.fontName ) )
|
||||||
|
textBlock.setAttribute( "font-family", triplet.fontName );
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,9 +18,7 @@ package org.apache.poi.hssf.converter;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
|
|
||||||
import org.apache.poi.hssf.usermodel.HSSFSheet;
|
import org.apache.poi.hssf.usermodel.HSSFSheet;
|
||||||
import org.apache.poi.hssf.util.HSSFColor;
|
|
||||||
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.Beta;
|
||||||
|
|
||||||
|
@ -29,29 +27,13 @@ public class ExcelToHtmlUtils extends AbstractExcelUtils
|
||||||
{
|
{
|
||||||
public static void appendAlign( StringBuilder style, short alignment )
|
public static void appendAlign( StringBuilder style, short alignment )
|
||||||
{
|
{
|
||||||
switch ( alignment )
|
String cssAlign = getAlign( alignment );
|
||||||
{
|
if ( isEmpty( cssAlign ) )
|
||||||
case HSSFCellStyle.ALIGN_CENTER:
|
return;
|
||||||
style.append( "text-align: center; " );
|
|
||||||
break;
|
style.append( "text-align:" );
|
||||||
case HSSFCellStyle.ALIGN_CENTER_SELECTION:
|
style.append( cssAlign );
|
||||||
style.append( "text-align: center; " );
|
style.append( ";" );
|
||||||
break;
|
|
||||||
case HSSFCellStyle.ALIGN_FILL:
|
|
||||||
// XXX: shall we support fill?
|
|
||||||
break;
|
|
||||||
case HSSFCellStyle.ALIGN_GENERAL:
|
|
||||||
break;
|
|
||||||
case HSSFCellStyle.ALIGN_JUSTIFY:
|
|
||||||
style.append( "text-align: justify; " );
|
|
||||||
break;
|
|
||||||
case HSSFCellStyle.ALIGN_LEFT:
|
|
||||||
style.append( "text-align: left; " );
|
|
||||||
break;
|
|
||||||
case HSSFCellStyle.ALIGN_RIGHT:
|
|
||||||
style.append( "text-align: right; " );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -109,102 +91,4 @@ public class ExcelToHtmlUtils extends AbstractExcelUtils
|
||||||
return mergedRanges;
|
return mergedRanges;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getBorderStyle( short xlsBorder )
|
|
||||||
{
|
|
||||||
final String borderStyle;
|
|
||||||
switch ( xlsBorder )
|
|
||||||
{
|
|
||||||
case HSSFCellStyle.BORDER_NONE:
|
|
||||||
borderStyle = "none";
|
|
||||||
break;
|
|
||||||
case HSSFCellStyle.BORDER_DASH_DOT:
|
|
||||||
case HSSFCellStyle.BORDER_DASH_DOT_DOT:
|
|
||||||
case HSSFCellStyle.BORDER_DOTTED:
|
|
||||||
case HSSFCellStyle.BORDER_HAIR:
|
|
||||||
case HSSFCellStyle.BORDER_MEDIUM_DASH_DOT:
|
|
||||||
case HSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOT:
|
|
||||||
case HSSFCellStyle.BORDER_SLANTED_DASH_DOT:
|
|
||||||
borderStyle = "dotted";
|
|
||||||
break;
|
|
||||||
case HSSFCellStyle.BORDER_DASHED:
|
|
||||||
case HSSFCellStyle.BORDER_MEDIUM_DASHED:
|
|
||||||
borderStyle = "dashed";
|
|
||||||
break;
|
|
||||||
case HSSFCellStyle.BORDER_DOUBLE:
|
|
||||||
borderStyle = "double";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
borderStyle = "solid";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return borderStyle;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getBorderWidth( short xlsBorder )
|
|
||||||
{
|
|
||||||
final String borderWidth;
|
|
||||||
switch ( xlsBorder )
|
|
||||||
{
|
|
||||||
case HSSFCellStyle.BORDER_MEDIUM_DASH_DOT:
|
|
||||||
case HSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOT:
|
|
||||||
case HSSFCellStyle.BORDER_MEDIUM_DASHED:
|
|
||||||
borderWidth = "2pt";
|
|
||||||
break;
|
|
||||||
case HSSFCellStyle.BORDER_THICK:
|
|
||||||
borderWidth = "thick";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
borderWidth = "thin";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return borderWidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getColor( HSSFColor color )
|
|
||||||
{
|
|
||||||
StringBuilder stringBuilder = new StringBuilder( 7 );
|
|
||||||
stringBuilder.append( '#' );
|
|
||||||
for ( short s : color.getTriplet() )
|
|
||||||
{
|
|
||||||
if ( s < 10 )
|
|
||||||
stringBuilder.append( '0' );
|
|
||||||
|
|
||||||
stringBuilder.append( Integer.toHexString( s ) );
|
|
||||||
}
|
|
||||||
String result = stringBuilder.toString();
|
|
||||||
|
|
||||||
if ( result.equals( "#ffffff" ) )
|
|
||||||
return "white";
|
|
||||||
|
|
||||||
if ( result.equals( "#c0c0c0" ) )
|
|
||||||
return "silver";
|
|
||||||
|
|
||||||
if ( result.equals( "#808080" ) )
|
|
||||||
return "gray";
|
|
||||||
|
|
||||||
if ( result.equals( "#000000" ) )
|
|
||||||
return "black";
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param mergedRanges
|
|
||||||
* map of sheet merged ranges built with
|
|
||||||
* {@link #buildMergedRangesMap(HSSFSheet)}
|
|
||||||
* @return {@link CellRangeAddress} from map if cell with specified row and
|
|
||||||
* column numbers contained in found range, <tt>null</tt> otherwise
|
|
||||||
*/
|
|
||||||
public static CellRangeAddress getMergedRange(
|
|
||||||
CellRangeAddress[][] mergedRanges, int rowNumber, int columnNumber )
|
|
||||||
{
|
|
||||||
CellRangeAddress[] mergedRangeRowInfo = rowNumber < mergedRanges.length ? mergedRanges[rowNumber]
|
|
||||||
: null;
|
|
||||||
CellRangeAddress cellRangeAddress = mergedRangeRowInfo != null
|
|
||||||
&& columnNumber < mergedRangeRowInfo.length ? mergedRangeRowInfo[columnNumber]
|
|
||||||
: null;
|
|
||||||
|
|
||||||
return cellRangeAddress;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,11 +82,14 @@ public class FoDocumentFacade
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addPageSequence( Element pageSequence )
|
||||||
|
{
|
||||||
|
root.appendChild( pageSequence );
|
||||||
|
}
|
||||||
|
|
||||||
public Element addPageSequence( String pageMaster )
|
public Element addPageSequence( String pageMaster )
|
||||||
{
|
{
|
||||||
final Element pageSequence = document.createElementNS( NS_XSLFO,
|
final Element pageSequence = createPageSequence( pageMaster );
|
||||||
"fo:page-sequence" );
|
|
||||||
pageSequence.setAttribute( "master-reference", pageMaster );
|
|
||||||
root.appendChild( pageSequence );
|
root.appendChild( pageSequence );
|
||||||
return pageSequence;
|
return pageSequence;
|
||||||
}
|
}
|
||||||
|
@ -184,6 +187,14 @@ public class FoDocumentFacade
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Element createPageSequence( String pageMaster )
|
||||||
|
{
|
||||||
|
final Element pageSequence = document.createElementNS( NS_XSLFO,
|
||||||
|
"fo:page-sequence" );
|
||||||
|
pageSequence.setAttribute( "master-reference", pageMaster );
|
||||||
|
return pageSequence;
|
||||||
|
}
|
||||||
|
|
||||||
public Element createTable()
|
public Element createTable()
|
||||||
{
|
{
|
||||||
return document.createElementNS( NS_XSLFO, "fo:table" );
|
return document.createElementNS( NS_XSLFO, "fo:table" );
|
||||||
|
|
Loading…
Reference in New Issue