From cbb10eef7e2e0f33ccc97f2c9e9eea2153ec9fc3 Mon Sep 17 00:00:00 2001 From: ozawa_h Date: Sun, 7 Apr 2019 19:25:54 +0900 Subject: [PATCH 01/11] support ellipse in xls export --- .../engine/export/JRXlsAbstractExporter.java | 4 +- .../export/JRXlsAbstractMetadataExporter.java | 9 ++++- .../engine/export/JRXlsExporter.java | 40 ++++++++++++++++++- .../engine/export/JRXlsMetadataExporter.java | 38 +++++++++++++++++- .../engine/export/oasis/JROdsExporter.java | 11 +++++ .../engine/export/ooxml/JRXlsxExporter.java | 19 +++++++++ 6 files changed, 117 insertions(+), 4 deletions(-) diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractExporter.java index cacc108605..2474c52229 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) { @@ -2406,6 +2406,8 @@ protected void configureDefinedNames(PropertySuffix propertySuffix) protected abstract void exportRectangle(JRPrintGraphicElement element, JRExporterGridCell cell, int colIndex, int rowIndex) throws JRException; + protected abstract void exportEllipse(JRPrintGraphicElement element, JRExporterGridCell cell, int colIndex, int rowIndex) throws JRException; + protected abstract void exportLine(JRPrintLine line, JRExporterGridCell cell, int colIndex, int rowIndex) throws JRException; protected abstract void exportFrame(JRPrintFrame frame, 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..d7ff7aa085 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) { @@ -551,6 +551,11 @@ protected void exportRectangle(JRPrintGraphicElement element, JRExporterGridCell { } + @Override + protected void exportEllipse(JRPrintGraphicElement element, JRExporterGridCell cell, int colIndex, int rowIndex) throws JRException + { + } + @Override protected void exportLine(JRPrintLine line, JRExporterGridCell cell, int colIndex, int rowIndex) throws JRException { @@ -619,6 +624,8 @@ protected void setRowHeight(int rowIndex, int lastRowHeight) throws JRException protected abstract void exportRectangle(JRPrintGraphicElement element) throws JRException; + protected abstract void exportEllipse(JRPrintGraphicElement element) throws JRException; + protected abstract void exportLine(JRPrintLine line) throws JRException; protected abstract void exportFrame(JRPrintFrame frame) 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..3df171aeb0 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; @@ -111,6 +113,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 +154,8 @@ public class JRXlsExporter extends JRXlsAbstractExporter hssfColorsRgbs; static @@ -831,6 +835,40 @@ protected void exportRectangle(JRPrintGraphicElement element, JRExporterGridCell cell.setCellStyle(cellStyle); } + @Override + protected void exportEllipse(JRPrintGraphicElement 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_OVAL); + JRPen pen = element.getLinePen(); + + shape.setLineWidth(EMU * Math.round(pen.getLineWidth())); + if (pen.getLineStyleValue() == LineStyleEnum.DASHED) + { + shape.setLineStyle(HSSFShape.LINESTYLE_DASHGEL); + } + else if (pen.getLineStyleValue() == LineStyleEnum.DOTTED) + { + shape.setLineStyle(HSSFShape.LINESTYLE_DOTSYS); + } + else + { + shape.setLineStyle(HSSFShape.LINESTYLE_SOLID); + } + + Color penColor = pen.getLineColor(); + shape.setLineStyleColor(penColor.getRed(), penColor.getGreen(), penColor.getBlue()); + + if (!Boolean.TRUE.equals(sheetInfo.ignoreCellBackground) && gridCell.getCellBackcolor() != null) + { + Color bgcolor = gridCell.getCellBackcolor(); + shape.setFillColor(bgcolor.getRed(), bgcolor.getGreen(), bgcolor.getBlue()); + shape.setNoFill(false); + } else { + shape.setNoFill(true); + } + } @Override public void exportText(JRPrintText textElement, JRExporterGridCell gridCell, int colIndex, int rowIndex) throws JRException diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsMetadataExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsMetadataExporter.java index 7a87ce5c71..935863c664 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsMetadataExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsMetadataExporter.java @@ -780,6 +780,42 @@ protected void exportRectangle(JRPrintGraphicElement element) throws JRException } } + @Override + protected void exportEllipse(JRPrintGraphicElement 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/JROdsExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/oasis/JROdsExporter.java index a3cabb20ec..0134cf1ce0 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/oasis/JROdsExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/oasis/JROdsExporter.java @@ -517,6 +517,17 @@ protected void exportRectangle( tableBuilder.exportRectangle(rectangle, gridCell); } + @Override + protected void exportEllipse( // TODO need to fix to display ellipse on ods export + JRPrintGraphicElement rectangle, + JRExporterGridCell gridCell, + int colIndex, + int rowIndex + ) throws JRException + { + tableBuilder.exportRectangle(rectangle, gridCell); + } + @Override protected void exportLine( JRPrintLine line, 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..3d64b36a6f 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/ooxml/JRXlsxExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/ooxml/JRXlsxExporter.java @@ -1403,6 +1403,25 @@ protected void exportRectangle( cellHelper.exportFooter(); } + @Override + protected void exportEllipse( // TODO only a copy of exportRectangle. Need to fix to show ellipse in xlsx + JRPrintGraphicElement ellipse, + JRExporterGridCell gridCell, + int colIndex, + int rowIndex + ) throws JRException + { + JRLineBox box = new JRBaseLineBox(null); + JRPen pen = box.getPen(); + pen.setLineColor(ellipse.getLinePen().getLineColor()); + pen.setLineStyle(ellipse.getLinePen().getLineStyleValue()); + pen.setLineWidth(ellipse.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(); + } @Override public void exportText( From d3ed9032b4982157b944ebecda601ede40b6a969 Mon Sep 17 00:00:00 2001 From: ozawa_h Date: Mon, 8 Apr 2019 13:22:45 +0900 Subject: [PATCH 02/11] change to use LengthUtil() to calculate EMU --- .../src/net/sf/jasperreports/engine/export/JRXlsExporter.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java index 3df171aeb0..8b294d0a58 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java @@ -154,7 +154,6 @@ public class JRXlsExporter extends JRXlsAbstractExporter hssfColorsRgbs; @@ -843,7 +842,7 @@ protected void exportEllipse(JRPrintGraphicElement element, JRExporterGridCell g shape.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL); JRPen pen = element.getLinePen(); - shape.setLineWidth(EMU * Math.round(pen.getLineWidth())); + shape.setLineWidth(LengthUtil.emu(Math.round(pen.getLineWidth()))); if (pen.getLineStyleValue() == LineStyleEnum.DASHED) { shape.setLineStyle(HSSFShape.LINESTYLE_DASHGEL); From 98f0dfa52e6eb6a0be1a7728da18dc5598c8d48e Mon Sep 17 00:00:00 2001 From: ozawa_h Date: Mon, 8 Apr 2019 18:24:09 +0900 Subject: [PATCH 03/11] fix xls export line to draw diagonal line --- .../engine/export/JRXlsExporter.java | 105 ++++++++++-------- 1 file changed, 60 insertions(+), 45 deletions(-) diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java index 8b294d0a58..fe7c0715ca 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java @@ -742,61 +742,47 @@ 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 - { - side = BoxStyle.RIGHT; - } + row1 += gridCell.getRowSpan(); } - BoxStyle boxStyle = new BoxStyle(side, line.getLinePen()); + 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(); - FillPatternType mode = backgroundMode; - short backcolor = whiteIndex; - if (!Boolean.TRUE.equals(sheetInfo.ignoreCellBackground) && gridCell.getCellBackcolor() != null) + shape.setLineWidth(LengthUtil.emu(Math.round(pen.getLineWidth()))); + if (pen.getLineStyleValue() == LineStyleEnum.DASHED) { - mode = FillPatternType.SOLID_FOREGROUND; - backcolor = getWorkbookColor(gridCell.getCellBackcolor()).getIndex(); + shape.setLineStyle(HSSFShape.LINESTYLE_DASHGEL); + } + else if (pen.getLineStyleValue() == LineStyleEnum.DOTTED) + { + shape.setLineStyle(HSSFShape.LINESTYLE_DOTSYS); + } + else + { + shape.setLineStyle(HSSFShape.LINESTYLE_SOLID); } - 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); + Color penColor = pen.getLineColor(); + shape.setLineStyleColor(penColor.getRed(), penColor.getGreen(), penColor.getBlue()); - cell = row.createCell(colIndex); - cell.setCellStyle(cellStyle); + if (!Boolean.TRUE.equals(sheetInfo.ignoreCellBackground) && gridCell.getCellBackcolor() != null) + { + Color bgcolor = gridCell.getCellBackcolor(); + shape.setFillColor(bgcolor.getRed(), bgcolor.getGreen(), bgcolor.getBlue()); + shape.setNoFill(true); + } else { + shape.setNoFill(true); + } + createMergeRegion(gridCell, colIndex, rowIndex); } @@ -867,6 +853,7 @@ else if (pen.getLineStyleValue() == LineStyleEnum.DOTTED) } else { shape.setNoFill(true); } + createMergeRegion(gridCell, colIndex, rowIndex); } @Override @@ -1183,6 +1170,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) From 35cb6908772f29918ee68fd1cf8d6bd016258020 Mon Sep 17 00:00:00 2001 From: ozawa_h Date: Wed, 10 Apr 2019 08:39:23 +0900 Subject: [PATCH 04/11] support ods shapes in ods export --- .../engine/export/JRXlsAbstractExporter.java | 2 +- .../export/JRXlsAbstractMetadataExporter.java | 4 +- .../engine/export/JRXlsExporter.java | 3 +- .../engine/export/JRXlsMetadataExporter.java | 2 +- .../engine/export/oasis/JROdsExporter.java | 42 +- .../engine/export/oasis/TableBuilder.java | 401 +++++++++++++----- .../engine/export/ooxml/JRXlsxExporter.java | 3 +- 7 files changed, 337 insertions(+), 120 deletions(-) diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractExporter.java index 2474c52229..17ee6c75c4 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractExporter.java @@ -2406,7 +2406,7 @@ protected void configureDefinedNames(PropertySuffix propertySuffix) protected abstract void exportRectangle(JRPrintGraphicElement element, JRExporterGridCell cell, int colIndex, int rowIndex) throws JRException; - protected abstract void exportEllipse(JRPrintGraphicElement 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 d7ff7aa085..b32ac10675 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractMetadataExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractMetadataExporter.java @@ -552,7 +552,7 @@ protected void exportRectangle(JRPrintGraphicElement element, JRExporterGridCell } @Override - protected void exportEllipse(JRPrintGraphicElement element, JRExporterGridCell cell, int colIndex, int rowIndex) throws JRException + protected void exportEllipse(JRPrintEllipse element, JRExporterGridCell cell, int colIndex, int rowIndex) throws JRException { } @@ -624,7 +624,7 @@ protected void setRowHeight(int rowIndex, int lastRowHeight) throws JRException protected abstract void exportRectangle(JRPrintGraphicElement element) throws JRException; - protected abstract void exportEllipse(JRPrintGraphicElement 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 fe7c0715ca..d3735b1de0 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java @@ -93,6 +93,7 @@ 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; @@ -821,7 +822,7 @@ protected void exportRectangle(JRPrintGraphicElement element, JRExporterGridCell } @Override - protected void exportEllipse(JRPrintGraphicElement element, JRExporterGridCell gridCell, int colIndex, int rowIndex) + protected void exportEllipse(JRPrintEllipse 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); diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsMetadataExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsMetadataExporter.java index 935863c664..c95439ab21 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsMetadataExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsMetadataExporter.java @@ -781,7 +781,7 @@ protected void exportRectangle(JRPrintGraphicElement element) throws JRException } @Override - protected void exportEllipse(JRPrintGraphicElement element) throws JRException { // TODO need to fix to show ellipse on xls metadata + 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) { diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/oasis/JROdsExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/oasis/JROdsExporter.java index 0134cf1ce0..1e2e08bc62 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/oasis/JROdsExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/oasis/JROdsExporter.java @@ -48,6 +48,7 @@ import net.sf.jasperreports.engine.JRGenericPrintElement; import net.sf.jasperreports.engine.JRLineBox; import net.sf.jasperreports.engine.JRPen; +import net.sf.jasperreports.engine.JRPrintEllipse; import net.sf.jasperreports.engine.JRPrintFrame; import net.sf.jasperreports.engine.JRPrintGraphicElement; import net.sf.jasperreports.engine.JRPrintHyperlink; @@ -119,6 +120,8 @@ public class JROdsExporter extends JRXlsAbstractExporter 1) // { // tempBodyWriter.write(" table:number-columns-spanned=\"" + emptyCellColSpan + "\""); -// } - tempBodyWriter.write("/>\n"); +// } **/ + tempColumnWriter.append("/>\n"); // // exportOccupiedCells(emptyCellColSpan - 1); } @@ -519,13 +527,13 @@ protected void exportRectangle( @Override protected void exportEllipse( // TODO need to fix to display ellipse on ods export - JRPrintGraphicElement rectangle, + JRPrintEllipse ellipse, JRExporterGridCell gridCell, int colIndex, int rowIndex ) throws JRException { - tableBuilder.exportRectangle(rectangle, gridCell); + tableBuilder.exportEllipse(ellipse, gridCell); } @Override @@ -757,7 +765,9 @@ protected OdsTableBuilder( DocumentBuilder documentBuilder, JasperPrint jasperPrint, int pageFormatIndex, - int pageIndex, + int pageIndex, + StringBuffer tempShapeWriter, + StringBuffer tempColumnWriter, WriterHelper bodyWriter, WriterHelper styleWriter, StyleCache styleCache, @@ -769,7 +779,9 @@ protected OdsTableBuilder( documentBuilder, jasperPrint, pageFormatIndex, - pageIndex, + pageIndex, + tempShapeWriter, + tempColumnWriter, bodyWriter, styleWriter, styleCache, @@ -782,7 +794,9 @@ protected OdsTableBuilder( DocumentBuilder documentBuilder, JasperPrint jasperPrint, int pageFormatIndex, - int pageIndex, + int pageIndex, + StringBuffer tempShapeWriter, + StringBuffer tempColumnWriter, WriterHelper bodyWriter, WriterHelper styleWriter, StyleCache styleCache, @@ -795,7 +809,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..106356f7b6 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/oasis/TableBuilder.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/oasis/TableBuilder.java @@ -72,6 +72,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 +89,8 @@ protected TableBuilder( DocumentBuilder documentBuilder, JasperPrint jasperPrint, String name, + StringBuffer shapeWriter, + StringBuffer columnWriter, WriterHelper bodyWriter, WriterHelper styleWriter, StyleCache styleCache, @@ -101,6 +105,8 @@ protected TableBuilder( isFrame = true; isPageBreak = false; + this.shapeWriter = shapeWriter; + this.columnWriter = columnWriter; this.bodyWriter = bodyWriter; this.styleWriter = styleWriter; this.styleCache = styleCache; @@ -111,6 +117,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 +153,8 @@ protected TableBuilder( JasperPrint jasperPrint, int pageFormatIndex, int pageIndex, + StringBuffer shapeWriter, + StringBuffer columnWriter, WriterHelper bodyWriter, WriterHelper styleWriter, StyleCache styleCache, @@ -147,6 +170,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 +182,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 +242,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 +262,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,39 +302,72 @@ 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"); + } } @@ -287,14 +376,26 @@ public void buildCellFooter() */ public void exportRectangle(JRPrintGraphicElement 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); + shapeWriter.append( + "" + + "" + ); + } 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(); } @@ -347,17 +448,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 +482,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 +609,23 @@ protected void exportStyledTextRun( */ protected void startTextSpan(Map attributes, String text, Locale locale, boolean isIgnoreTextFormatting) { - bodyWriter.write(""); + } else { + bodyWriter.write(""); } - bodyWriter.write(">"); } @@ -497,7 +634,11 @@ protected void startTextSpan(Map */ protected void endTextSpan() { - bodyWriter.write(""); + if (columnWriter != null) { + columnWriter.append(""); + } else { + bodyWriter.write(""); + } } @@ -508,7 +649,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 +663,15 @@ protected void writeText(String text) */ protected void exportAnchor(String anchorName) { - bodyWriter.write(""); + if (columnWriter != null) { + columnWriter.append(""); + } else { + bodyWriter.write(""); + } } @@ -575,40 +726,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 +805,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 +862,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 3d64b36a6f..8faae20d8f 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/ooxml/JRXlsxExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/ooxml/JRXlsxExporter.java @@ -51,6 +51,7 @@ 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; @@ -1405,7 +1406,7 @@ protected void exportRectangle( @Override protected void exportEllipse( // TODO only a copy of exportRectangle. Need to fix to show ellipse in xlsx - JRPrintGraphicElement ellipse, + JRPrintEllipse ellipse, JRExporterGridCell gridCell, int colIndex, int rowIndex From 5ac2bb699247636d85bcd07ac264f9590dbbd09e Mon Sep 17 00:00:00 2001 From: ozawa_h Date: Wed, 10 Apr 2019 11:19:05 +0900 Subject: [PATCH 05/11] change rectangle to draw using shape in xls export --- .../engine/export/JRXlsExporter.java | 50 ++++++++++--------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java index d3735b1de0..5c6c64e112 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java @@ -790,35 +790,37 @@ else if (pen.getLineStyleValue() == LineStyleEnum.DOTTED) @Override protected void exportRectangle(JRPrintGraphicElement 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_RECTANGLE ); + JRPen pen = element.getLinePen(); - FillPatternType mode = backgroundMode; - short backcolor = whiteIndex; - if (!Boolean.TRUE.equals(sheetInfo.ignoreCellBackground) && gridCell.getCellBackcolor() != null) + shape.setLineWidth(LengthUtil.emu(Math.round(pen.getLineWidth()))); + if (pen.getLineStyleValue() == LineStyleEnum.DASHED) { - mode = FillPatternType.SOLID_FOREGROUND; - backcolor = getWorkbookColor(gridCell.getCellBackcolor()).getIndex(); + shape.setLineStyle(HSSFShape.LINESTYLE_DASHGEL); + } + else if (pen.getLineStyleValue() == LineStyleEnum.DOTTED) + { + shape.setLineStyle(HSSFShape.LINESTYLE_DOTSYS); + } + else + { + shape.setLineStyle(HSSFShape.LINESTYLE_SOLID); } - 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 (!Boolean.TRUE.equals(sheetInfo.ignoreCellBackground) && gridCell.getCellBackcolor() != null) + { + Color bgcolor = gridCell.getCellBackcolor(); + shape.setFillColor(bgcolor.getRed(), bgcolor.getGreen(), bgcolor.getBlue()); + shape.setNoFill(false); + } else { + shape.setNoFill(true); + } + createMergeRegion(gridCell, colIndex, rowIndex); } @Override From 41b105b2687c59e2ee6f196eca4f571d3ad7c1c5 Mon Sep 17 00:00:00 2001 From: ozawa_h Date: Wed, 10 Apr 2019 18:53:35 +0900 Subject: [PATCH 06/11] support shapes in xlsx --- .../engine/export/ooxml/JRXlsxExporter.java | 166 +++++++++++------- 1 file changed, 102 insertions(+), 64 deletions(-) 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 8faae20d8f..9ec5898c66 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/ooxml/JRXlsxExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/ooxml/JRXlsxExporter.java @@ -88,6 +88,7 @@ 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; @@ -1326,62 +1327,118 @@ 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 = ""; + + if (shape instanceof JRPrintEllipse) { - if(line.getHeight() > 1) - { - direction = line.getDirectionValue(); - pen = box.getPen(); - } - else if (line.getDirectionValue() == LineDirectionEnum.TOP_DOWN) - { - pen = box.getTopPen(); - } - else + shapeType = "ellipse"; + + } + else if (shape instanceof JRPrintLine) + { + shapeType = "line"; + if (((JRPrintLine)shape).getDirectionValue() != LineDirectionEnum.TOP_DOWN) { - pen = box.getBottomPen(); + flip = " flipV=\"1\""; } } else { - if(line.getWidth() > 1) - { - direction = line.getDirectionValue(); - pen = box.getPen(); - } - else if (line.getDirectionValue() == LineDirectionEnum.TOP_DOWN) - { - pen = box.getLeftPen(); - } - else - { - pen = box.getRightPen(); - } + shapeType = "rect"; } - 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); + 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 (!Boolean.TRUE.equals(sheetInfo.ignoreCellBackground) && gridCell.getCellBackcolor() != null) + { + bgColor = ""; + } + JRPen pen = shape.getLinePen(); + Color penColor = pen.getLineColor(); + String penStyle = ""; + if (pen.getLineStyleValue() == LineStyleEnum.DASHED) + { + penStyle = ""; + } + else if (pen.getLineStyleValue() == LineStyleEnum.DOTTED) + { + penStyle = ""; + } + + drawingHelper.write( + "" + + "" + + "" + colIndex + "" + + "0" + + "" + rowIndex + "" + + "0" + + "" + + "" + + "" + (colIndex + gridCell.getColSpan()) + "" + + "0" + + "" + (rowIndex + gridCell.getRowSpan()) + "" + + "0" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + 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( @@ -1391,37 +1448,18 @@ protected void exportRectangle( 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( // TODO only a copy of exportRectangle. Need to fix to show ellipse in xlsx + protected void exportEllipse( JRPrintEllipse ellipse, JRExporterGridCell gridCell, int colIndex, int rowIndex ) throws JRException { - JRLineBox box = new JRBaseLineBox(null); - JRPen pen = box.getPen(); - pen.setLineColor(ellipse.getLinePen().getLineColor()); - pen.setLineStyle(ellipse.getLinePen().getLineStyleValue()); - pen.setLineWidth(ellipse.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(ellipse, gridCell, colIndex, rowIndex); } @Override From 45bea0bb58ded12c50a55a7fa6b424ad9c9fc253 Mon Sep 17 00:00:00 2001 From: ozawa_h Date: Thu, 11 Apr 2019 13:06:31 +0900 Subject: [PATCH 07/11] change to use JRColorUtil and linestyle block --- .../engine/export/JRXlsExporter.java | 126 +++++++++++------- .../engine/export/ooxml/JRXlsxExporter.java | 35 +++-- 2 files changed, 106 insertions(+), 55 deletions(-) diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java index 5c6c64e112..8373b0c8c5 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java @@ -758,29 +758,41 @@ protected void exportLine(JRPrintLine line, JRExporterGridCell gridCell, int col shape.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE ); JRPen pen = line.getLinePen(); - shape.setLineWidth(LengthUtil.emu(Math.round(pen.getLineWidth()))); - if (pen.getLineStyleValue() == LineStyleEnum.DASHED) + if (pen.getLineWidth() > 0) { - shape.setLineStyle(HSSFShape.LINESTYLE_DASHGEL); - } - else if (pen.getLineStyleValue() == LineStyleEnum.DOTTED) - { - shape.setLineStyle(HSSFShape.LINESTYLE_DOTSYS); - } - else - { - shape.setLineStyle(HSSFShape.LINESTYLE_SOLID); + 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 (!Boolean.TRUE.equals(sheetInfo.ignoreCellBackground) && gridCell.getCellBackcolor() != null) + if (line.getModeValue() == ModeEnum.OPAQUE && line.getBackcolor() != null) { - Color bgcolor = gridCell.getCellBackcolor(); - shape.setFillColor(bgcolor.getRed(), bgcolor.getGreen(), bgcolor.getBlue()); + shape.setFillColor(line.getBackcolor().getRGB()); shape.setNoFill(true); - } else { + } + else + { shape.setNoFill(true); } createMergeRegion(gridCell, colIndex, rowIndex); @@ -795,29 +807,41 @@ protected void exportRectangle(JRPrintGraphicElement element, JRExporterGridCell shape.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE ); JRPen pen = element.getLinePen(); - shape.setLineWidth(LengthUtil.emu(Math.round(pen.getLineWidth()))); - if (pen.getLineStyleValue() == LineStyleEnum.DASHED) - { - shape.setLineStyle(HSSFShape.LINESTYLE_DASHGEL); - } - else if (pen.getLineStyleValue() == LineStyleEnum.DOTTED) + if (pen.getLineWidth() > 0) { - shape.setLineStyle(HSSFShape.LINESTYLE_DOTSYS); - } - else - { - shape.setLineStyle(HSSFShape.LINESTYLE_SOLID); + 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 (!Boolean.TRUE.equals(sheetInfo.ignoreCellBackground) && gridCell.getCellBackcolor() != null) + if (element.getModeValue() == ModeEnum.OPAQUE && element.getBackcolor() != null) { - Color bgcolor = gridCell.getCellBackcolor(); - shape.setFillColor(bgcolor.getRed(), bgcolor.getGreen(), bgcolor.getBlue()); + shape.setFillColor(element.getBackcolor().getRGB()); shape.setNoFill(false); - } else { + } + else + { shape.setNoFill(true); } createMergeRegion(gridCell, colIndex, rowIndex); @@ -831,29 +855,41 @@ protected void exportEllipse(JRPrintEllipse element, JRExporterGridCell gridCell shape.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL); JRPen pen = element.getLinePen(); - shape.setLineWidth(LengthUtil.emu(Math.round(pen.getLineWidth()))); - if (pen.getLineStyleValue() == LineStyleEnum.DASHED) - { - shape.setLineStyle(HSSFShape.LINESTYLE_DASHGEL); - } - else if (pen.getLineStyleValue() == LineStyleEnum.DOTTED) + if (pen.getLineWidth() > 0) { - shape.setLineStyle(HSSFShape.LINESTYLE_DOTSYS); - } - else - { - shape.setLineStyle(HSSFShape.LINESTYLE_SOLID); + 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 (!Boolean.TRUE.equals(sheetInfo.ignoreCellBackground) && gridCell.getCellBackcolor() != null) + if (element.getModeValue() == ModeEnum.OPAQUE && element.getBackcolor() != null) { - Color bgcolor = gridCell.getCellBackcolor(); - shape.setFillColor(bgcolor.getRed(), bgcolor.getGreen(), bgcolor.getBlue()); + shape.setFillColor(element.getBackcolor().getRGB()); shape.setNoFill(false); - } else { + } + else + { shape.setNoFill(true); } createMergeRegion(gridCell, colIndex, rowIndex); 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 9ec5898c66..459938820c 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/ooxml/JRXlsxExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/ooxml/JRXlsxExporter.java @@ -93,6 +93,7 @@ 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; @@ -1361,20 +1362,34 @@ else if (shape instanceof JRPrintLine) sheetInfo.ignoreCellBackground = tIgnoreCellBackground; String bgColor = ""; - if (!Boolean.TRUE.equals(sheetInfo.ignoreCellBackground) && gridCell.getCellBackcolor() != null) + if (shape.getModeValue() == ModeEnum.OPAQUE && shape.getBackcolor() != null) { - bgColor = ""; + bgColor = ""; } JRPen pen = shape.getLinePen(); Color penColor = pen.getLineColor(); String penStyle = ""; - if (pen.getLineStyleValue() == LineStyleEnum.DASHED) + if (pen.getLineWidth() > 0) { - penStyle = ""; - } - else if (pen.getLineStyleValue() == LineStyleEnum.DOTTED) - { - penStyle = ""; + switch (pen.getLineStyleValue()) + { + case DASHED : + { + penStyle = ""; + break; + } + case DOTTED : + { + penStyle = ""; + break; + } + case DOUBLE : + case SOLID : + default : + { + break; + } + } } drawingHelper.write( @@ -1407,9 +1422,9 @@ else if (pen.getLineStyleValue() == LineStyleEnum.DOTTED) + "" + bgColor + "" - + "" + + "" + "" - + "" + + "" + "" + penStyle + "" From f515662fce356f6bf2522a2343d4062537915cff Mon Sep 17 00:00:00 2001 From: ozawa_h Date: Thu, 11 Apr 2019 14:25:54 +0900 Subject: [PATCH 08/11] support rounded corner rectangle in xlsx export --- .../engine/export/JRXlsAbstractExporter.java | 2 +- .../export/JRXlsAbstractMetadataExporter.java | 4 +-- .../engine/export/JRXlsExporter.java | 3 ++- .../engine/export/JRXlsMetadataExporter.java | 2 +- .../engine/export/oasis/JROdsExporter.java | 3 ++- .../engine/export/ooxml/JRXlsxExporter.java | 27 ++++++++++++++++--- 6 files changed, 32 insertions(+), 9 deletions(-) diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractExporter.java index 17ee6c75c4..a12857f280 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractExporter.java @@ -2404,7 +2404,7 @@ 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; diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractMetadataExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractMetadataExporter.java index b32ac10675..7fa7d8e8d7 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractMetadataExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsAbstractMetadataExporter.java @@ -547,7 +547,7 @@ 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 { } @@ -622,7 +622,7 @@ 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; diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java index 8373b0c8c5..21ae500d28 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java @@ -99,6 +99,7 @@ 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; @@ -800,7 +801,7 @@ protected void exportLine(JRPrintLine line, JRExporterGridCell gridCell, int col @Override - protected void exportRectangle(JRPrintGraphicElement element, JRExporterGridCell gridCell, int colIndex, int rowIndex) + 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); diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsMetadataExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsMetadataExporter.java index c95439ab21..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) { diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/oasis/JROdsExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/oasis/JROdsExporter.java index 1e2e08bc62..a6e26a065a 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/oasis/JROdsExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/oasis/JROdsExporter.java @@ -55,6 +55,7 @@ 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.JasperPrint; @@ -516,7 +517,7 @@ protected String getCellAddress(int row, int col) @Override protected void exportRectangle( - JRPrintGraphicElement rectangle, + JRPrintRectangle rectangle, JRExporterGridCell gridCell, int colIndex, int rowIndex 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 459938820c..ce921b8b4e 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/ooxml/JRXlsxExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/ooxml/JRXlsxExporter.java @@ -58,6 +58,7 @@ 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; @@ -1337,6 +1338,7 @@ private void drawShape( { String shapeType = "rect"; String flip = ""; + String radius = ""; if (shape instanceof JRPrintEllipse) { @@ -1351,6 +1353,16 @@ else if (shape instanceof JRPrintLine) flip = " flipV=\"1\""; } } + else if (shape instanceof JRPrintRectangle) + { + shapeType = (((JRPrintRectangle)shape).getRadius() == 0) ? "rect" : "roundRect"; + if (((JRPrintRectangle)shape).getRadius() > 0) + { + // 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 { shapeType = "rect"; @@ -1408,7 +1420,7 @@ else if (shape instanceof JRPrintLine) + "" + "" + "" - + "" + + "" + "" + "" + "" @@ -1417,7 +1429,7 @@ else if (shape instanceof JRPrintLine) + "" + "" + "" - + "" + + radius + "" + "" + bgColor @@ -1457,7 +1469,7 @@ protected void exportLine( @Override protected void exportRectangle( - JRPrintGraphicElement rectangle, + JRPrintRectangle rectangle, JRExporterGridCell gridCell, int colIndex, int rowIndex @@ -1879,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); + } } From 2be10ce4853c8a8ab11304c2871da8b0c4358308 Mon Sep 17 00:00:00 2001 From: ozawa_h Date: Fri, 12 Apr 2019 14:19:08 +0900 Subject: [PATCH 09/11] fix xls background color --- .../sf/jasperreports/engine/export/JRXlsExporter.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java index 21ae500d28..e4b1801aba 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/JRXlsExporter.java @@ -789,7 +789,8 @@ protected void exportLine(JRPrintLine line, JRExporterGridCell gridCell, int col if (line.getModeValue() == ModeEnum.OPAQUE && line.getBackcolor() != null) { - shape.setFillColor(line.getBackcolor().getRGB()); + Color bgcolor = line.getBackcolor(); + shape.setFillColor(bgcolor.getRed(), bgcolor.getGreen(), bgcolor.getBlue()); shape.setNoFill(true); } else @@ -838,7 +839,8 @@ protected void exportRectangle(JRPrintRectangle element, JRExporterGridCell grid if (element.getModeValue() == ModeEnum.OPAQUE && element.getBackcolor() != null) { - shape.setFillColor(element.getBackcolor().getRGB()); + Color bgcolor = element.getBackcolor(); + shape.setFillColor(bgcolor.getRed(), bgcolor.getGreen(), bgcolor.getBlue()); shape.setNoFill(false); } else @@ -886,7 +888,8 @@ protected void exportEllipse(JRPrintEllipse element, JRExporterGridCell gridCell if (element.getModeValue() == ModeEnum.OPAQUE && element.getBackcolor() != null) { - shape.setFillColor(element.getBackcolor().getRGB()); + Color bgcolor = element.getBackcolor(); + shape.setFillColor(bgcolor.getRed(), bgcolor.getGreen(), bgcolor.getBlue()); shape.setNoFill(false); } else From 201b8a5798dc1b1d42dd7b495e45ce736aea2cf7 Mon Sep 17 00:00:00 2001 From: ozawa_h Date: Fri, 12 Apr 2019 20:25:55 +0900 Subject: [PATCH 10/11] support round rectangle in ods and fix background color --- .../engine/export/oasis/GraphicStyle.java | 9 +++- .../engine/export/oasis/TableBuilder.java | 42 ++++++++++++++----- 2 files changed, 40 insertions(+), 11 deletions(-) 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(" " - + "" - ); + 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(); From f631581ceeade5c9b20e020e3d04a8b9cedabb1e Mon Sep 17 00:00:00 2001 From: ozawa_h Date: Sun, 14 Apr 2019 16:30:20 +0900 Subject: [PATCH 11/11] support line as shape in ods --- .../engine/export/oasis/JROdsExporter.java | 65 +------------- .../engine/export/oasis/TableBuilder.java | 85 ++++++++++++------- 2 files changed, 56 insertions(+), 94 deletions(-) diff --git a/jasperreports/src/net/sf/jasperreports/engine/export/oasis/JROdsExporter.java b/jasperreports/src/net/sf/jasperreports/engine/export/oasis/JROdsExporter.java index a6e26a065a..521af658ae 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/oasis/JROdsExporter.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/oasis/JROdsExporter.java @@ -545,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 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 01866e266f..f29e21f7a3 100644 --- a/jasperreports/src/net/sf/jasperreports/engine/export/oasis/TableBuilder.java +++ b/jasperreports/src/net/sf/jasperreports/engine/export/oasis/TableBuilder.java @@ -428,39 +428,64 @@ public void exportRectangle(JRPrintRectangle rectangle, JRExporterGridCell gridC */ 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(); }