diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractExporter.java index cacc108605..a12857f280 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractExporter.java @@ -1248,7 +1248,7 @@ else if (element instanceof JRPrintRectangle) } else if (element instanceof JRPrintEllipse) { - exportRectangle((JRPrintEllipse)element, gridCell, colIndex, rowIndex); + exportEllipse((JRPrintEllipse)element, gridCell, colIndex, rowIndex); } else if (element instanceof JRPrintImage) { @@ -2404,7 +2404,9 @@ protected void configureDefinedNames(PropertySuffix propertySuffix) protected abstract void exportImage(JRPrintImage image, JRExporterGridCell cell, int colIndex, int rowIndex, int emptyCols, int yCutsRow, JRGridLayout layout) throws JRException; - protected abstract void exportRectangle(JRPrintGraphicElement element, JRExporterGridCell cell, int colIndex, int rowIndex) throws JRException; + protected abstract void exportRectangle(JRPrintRectangle element, JRExporterGridCell cell, int colIndex, int rowIndex) throws JRException; + + protected abstract void exportEllipse(JRPrintEllipse element, JRExporterGridCell cell, int colIndex, int rowIndex) throws JRException; protected abstract void exportLine(JRPrintLine line, JRExporterGridCell cell, int colIndex, int rowIndex) throws JRException; diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractMetadataExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractMetadataExporter.java index cfefa54221..7fa7d8e8d7 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractMetadataExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractMetadataExporter.java @@ -332,7 +332,7 @@ else if (element instanceof JRPrintRectangle) } else if (element instanceof JRPrintEllipse) { - exportRectangle((JRPrintEllipse)element); + exportEllipse((JRPrintEllipse)element); } else if (element instanceof JRPrintImage) { @@ -547,7 +547,12 @@ public void exportImage(JRPrintImage image, JRExporterGridCell cell, int colInde } @Override - protected void exportRectangle(JRPrintGraphicElement element, JRExporterGridCell cell, int colIndex, int rowIndex) throws JRException + protected void exportRectangle(JRPrintRectangle element, JRExporterGridCell cell, int colIndex, int rowIndex) throws JRException + { + } + + @Override + protected void exportEllipse(JRPrintEllipse element, JRExporterGridCell cell, int colIndex, int rowIndex) throws JRException { } @@ -617,7 +622,9 @@ protected void setRowHeight(int rowIndex, int lastRowHeight) throws JRException public abstract void exportImage(JRPrintImage image) throws JRException; - protected abstract void exportRectangle(JRPrintGraphicElement element) throws JRException; + protected abstract void exportRectangle(JRPrintRectangle element) throws JRException; + + protected abstract void exportEllipse(JRPrintEllipse element) throws JRException; protected abstract void exportLine(JRPrintLine line) throws JRException; diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java index 082bb615e4..e4b1801aba 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java @@ -64,7 +64,9 @@ import org.apache.poi.hssf.usermodel.HSSFPrintSetup; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFShape; import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFSimpleShape; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.usermodel.HeaderFooter; import org.apache.poi.hssf.util.HSSFColor; @@ -91,11 +93,13 @@ import net.sf.jasperreports.engine.JRLineBox; import net.sf.jasperreports.engine.JRPen; import net.sf.jasperreports.engine.JRPrintElement; +import net.sf.jasperreports.engine.JRPrintEllipse; import net.sf.jasperreports.engine.JRPrintFrame; import net.sf.jasperreports.engine.JRPrintGraphicElement; import net.sf.jasperreports.engine.JRPrintHyperlink; import net.sf.jasperreports.engine.JRPrintImage; import net.sf.jasperreports.engine.JRPrintLine; +import net.sf.jasperreports.engine.JRPrintRectangle; import net.sf.jasperreports.engine.JRPrintText; import net.sf.jasperreports.engine.JRPropertiesUtil; import net.sf.jasperreports.engine.JRRuntimeException; @@ -111,6 +115,7 @@ import net.sf.jasperreports.engine.export.type.ImageAnchorTypeEnum; import net.sf.jasperreports.engine.type.ImageTypeEnum; import net.sf.jasperreports.engine.type.LineDirectionEnum; +import net.sf.jasperreports.engine.type.LineStyleEnum; import net.sf.jasperreports.engine.type.ModeEnum; import net.sf.jasperreports.engine.type.OrientationEnum; import net.sf.jasperreports.engine.type.RunDirectionEnum; @@ -151,7 +156,7 @@ public class JRXlsExporter extends JRXlsAbstractExporter hssfColorsRgbs; static @@ -739,99 +744,161 @@ protected void addOccupiedCell(OccupiedGridCell occupiedGridCell, int colIndex, @Override protected void exportLine(JRPrintLine line, JRExporterGridCell gridCell, int colIndex, int rowIndex) { - short forecolor = getWorkbookColor(line.getLinePen().getLineColor()).getIndex(); - - int side = BoxStyle.TOP; - float ratio = line.getWidth() / line.getHeight(); - if (ratio > 1) + int row1 = rowIndex; + int row2 = rowIndex; + if (line.getDirectionValue() == LineDirectionEnum.TOP_DOWN) { - if (line.getDirectionValue() == LineDirectionEnum.TOP_DOWN) - { - side = BoxStyle.TOP; - } - else - { - side = BoxStyle.BOTTOM; - } + row2 += gridCell.getRowSpan(); } else { - if (line.getDirectionValue() == LineDirectionEnum.TOP_DOWN) - { - side = BoxStyle.LEFT; - } - else + row1 += gridCell.getRowSpan(); + } + HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) colIndex, row1, (short) (colIndex + gridCell.getColSpan()), row2); + HSSFSimpleShape shape = patriarch.createSimpleShape(anchor); + shape.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE ); + JRPen pen = line.getLinePen(); + + if (pen.getLineWidth() > 0) + { + shape.setLineWidth(LengthUtil.emu(Math.round(pen.getLineWidth()))); + switch (pen.getLineStyleValue()) { - side = BoxStyle.RIGHT; + case DASHED : + { + shape.setLineStyle(HSSFShape.LINESTYLE_DASHGEL); + break; + } + case DOTTED : + { + shape.setLineStyle(HSSFShape.LINESTYLE_DOTSYS); + break; + } + case DOUBLE : + case SOLID : + default : + { + shape.setLineStyle(HSSFShape.LINESTYLE_SOLID); + break; + } } } - BoxStyle boxStyle = new BoxStyle(side, line.getLinePen()); - FillPatternType mode = backgroundMode; - short backcolor = whiteIndex; - if (!Boolean.TRUE.equals(sheetInfo.ignoreCellBackground) && gridCell.getCellBackcolor() != null) + Color penColor = pen.getLineColor(); + shape.setLineStyleColor(penColor.getRed(), penColor.getGreen(), penColor.getBlue()); + + if (line.getModeValue() == ModeEnum.OPAQUE && line.getBackcolor() != null) { - mode = FillPatternType.SOLID_FOREGROUND; - backcolor = getWorkbookColor(gridCell.getCellBackcolor()).getIndex(); + Color bgcolor = line.getBackcolor(); + shape.setFillColor(bgcolor.getRed(), bgcolor.getGreen(), bgcolor.getBlue()); + shape.setNoFill(true); + } + else + { + shape.setNoFill(true); } + createMergeRegion(gridCell, colIndex, rowIndex); + } - HSSFCellStyle cellStyle = - getLoadedCellStyle( - mode, - backcolor, - HorizontalAlignment.LEFT, - VerticalAlignment.TOP, - (short)0, - getLoadedFont(getDefaultFont(), forecolor, null, getLocale()), - boxStyle, - false, - isCellLocked(line), - isCellHidden(line), - isShrinkToFit(line) - ); - createMergeRegion(gridCell, colIndex, rowIndex, cellStyle); + @Override + protected void exportRectangle(JRPrintRectangle element, JRExporterGridCell gridCell, int colIndex, int rowIndex) + { + HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) colIndex, rowIndex, (short) (colIndex + gridCell.getColSpan()), rowIndex + gridCell.getRowSpan()); + HSSFSimpleShape shape = patriarch.createSimpleShape(anchor); + shape.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE ); + JRPen pen = element.getLinePen(); - cell = row.createCell(colIndex); - cell.setCellStyle(cellStyle); - } + if (pen.getLineWidth() > 0) + { + shape.setLineWidth(LengthUtil.emu(Math.round(pen.getLineWidth()))); + switch (pen.getLineStyleValue()) + { + case DASHED : + { + shape.setLineStyle(HSSFShape.LINESTYLE_DASHGEL); + break; + } + case DOTTED : + { + shape.setLineStyle(HSSFShape.LINESTYLE_DOTSYS); + break; + } + case DOUBLE : + case SOLID : + default : + { + shape.setLineStyle(HSSFShape.LINESTYLE_SOLID); + break; + } + } + } + Color penColor = pen.getLineColor(); + shape.setLineStyleColor(penColor.getRed(), penColor.getGreen(), penColor.getBlue()); + + if (element.getModeValue() == ModeEnum.OPAQUE && element.getBackcolor() != null) + { + Color bgcolor = element.getBackcolor(); + shape.setFillColor(bgcolor.getRed(), bgcolor.getGreen(), bgcolor.getBlue()); + shape.setNoFill(false); + } + else + { + shape.setNoFill(true); + } + createMergeRegion(gridCell, colIndex, rowIndex); + } @Override - protected void exportRectangle(JRPrintGraphicElement element, JRExporterGridCell gridCell, int colIndex, int rowIndex) + protected void exportEllipse(JRPrintEllipse element, JRExporterGridCell gridCell, int colIndex, int rowIndex) { - short forecolor = getWorkbookColor(element.getLinePen().getLineColor()).getIndex(); + HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) colIndex, rowIndex, (short) (colIndex + gridCell.getColSpan()), rowIndex + gridCell.getRowSpan()); + HSSFSimpleShape shape = patriarch.createSimpleShape(anchor); + shape.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL); + JRPen pen = element.getLinePen(); - FillPatternType mode = backgroundMode; - short backcolor = whiteIndex; - if (!Boolean.TRUE.equals(sheetInfo.ignoreCellBackground) && gridCell.getCellBackcolor() != null) + if (pen.getLineWidth() > 0) { - mode = FillPatternType.SOLID_FOREGROUND; - backcolor = getWorkbookColor(gridCell.getCellBackcolor()).getIndex(); + shape.setLineWidth(LengthUtil.emu(Math.round(pen.getLineWidth()))); + switch (pen.getLineStyleValue()) + { + case DASHED : + { + shape.setLineStyle(HSSFShape.LINESTYLE_DASHGEL); + break; + } + case DOTTED : + { + shape.setLineStyle(HSSFShape.LINESTYLE_DOTSYS); + break; + } + case DOUBLE : + case SOLID : + default : + { + shape.setLineStyle(HSSFShape.LINESTYLE_SOLID); + break; + } + } } - HSSFCellStyle cellStyle = - getLoadedCellStyle( - mode, - backcolor, - HorizontalAlignment.LEFT, - VerticalAlignment.TOP, - (short)0, - getLoadedFont(getDefaultFont(), forecolor, null, getLocale()), - gridCell, - isWrapText(element), - isCellLocked(element), - isCellHidden(element), - isShrinkToFit(element) - ); - - createMergeRegion(gridCell, colIndex, rowIndex, cellStyle); + Color penColor = pen.getLineColor(); + shape.setLineStyleColor(penColor.getRed(), penColor.getGreen(), penColor.getBlue()); - cell = row.createCell(colIndex); - cell.setCellStyle(cellStyle); + if (element.getModeValue() == ModeEnum.OPAQUE && element.getBackcolor() != null) + { + Color bgcolor = element.getBackcolor(); + shape.setFillColor(bgcolor.getRed(), bgcolor.getGreen(), bgcolor.getBlue()); + shape.setNoFill(false); + } + else + { + shape.setNoFill(true); + } + createMergeRegion(gridCell, colIndex, rowIndex); } - @Override public void exportText(JRPrintText textElement, JRExporterGridCell gridCell, int colIndex, int rowIndex) throws JRException { @@ -1146,6 +1213,34 @@ protected void createMergeRegion(JRExporterGridCell gridCell, int colIndex, int } } + protected void createMergeRegion(JRExporterGridCell gridCell, int colIndex, int rowIndex) + { + boolean isCollapseRowSpan = getCurrentItemConfiguration().isCollapseRowSpan(); + int rowSpan = isCollapseRowSpan ? 1 : gridCell.getRowSpan(); + if (gridCell.getColSpan() > 1 || rowSpan > 1) + { + sheet.addMergedRegion(new CellRangeAddress(rowIndex, (rowIndex + rowSpan - 1), + colIndex, (colIndex + gridCell.getColSpan() - 1))); + + for(int i = 0; i < rowSpan; i++) + { + HSSFRow spanRow = sheet.getRow(rowIndex + i); + if (spanRow == null) + { + spanRow = sheet.createRow(rowIndex + i); + } + for(int j = 0; j < gridCell.getColSpan(); j++) + { + HSSFCell spanCell = spanRow.getCell((colIndex + j)); + if (spanCell == null) + { + spanCell = spanRow.createCell((colIndex + j)); + } + } + } + } + } + private HorizontalAlignment getHorizontalAlignment(TextAlignHolder alignment) { switch (alignment.horizontalAlignment) diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsMetadataExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsMetadataExporter.java index 7a87ce5c71..080dbe0337 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsMetadataExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsMetadataExporter.java @@ -744,7 +744,7 @@ protected void exportLine(JRPrintLine line) throws JRException { } @Override - protected void exportRectangle(JRPrintGraphicElement element) throws JRException { + protected void exportRectangle(JRPrintRectangle element) throws JRException { String currentColumnName = element.getPropertiesMap().getProperty(JRXlsAbstractMetadataExporter.PROPERTY_COLUMN_NAME); if (currentColumnName != null && currentColumnName.length() > 0) { @@ -780,6 +780,42 @@ protected void exportRectangle(JRPrintGraphicElement element) throws JRException } } + @Override + protected void exportEllipse(JRPrintEllipse element) throws JRException { // TODO need to fix to show ellipse on xls metadata + String currentColumnName = element.getPropertiesMap().getProperty(JRXlsAbstractMetadataExporter.PROPERTY_COLUMN_NAME); + + if (currentColumnName != null && currentColumnName.length() > 0) { + boolean repeatValue = getPropertiesUtil().getBooleanProperty(element, JRXlsAbstractMetadataExporter.PROPERTY_REPEAT_VALUE, false); + + setColumnName(currentColumnName); + adjustColumnWidth(currentColumnName, element.getWidth(), ((JRXlsExporterNature)nature).getColumnAutoFit(element)); + adjustRowHeight(element.getHeight(), ((JRXlsExporterNature)nature).getRowAutoFit(element)); + + short forecolor = getWorkbookColor(element.getLinePen().getLineColor()).getIndex(); + + FillPatternType mode = backgroundMode; + short backcolor = whiteIndex; + if (!Boolean.TRUE.equals(sheetInfo.ignoreCellBackground) && element.getBackcolor() != null) { + mode = FillPatternType.SOLID_FOREGROUND; + backcolor = getWorkbookColor(element.getBackcolor()).getIndex(); + } + + HSSFCellStyle cellStyle = + getLoadedCellStyle( + mode, + backcolor, + HorizontalAlignment.LEFT, + VerticalAlignment.TOP, + (short)0, + getLoadedFont(getDefaultFont(), forecolor, null, getLocale()), + new BoxStyle(element), + isCellLocked(element), + isCellHidden(element), + isShrinkToFit(element) + ); + addBlankElement(cellStyle, repeatValue, currentColumnName); + } + } @Override protected void exportText(final JRPrintText textElement) throws JRException { @@ -1630,7 +1666,7 @@ protected void exportFrame(JRPrintFrame frame) throws JRException { } else if (element instanceof JRPrintRectangle) { exportRectangle((JRPrintRectangle)element); } else if (element instanceof JRPrintEllipse) { - exportRectangle((JRPrintEllipse)element); + exportEllipse((JRPrintEllipse)element); } else if (element instanceof JRPrintImage) { exportImage((JRPrintImage) element); } else if (element instanceof JRPrintText) { diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/oasis/GraphicStyle.java b/jasperreports/src/net/sf/jasperreports/engine/export/oasis/GraphicStyle.java index 0e07331946..da9177a451 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/oasis/GraphicStyle.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/oasis/GraphicStyle.java @@ -212,7 +212,14 @@ public void write(String lineStyleName) styleWriter.write(" \n"); styleWriter.write(" 1) // { // tempBodyWriter.write(" table:number-columns-spanned=\"" + emptyCellColSpan + "\""); -// } - tempBodyWriter.write("/>\n"); +// } **/ + tempColumnWriter.append("/>\n"); // // exportOccupiedCells(emptyCellColSpan - 1); } @@ -508,7 +517,7 @@ protected String getCellAddress(int row, int col) @Override protected void exportRectangle( - JRPrintGraphicElement rectangle, + JRPrintRectangle rectangle, JRExporterGridCell gridCell, int colIndex, int rowIndex @@ -517,6 +526,17 @@ protected void exportRectangle( tableBuilder.exportRectangle(rectangle, gridCell); } + @Override + protected void exportEllipse( // TODO need to fix to display ellipse on ods export + JRPrintEllipse ellipse, + JRExporterGridCell gridCell, + int colIndex, + int rowIndex + ) throws JRException + { + tableBuilder.exportEllipse(ellipse, gridCell); + } + @Override protected void exportLine( JRPrintLine line, @@ -525,70 +545,7 @@ protected void exportLine( int rowIndex ) throws JRException { - JRLineBox box = new JRBaseLineBox(null); - JRPen pen = null; - float ratio = line.getWidth() / line.getHeight(); - if (ratio > 1) - { - if (line.getDirectionValue() == LineDirectionEnum.TOP_DOWN) - { - pen = box.getTopPen(); - } - else - { - pen = box.getBottomPen(); - } - } - else - { - if (line.getDirectionValue() == LineDirectionEnum.TOP_DOWN) - { - pen = box.getLeftPen(); - } - else - { - pen = box.getRightPen(); - } - } - pen.setLineColor(line.getLinePen().getLineColor()); - pen.setLineStyle(line.getLinePen().getLineStyleValue()); - pen.setLineWidth(line.getLinePen().getLineWidth()); - - gridCell.setBox(box);//CAUTION: only some exporters set the cell box - - tableBuilder.buildCellHeader(styleCache.getCellStyle(gridCell), gridCell.getColSpan(), gridCell.getRowSpan()); - -// double x1, y1, x2, y2; -// -// if (line.getDirection() == JRLine.DIRECTION_TOP_DOWN) -// { -// x1 = Utility.translatePixelsToInches(0); -// y1 = Utility.translatePixelsToInches(0); -// x2 = Utility.translatePixelsToInches(line.getWidth() - 1); -// y2 = Utility.translatePixelsToInches(line.getHeight() - 1); -// } -// else -// { -// x1 = Utility.translatePixelsToInches(0); -// y1 = Utility.translatePixelsToInches(line.getHeight() - 1); -// x2 = Utility.translatePixelsToInches(line.getWidth() - 1); -// y2 = Utility.translatePixelsToInches(0); -// } - - tempBodyWriter.write(""); -//FIXMEODS insertPageAnchor(); -// tempBodyWriter.write( -// "" -// //+ "" -// + "" -// ); - tempBodyWriter.write(""); - tableBuilder.buildCellFooter(); + tableBuilder.exportLine(line, gridCell); } @Override @@ -746,7 +703,9 @@ protected OdsTableBuilder( DocumentBuilder documentBuilder, JasperPrint jasperPrint, int pageFormatIndex, - int pageIndex, + int pageIndex, + StringBuffer tempShapeWriter, + StringBuffer tempColumnWriter, WriterHelper bodyWriter, WriterHelper styleWriter, StyleCache styleCache, @@ -758,7 +717,9 @@ protected OdsTableBuilder( documentBuilder, jasperPrint, pageFormatIndex, - pageIndex, + pageIndex, + tempShapeWriter, + tempColumnWriter, bodyWriter, styleWriter, styleCache, @@ -771,7 +732,9 @@ protected OdsTableBuilder( DocumentBuilder documentBuilder, JasperPrint jasperPrint, int pageFormatIndex, - int pageIndex, + int pageIndex, + StringBuffer tempShapeWriter, + StringBuffer tempColumnWriter, WriterHelper bodyWriter, WriterHelper styleWriter, StyleCache styleCache, @@ -784,7 +747,9 @@ protected OdsTableBuilder( documentBuilder, jasperPrint, pageFormatIndex, - pageIndex, + pageIndex, + tempShapeWriter, + tempColumnWriter, bodyWriter, styleWriter, styleCache, diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/oasis/TableBuilder.java b/jasperreports/src/net/sf/jasperreports/engine/export/oasis/TableBuilder.java index 9bf0c2d1d0..f29e21f7a3 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/oasis/TableBuilder.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/oasis/TableBuilder.java @@ -46,6 +46,7 @@ import net.sf.jasperreports.engine.JRPrintLine; import net.sf.jasperreports.engine.JRPrintText; import net.sf.jasperreports.engine.JRPropertiesUtil; +import net.sf.jasperreports.engine.JRPrintRectangle; import net.sf.jasperreports.engine.JRRuntimeException; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReportsContext; @@ -72,6 +73,8 @@ public class TableBuilder protected String tableName; private final JasperPrint jasperPrint; private int pageFormatIndex; + private StringBuffer shapeWriter; + private StringBuffer columnWriter; private final WriterHelper bodyWriter; private final WriterHelper styleWriter; private final StyleCache styleCache; @@ -87,6 +90,8 @@ protected TableBuilder( DocumentBuilder documentBuilder, JasperPrint jasperPrint, String name, + StringBuffer shapeWriter, + StringBuffer columnWriter, WriterHelper bodyWriter, WriterHelper styleWriter, StyleCache styleCache, @@ -101,6 +106,8 @@ protected TableBuilder( isFrame = true; isPageBreak = false; + this.shapeWriter = shapeWriter; + this.columnWriter = columnWriter; this.bodyWriter = bodyWriter; this.styleWriter = styleWriter; this.styleCache = styleCache; @@ -111,6 +118,21 @@ protected TableBuilder( this.tabColor = tabColor; } + protected TableBuilder( + DocumentBuilder documentBuilder, + JasperPrint jasperPrint, + String name, + WriterHelper bodyWriter, + WriterHelper styleWriter, + StyleCache styleCache, + Map rowStyles, + Map columnStyles, + Color tabColor + ) + { + this(documentBuilder, jasperPrint, name, null, null, bodyWriter, styleWriter, styleCache, rowStyles, columnStyles, null); + } + protected TableBuilder( DocumentBuilder documentBuilder, JasperPrint jasperPrint, @@ -132,6 +154,8 @@ protected TableBuilder( JasperPrint jasperPrint, int pageFormatIndex, int pageIndex, + StringBuffer shapeWriter, + StringBuffer columnWriter, WriterHelper bodyWriter, WriterHelper styleWriter, StyleCache styleCache, @@ -147,6 +171,8 @@ protected TableBuilder( isPageBreak = (pageFormatIndex != 0 || pageIndex != 0); this.pageFormatIndex = pageFormatIndex; + this.shapeWriter = shapeWriter; + this.columnWriter = columnWriter; this.bodyWriter = bodyWriter; this.styleWriter = styleWriter; this.styleCache = styleCache; @@ -157,6 +183,21 @@ protected TableBuilder( this.tabColor = tabColor; } + protected TableBuilder( + DocumentBuilder documentBuilder, + JasperPrint jasperPrint, + int pageFormatIndex, + int pageIndex, + WriterHelper bodyWriter, + WriterHelper styleWriter, + StyleCache styleCache, + Map rowStyles, + Map columnStyles, + Color tabColor + ) + { + this(documentBuilder, jasperPrint, pageFormatIndex, pageIndex, null, null, bodyWriter, styleWriter, styleCache, rowStyles, columnStyles, tabColor); + } protected TableBuilder( DocumentBuilder documentBuilder, @@ -202,6 +243,12 @@ public void buildTableHeader() public void buildTableFooter() { + if (shapeWriter != null) { + bodyWriter.write(shapeWriter.toString()); + } + if (columnWriter != null) { + bodyWriter.write(columnWriter.toString()); + } bodyWriter.write("\n"); } @@ -216,14 +263,24 @@ public void buildRowStyle(int rowIndex, int rowHeight) public void buildRowHeader(int rowHeight) { - bodyWriter.write("\n"); + if (columnWriter != null) { + columnWriter.append("\n"); + } else { + bodyWriter.write("\n"); + } } public void buildRowFooter() { - bodyWriter.write("\n"); + if (columnWriter != null) { + columnWriter.append("\n"); + } else { + bodyWriter.write("\n"); + } } public void buildRow(int rowIndex, int rowHeight) @@ -246,55 +303,121 @@ public void buildColumnStyle(int colIndex, int colWidth) public void buildColumnHeader(int colWidth) { - bodyWriter.write("\n"); + if (columnWriter != null) { + columnWriter.append("\n"); + } else { + bodyWriter.write("\n"); + } } public void buildColumnFooter() { - bodyWriter.write("\n"); + if (columnWriter != null) { + columnWriter.append("\n"); + } else { + bodyWriter.write("\n"); + } } public void buildCellHeader(String cellStyleName, int colSpan, int rowSpan) { - //FIXMEODT officevalue bodyWriter.write(" 1) - { - bodyWriter.write(" table:number-columns-spanned=\"" + colSpan + "\""); - } - if (rowSpan > 1) - { - bodyWriter.write(" table:number-rows-spanned=\"" + rowSpan + "\""); + if (columnWriter != null) { + //FIXMEODT officevalue bodyWriter.write(" 1) + { + columnWriter.append(" table:number-columns-spanned=\"" + colSpan + "\""); + } + if (rowSpan > 1) + { + columnWriter.append(" table:number-rows-spanned=\"" + rowSpan + "\""); + } + + columnWriter.append(">\n"); + } else { + //FIXMEODT officevalue bodyWriter.write(" 1) + { + bodyWriter.write(" table:number-columns-spanned=\"" + colSpan + "\""); + } + if (rowSpan > 1) + { + bodyWriter.write(" table:number-rows-spanned=\"" + rowSpan + "\""); + } + + bodyWriter.write(">\n"); } - - bodyWriter.write(">\n"); } public void buildCellFooter() { - bodyWriter.write("\n"); + if (columnWriter != null) { + columnWriter.append("\n"); + } else { + bodyWriter.write("\n"); + } } /** * */ - public void exportRectangle(JRPrintGraphicElement rectangle, JRExporterGridCell gridCell) + public void exportRectangle(JRPrintRectangle rectangle, JRExporterGridCell gridCell) { - JRLineBox box = new JRBaseLineBox(null); - JRPen pen = box.getPen(); - pen.setLineColor(rectangle.getLinePen().getLineColor()); - pen.setLineStyle(rectangle.getLinePen().getLineStyleValue()); - pen.setLineWidth(rectangle.getLinePen().getLineWidth()); - - gridCell.setBox(box);//CAUTION: only some exporters set the cell box - + if (shapeWriter != null) { + documentBuilder.insertPageAnchor(this); + if (rectangle.getRadius() > 0) + { + int size = Math.min(50000, ((rectangle).getRadius() * 100000)/Math.min(rectangle.getHeight(), rectangle.getWidth())); + shapeWriter.append( + "" + + "" + + "" + + "" + + "" + + "" + ); + } + else + { + shapeWriter.append( + "" // hozawa 20190409 + + "" // hozawa 20190409 + //+ "" // hozawa 20190409 + ); + } + } else { + JRLineBox box = new JRBaseLineBox(null); + JRPen pen = box.getPen(); + pen.setLineColor(rectangle.getLinePen().getLineColor()); + pen.setLineStyle(rectangle.getLinePen().getLineStyleValue()); + pen.setLineWidth(rectangle.getLinePen().getLineWidth()); + + gridCell.setBox(box);//CAUTION: only some exporters set the cell box + } buildCellHeader(styleCache.getCellStyle(gridCell), gridCell.getColSpan(), gridCell.getRowSpan()); buildCellFooter(); } @@ -305,39 +428,64 @@ public void exportRectangle(JRPrintGraphicElement rectangle, JRExporterGridCell */ public void exportLine(JRPrintLine line, JRExporterGridCell gridCell) { - buildCellHeader(null, gridCell.getColSpan(), gridCell.getRowSpan()); - double x1, y1, x2, y2; - if (line.getDirectionValue() == LineDirectionEnum.TOP_DOWN) - { - x1 = 0; - y1 = 0; - x2 = line.getWidth() - 1; - y2 = line.getHeight() - 1; + if (shapeWriter != null) { + if (line.getDirectionValue() == LineDirectionEnum.TOP_DOWN) + { + x1 = line.getX(); + x2 = x1 + line.getWidth() - 1; + y1 = line.getY()+1; + y2 = y1 + line.getHeight() - 1; + } + else + { + x1 = line.getX(); + x2 = x1 + line.getWidth() - 1; + y2 = line.getY()+1; + y1 = y2 + line.getHeight() - 1; + } + documentBuilder.insertPageAnchor(this); + shapeWriter.append( + "" + + "" + ); + } else { + if (line.getDirectionValue() == LineDirectionEnum.TOP_DOWN) + { + x1 = 0; + y1 = 0; + x2 = line.getWidth() - 1; + y2 = line.getHeight() - 1; + } + else + { + x1 = 0; + y1 = line.getHeight() - 1; + x2 = line.getWidth() - 1; + y2 = 0; + } + buildCellHeader(null, gridCell.getColSpan(), gridCell.getRowSpan()); + + bodyWriter.write(""); + documentBuilder.insertPageAnchor(this); + bodyWriter.write( + "" + + "" + + "" + ); + buildCellFooter(); } - else - { - x1 = 0; - y1 = line.getHeight() - 1; - x2 = line.getWidth() - 1; - y2 = 0; - } - - bodyWriter.write(""); - documentBuilder.insertPageAnchor(this); - bodyWriter.write( - "" - //+ "" - + "" - + "" - ); - buildCellFooter(); } @@ -347,17 +495,30 @@ public void exportLine(JRPrintLine line, JRExporterGridCell gridCell) public void exportEllipse(JRPrintEllipse ellipse, JRExporterGridCell gridCell) { buildCellHeader(null, gridCell.getColSpan(), gridCell.getRowSpan()); - bodyWriter.write(""); - documentBuilder.insertPageAnchor(this); - bodyWriter.write( - "" - + "" - ); + if (shapeWriter != null) { + documentBuilder.insertPageAnchor(this); + shapeWriter.append( + "" + + "" + ); + } else { + bodyWriter.write(""); + documentBuilder.insertPageAnchor(this); + bodyWriter.write( + "" + + "" + ); + } buildCellFooter(); } @@ -368,20 +529,33 @@ public void exportEllipse(JRPrintEllipse ellipse, JRExporterGridCell gridCell) public void exportText(JRPrintText text, JRExporterGridCell gridCell, boolean shrinkToFit, boolean wrapText, boolean isIgnoreTextFormatting) { buildCellHeader((isIgnoreTextFormatting ? null : styleCache.getCellStyle(gridCell, shrinkToFit, wrapText)), gridCell.getColSpan(), gridCell.getRowSpan()); - - bodyWriter.write(""); - documentBuilder.insertPageAnchor(this); - if (text.getAnchorName() != null) - { - exportAnchor(JRStringUtil.xmlEncode(text.getAnchorName())); - } + if (columnWriter != null) { + columnWriter.append(""); + documentBuilder.insertPageAnchor(this); + if (text.getAnchorName() != null) + { + exportAnchor(JRStringUtil.xmlEncode(text.getAnchorName())); + } - exportTextContents(text); + exportTextContents(text); + + columnWriter.append("\n"); + } else { + bodyWriter.write(""); + documentBuilder.insertPageAnchor(this); + if (text.getAnchorName() != null) + { + exportAnchor(JRStringUtil.xmlEncode(text.getAnchorName())); + } - bodyWriter.write("\n"); + exportTextContents(text); + bodyWriter.write("\n"); + } buildCellFooter(); } @@ -482,13 +656,23 @@ protected void exportStyledTextRun( */ protected void startTextSpan(Map attributes, String text, Locale locale, boolean isIgnoreTextFormatting) { - bodyWriter.write(""); + } else { + bodyWriter.write(""); } - bodyWriter.write(">"); } @@ -497,7 +681,11 @@ protected void startTextSpan(Map */ protected void endTextSpan() { - bodyWriter.write(""); + if (columnWriter != null) { + columnWriter.append(""); + } else { + bodyWriter.write(""); + } } @@ -508,7 +696,11 @@ protected void writeText(String text) { if (text != null) { - bodyWriter.write(Utility.replaceNewLineWithLineBreak(JRStringUtil.xmlEncode(text, documentBuilder.getInvalidCharReplacement())));//FIXMEODT try something nicer for replace + if (columnWriter != null) { + columnWriter.append(Utility.replaceNewLineWithLineBreak(JRStringUtil.xmlEncode(text, documentBuilder.getInvalidCharReplacement())));//FIXMEODT try something nicer for replace + } else { + bodyWriter.write(Utility.replaceNewLineWithLineBreak(JRStringUtil.xmlEncode(text, documentBuilder.getInvalidCharReplacement())));//FIXMEODT try something nicer for replace + } } } @@ -518,9 +710,15 @@ protected void writeText(String text) */ protected void exportAnchor(String anchorName) { - bodyWriter.write(""); + if (columnWriter != null) { + columnWriter.append(""); + } else { + bodyWriter.write(""); + } } @@ -575,40 +773,77 @@ protected boolean startHyperlink(JRPrintHyperlink link, boolean isText, boolean */ protected void writeHyperlink(JRPrintHyperlink link, String href, boolean isText) { - if(isText) - { - bodyWriter.write(""); + } else { + if(isText) + { + bodyWriter.write(""); } -*/ - bodyWriter.write(">"); } @@ -617,13 +852,24 @@ protected void writeHyperlink(JRPrintHyperlink link, String href, boolean isText */ protected void endHyperlink(boolean isText) { - if(isText) - { - bodyWriter.write(""); - } - else - { - bodyWriter.write(""); + if (columnWriter != null) { + if(isText) + { + columnWriter.append(""); + } + else + { + columnWriter.append(""); + } + } else { + if(isText) + { + bodyWriter.write(""); + } + else + { + bodyWriter.write(""); + } } } @@ -663,4 +909,4 @@ protected JasperReportsContext getJasperReportsContext() public String getTableName() { return tableName; } -} \ No newline at end of file +} diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/ooxml/JRXlsxExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/ooxml/JRXlsxExporter.java index 073e06d979..ce921b8b4e 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/ooxml/JRXlsxExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/ooxml/JRXlsxExporter.java @@ -51,12 +51,14 @@ import net.sf.jasperreports.engine.JRPen; import net.sf.jasperreports.engine.JRPrintElement; import net.sf.jasperreports.engine.JRPrintElementIndex; +import net.sf.jasperreports.engine.JRPrintEllipse; import net.sf.jasperreports.engine.JRPrintFrame; import net.sf.jasperreports.engine.JRPrintGraphicElement; import net.sf.jasperreports.engine.JRPrintHyperlink; import net.sf.jasperreports.engine.JRPrintImage; import net.sf.jasperreports.engine.JRPrintLine; import net.sf.jasperreports.engine.JRPrintPage; +import net.sf.jasperreports.engine.JRPrintRectangle; import net.sf.jasperreports.engine.JRPrintText; import net.sf.jasperreports.engine.JRPropertiesUtil; import net.sf.jasperreports.engine.JRRuntimeException; @@ -87,10 +89,12 @@ import net.sf.jasperreports.engine.export.zip.FileBufferedZipEntry; import net.sf.jasperreports.engine.type.HyperlinkTypeEnum; import net.sf.jasperreports.engine.type.LineDirectionEnum; +import net.sf.jasperreports.engine.type.LineStyleEnum; import net.sf.jasperreports.engine.type.ModeEnum; import net.sf.jasperreports.engine.type.ScaleImageEnum; import net.sf.jasperreports.engine.util.DefaultFormatFactory; import net.sf.jasperreports.engine.util.FileBufferedOutputStream; +import net.sf.jasperreports.engine.util.JRColorUtil; import net.sf.jasperreports.engine.util.JRDataUtils; import net.sf.jasperreports.engine.util.JRStringUtil; import net.sf.jasperreports.engine.util.JRStyledText; @@ -1325,84 +1329,165 @@ protected InternalImageProcessorResult(String imagePath, Dimension2D dimension) } } - - @Override - protected void exportLine( - JRPrintLine line, - JRExporterGridCell gridCell, + private void drawShape( + JRPrintGraphicElement shape, + JRExporterGridCell gridCell, int colIndex, int rowIndex - ) throws JRException + ) throws JRException { - JRLineBox box = new JRBaseLineBox(null); - JRPen pen = null; - LineDirectionEnum direction = null; - float ratio = line.getWidth() / line.getHeight(); - if (ratio > 1) + String shapeType = "rect"; + String flip = ""; + String radius = ""; + + if (shape instanceof JRPrintEllipse) { - if(line.getHeight() > 1) - { - direction = line.getDirectionValue(); - pen = box.getPen(); - } - else if (line.getDirectionValue() == LineDirectionEnum.TOP_DOWN) + shapeType = "ellipse"; + + } + else if (shape instanceof JRPrintLine) + { + shapeType = "line"; + if (((JRPrintLine)shape).getDirectionValue() != LineDirectionEnum.TOP_DOWN) { - pen = box.getTopPen(); + flip = " flipV=\"1\""; } - else + } + else if (shape instanceof JRPrintRectangle) + { + shapeType = (((JRPrintRectangle)shape).getRadius() == 0) ? "rect" : "roundRect"; + if (((JRPrintRectangle)shape).getRadius() > 0) { - pen = box.getBottomPen(); + // a rounded rectangle radius cannot exceed 1/2 of its lower side; + int size = Math.min(50000, (((JRPrintRectangle)shape).getRadius() * 100000)/Math.min(shape.getHeight(), shape.getWidth())); + radius = ""; } } else { - if(line.getWidth() > 1) - { - direction = line.getDirectionValue(); - pen = box.getPen(); - } - else if (line.getDirectionValue() == LineDirectionEnum.TOP_DOWN) - { - pen = box.getLeftPen(); - } - else + shapeType = "rect"; + } + Boolean tIgnoreCellBackground = sheetInfo.ignoreCellBackground; + sheetInfo.ignoreCellBackground = Boolean.TRUE; // TODO currently used to force background of shape cell to be white + cellHelper.exportHeader(gridCell, rowIndex, colIndex, maxColumnIndex, sheetInfo); + sheetHelper.exportMergedCells(rowIndex, colIndex, maxColumnIndex, gridCell.getRowSpan(), gridCell.getColSpan()); + sheetInfo.ignoreCellBackground = tIgnoreCellBackground; + + String bgColor = ""; + if (shape.getModeValue() == ModeEnum.OPAQUE && shape.getBackcolor() != null) + { + bgColor = ""; + } + JRPen pen = shape.getLinePen(); + Color penColor = pen.getLineColor(); + String penStyle = ""; + if (pen.getLineWidth() > 0) + { + switch (pen.getLineStyleValue()) { - pen = box.getRightPen(); + case DASHED : + { + penStyle = ""; + break; + } + case DOTTED : + { + penStyle = ""; + break; + } + case DOUBLE : + case SOLID : + default : + { + break; + } } } - pen.setLineColor(line.getLinePen().getLineColor()); - pen.setLineStyle(line.getLinePen().getLineStyleValue()); - pen.setLineWidth(line.getLinePen().getLineWidth()); - gridCell.setBox(box);//CAUTION: only some exporters set the cell box - - cellHelper.exportHeader(gridCell, rowIndex, colIndex, maxColumnIndex, sheetInfo, direction); - sheetHelper.exportMergedCells(rowIndex, colIndex, maxColumnIndex, gridCell.getRowSpan(), gridCell.getColSpan()); + drawingHelper.write( + "" + + "" + + "" + colIndex + "" + + "0" + + "" + rowIndex + "" + + "0" + + "" + + "" + + "" + (colIndex + gridCell.getColSpan()) + "" + + "0" + + "" + (rowIndex + gridCell.getRowSpan()) + "" + + "0" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + radius + + "" + + "" + + bgColor + + "" + + "" + + "" + + "" + + "" + + penStyle + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + ); + cellHelper.exportFooter(); } + @Override + protected void exportLine( + JRPrintLine line, + JRExporterGridCell gridCell, + int colIndex, + int rowIndex + ) throws JRException + { + drawShape(line, gridCell, colIndex, rowIndex); + } + @Override protected void exportRectangle( - JRPrintGraphicElement rectangle, + JRPrintRectangle rectangle, JRExporterGridCell gridCell, int colIndex, int rowIndex ) throws JRException { - JRLineBox box = new JRBaseLineBox(null); - JRPen pen = box.getPen(); - pen.setLineColor(rectangle.getLinePen().getLineColor()); - pen.setLineStyle(rectangle.getLinePen().getLineStyleValue()); - pen.setLineWidth(rectangle.getLinePen().getLineWidth()); - - gridCell.setBox(box);//CAUTION: only some exporters set the cell box - - cellHelper.exportHeader(gridCell, rowIndex, colIndex, maxColumnIndex, sheetInfo); - sheetHelper.exportMergedCells(rowIndex, colIndex, maxColumnIndex, gridCell.getRowSpan(), gridCell.getColSpan()); - cellHelper.exportFooter(); + drawShape(rectangle, gridCell, colIndex, rowIndex); } + @Override + protected void exportEllipse( + JRPrintEllipse ellipse, + JRExporterGridCell gridCell, + int colIndex, + int rowIndex + ) throws JRException + { + drawShape(ellipse, gridCell, colIndex, rowIndex); + } @Override public void exportText( @@ -1806,5 +1891,14 @@ protected String getDefinedName(String name) return null; } + protected String toOOXMLId(JRPrintElement element) + { + // using hashCode() for now, though in theory there is a risk of collisions + // we could use something based on getSourceElementId() and getPrintElementId() + // or even a counter since we do not have any references to Ids + int hashCode = element.hashCode(); + // OOXML object ids are xsd:unsignedInt + return Long.toString(hashCode & 0xFFFFFFFFL); + } }