Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
net.sf.jasperreports.engine.export.ooxml.XlsxSheetHelper Maven / Gradle / Ivy
/*
* JasperReports - Free Java Reporting Library.
* Copyright (C) 2001 - 2011 Jaspersoft Corporation. All rights reserved.
* http://www.jaspersoft.com
*
* Unless you have purchased a commercial license agreement from Jaspersoft,
* the following license terms apply:
*
* This program is part of JasperReports.
*
* JasperReports is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* JasperReports is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with JasperReports. If not, see .
*/
package net.sf.jasperreports.engine.export.ooxml;
import java.io.IOException;
import java.io.Writer;
import net.sf.jasperreports.engine.JRPropertiesUtil;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReportsContext;
import net.sf.jasperreports.engine.export.Cut;
import net.sf.jasperreports.engine.export.JRXlsAbstractExporter;
import net.sf.jasperreports.engine.export.LengthUtil;
import net.sf.jasperreports.engine.export.XlsRowLevelInfo;
import net.sf.jasperreports.engine.export.ooxml.type.PaperSizeEnum;
import net.sf.jasperreports.engine.util.FileBufferedWriter;
/**
* @author Teodor Danciu ([email protected] )
* @version $Id: XlsxSheetHelper.java 5616 2012-08-29 13:18:45Z shertage $
*/
public class XlsxSheetHelper extends BaseHelper
{
private int rowIndex;
private FileBufferedWriter colsWriter = new FileBufferedWriter();
private FileBufferedWriter mergedCellsWriter = new FileBufferedWriter();
private FileBufferedWriter hyperlinksWriter = new FileBufferedWriter();
private boolean isCollapseRowSpan;
/**
*
*/
private XlsxSheetRelsHelper sheetRelsHelper;//FIXMEXLSX truly embed the rels helper here and no longer have it available from outside; check drawing rels too
private JRPropertiesUtil propertiesUtil;
/**
*
*/
public XlsxSheetHelper(
JasperReportsContext jasperReportsContext,
Writer writer,
XlsxSheetRelsHelper sheetRelsHelper,
boolean isCollapseRowSpan
)
{
super(jasperReportsContext, writer);
this.sheetRelsHelper = sheetRelsHelper;
this.isCollapseRowSpan = isCollapseRowSpan;
this.propertiesUtil = JRPropertiesUtil.getInstance(jasperReportsContext);
}
/**
*
*/
public void exportHeader()
{
write("\n");
write("\n");
write(" \n");
write(" \n");
}
/**
*
*/
public void exportHeader(int rowFreeze, int columnFreeze, JasperPrint jasperPrint)
{
exportHeader(0, rowFreeze, columnFreeze, jasperPrint);
}
/**
*
*/
public void exportHeader(boolean showGridlines, int scale, int rowFreeze, int columnFreeze, JasperPrint jasperPrint)
{
write("\n");
write("\n");
/* the scale factor takes precedence over fitWidth and fitHeight properties */
boolean noScale = scale < 10 || scale > 400;
String fitWidth = propertiesUtil.getProperty(jasperPrint, JRXlsAbstractExporter.PROPERTY_FIT_WIDTH);
String fitHeight = propertiesUtil.getProperty(jasperPrint, JRXlsAbstractExporter.PROPERTY_FIT_HEIGHT);
String fitToPage = noScale && (fitHeight != null || fitWidth != null) ? "" : "";
write("" + fitToPage + " 0 || columnFreeze > 0)
{
write(">\n 0 ? (" xSplit=\"" + columnFreeze + "\"") : "") + (rowFreeze > 0 ? (" ySplit=\"" + rowFreeze + "\"") : ""));
String columnName = propertiesUtil.getProperty(jasperPrint, JRXlsAbstractExporter.PROPERTY_FREEZE_COLUMN) == null
? "A"
: propertiesUtil.getProperty(jasperPrint, JRXlsAbstractExporter.PROPERTY_FREEZE_COLUMN);
write(" topLeftCell=\"" + columnName + (rowFreeze + 1) + "\"");
String activePane = (rowFreeze > 0 ? "bottom" : "top") + (columnFreeze > 0 ? "Right" : "Left");
write(" activePane=\"" + activePane + "\" state=\"frozen\"/>\n");
write(" \n");
write(" \n \n");
}
else
{
write("/>\n");
}
write("\n");
}
/**
*
*/
public void exportHeader(int scale, int rowFreeze, int columnFreeze, JasperPrint jasperPrint)
{
exportHeader(true, scale, rowFreeze, columnFreeze, jasperPrint);
}
/**
*
*/
public void exportFooter(int index, JasperPrint jasperPrint, boolean isIgnorePageMargins)
{
exportFooter(index, jasperPrint, isIgnorePageMargins, null, null);
}
/**
*
*/
public void exportFooter(int index, JasperPrint jasperPrint, boolean isIgnorePageMargins, String autoFilter)
{
exportFooter(index, jasperPrint, isIgnorePageMargins, autoFilter, null);
}
/**
*
*/
public void exportFooter(int index, JasperPrint jasperPrint, boolean isIgnorePageMargins, String autoFilter, Integer scale)
{
exportFooter(index, jasperPrint, isIgnorePageMargins, autoFilter, null, null, true);
}
/**
*
*/
public void exportFooter(
int index,
JasperPrint jasperPrint,
boolean isIgnorePageMargins,
String autoFilter,
Integer scale,
Integer firstPageNumber,
boolean firstPageNotSet)
{
if (rowIndex > 0)
{
write("\n");
}
else
{
if (!colsWriter.isEmpty())
{
write("\n");
colsWriter.writeData(writer);
write(" \n");
}
write("\n");
}
write(" \n");
if(autoFilter != null)
{
write(" \n");
}
if (!mergedCellsWriter.isEmpty())
{
write("\n");
mergedCellsWriter.writeData(writer);
write(" \n");
}
if (!hyperlinksWriter.isEmpty())
{
write("\n");
hyperlinksWriter.writeData(writer);
write(" \n");
}
write("\n");
write(" 9 && scale < 401)
{
write(" scale=\"" + scale + "\"");
}
else
{
String fitWidth = propertiesUtil.getProperty(jasperPrint, JRXlsAbstractExporter.PROPERTY_FIT_WIDTH);
if(fitWidth != null && !"1".equals(fitWidth))
{
write(" fitToWidth=\"" + fitWidth + "\"");
}
String fitHeight = propertiesUtil.getProperty(jasperPrint, JRXlsAbstractExporter.PROPERTY_FIT_HEIGHT);
if(fitHeight != null && !"1".equals(fitHeight))
{
write(" fitToHeight=\"" + fitHeight + "\"");
}
}
byte pSize = getSuitablePaperSize(jasperPrint);
String paperSize = pSize == PaperSizeEnum.UNDEFINED.getValue() ? "" : " paperSize=\"" + pSize + "\"";
write(paperSize);
if(firstPageNumber!= null && firstPageNumber > 0)
{
write(" firstPageNumber=\"" + firstPageNumber + "\"");
write(" useFirstPageNumber=\"1\"/>\n");
}
else
{
write("/>\n");
}
if(!firstPageNotSet)
{
//TODO: support for customized headers/footers in XLSX
write("Page &P \n");
}
write(" ");
}
/**
*
*/
public void exportColumn(int colIndex, int colWidth, boolean autoFit)
{
try
{
//colsWriter.write(" \n");
//the col autofit does not work even if you comment out this line and use the above one; but you can try again
colsWriter.write(" \n");
// colsWriter.write(" \n");
}
catch (IOException e)
{
throw new JRRuntimeException(e);
}
}
/**
*
*/
public void exportRow(int rowHeight, Cut yCut, XlsRowLevelInfo levelInfo)
{
if (rowIndex > 0)
{
write("\n");
}
else
{
if (!colsWriter.isEmpty())
{
write("\n");
colsWriter.writeData(writer);
write(" \n");
}
write("\n");
}
rowIndex++;
boolean isAutoFit = yCut.getPropertiesMap().containsKey(JRXlsAbstractExporter.PROPERTY_AUTO_FIT_ROW)
&& (Boolean)yCut.getPropertiesMap().get(JRXlsAbstractExporter.PROPERTY_AUTO_FIT_ROW);
write(" 0)
{
write(" outlineLevel=\"" + levelInfo.getLevelMap().size() + "\"");
}
write(">\n");
}
/**
*
*/
public void exportRow(int rowHeight)
{
if (rowIndex > 0)
{
write("
\n");
}
else
{
if (!colsWriter.isEmpty())
{
write("\n");
colsWriter.writeData(writer);
write(" \n");
}
write("\n");
}
rowIndex++;
write("\n");
}
/**
*
*/
public void exportMergedCells(int row, int col, int rowSpan, int colSpan)
{
rowSpan = isCollapseRowSpan ? 1 : rowSpan;
if (rowSpan > 1 || colSpan > 1)
{
String ref =
XlsxCellHelper.getColumIndexLetter(col) + (row + 1)
+ ":" + XlsxCellHelper.getColumIndexLetter(col + colSpan - 1) + (row + rowSpan); //FIXMEXLSX reuse this utility method
try
{
mergedCellsWriter.write(" \n");
}
catch (IOException e)
{
throw new JRRuntimeException(e);
}
}
}
/**
*
*/
public void exportHyperlink(int row, int col, String href)
{
String ref =
XlsxCellHelper.getColumIndexLetter(col) + (row + 1);
try
{
hyperlinksWriter.write(" \n");
}
catch (IOException e)
{
throw new JRRuntimeException(e);
}
}
private final byte getSuitablePaperSize(JasperPrint jasP)
{
if (jasP == null)
{
return -1;
}
long width = 0;
long height = 0;
if ((jasP.getPageWidth() != 0) && (jasP.getPageHeight() != 0))
{
double dWidth = (jasP.getPageWidth() / 72.0);
double dHeight = (jasP.getPageHeight() / 72.0);
height = Math.round(dHeight * 25.4);
width = Math.round(dWidth * 25.4);
// Compare to ISO 216 A-Series (A3-A5). All other ISO 216 formats
// not supported by POI Api yet.
// A3 papersize also not supported by POI Api yet.
for (int i = 3; i < 6; i++)
{
int w = calculateWidthForDinAN(i);
int h = calculateHeightForDinAN(i);
if (((w == width) && (h == height)) || ((h == width) && (w == height)))
{
return i == 3 ? PaperSizeEnum.A3.getValue() : (i == 4 ? PaperSizeEnum.A4.getValue() : PaperSizeEnum.A5.getValue());
}
}
// ISO 269 sizes - "Envelope DL" (110 � 220 mm)
if (((width == 110) && (height == 220)) || ((width == 220) && (height == 110)))
{
return PaperSizeEnum.ENVELOPE_DL.getValue();
}
// Compare to common North American Paper Sizes (ANSI X3.151-1987).
// ANSI X3.151-1987 - "Letter" (216 � 279 mm)
if (((width == 216) && (height == 279)) || ((width == 279) && (height == 216)))
{
return PaperSizeEnum.LETTER.getValue();
}
// ANSI X3.151-1987 - "Legal" (216 � 356 mm)
if (((width == 216) && (height == 356)) || ((width == 356) && (height == 216)))
{
return PaperSizeEnum.LEGAL.getValue();
}
// ANSI X3.151-1987 - "Executive" (190 � 254 mm)
else if (((width == 190) && (height == 254)) || ((width == 254) && (height == 190)))
{
return PaperSizeEnum.EXECUTIVE.getValue();
}
// ANSI X3.151-1987 - "Ledger/Tabloid" (279 � 432 mm)
// Not supported by POI Api yet.
}
return PaperSizeEnum.UNDEFINED.getValue();
}
// Berechnungsvorschriften f�r die DIN Formate A, B, und C.
// Die Angabe der Breite/H�he erfolgt in [mm].
protected final int calculateWidthForDinAN(int n)
{
return (int) (Math.pow(2.0, (-0.25 - (n / 2.0))) * 1000.0);
}
protected final int calculateHeightForDinAN(int n)
{
return (int) (Math.pow(2.0, (0.25 - (n / 2.0))) * 1000.0);
}
}