2002 JI Open Discussion Posted August 18, 2006 Share Posted August 18, 2006 By: David W. Streever - dstreev Reports against JavaObjects/XML 2003-09-16 14:32 Is it possible to use JavaObject and/or XML as the datasource for filling JasperReports? By: Daryl Jackson - dkjjr Subreports - possible bug? 2003-06-13 09:22 I have a quick sample, below, that dynamically produces .jasper files much the same as our application. When run, the sample will product two PDFs. The first shows that there is enough space on a page for two subreports (C1 & C2). The second shows the problems I am having. I am trying to specify that subreport C1 should begin on a new page, but this does not appear to be happening. Also, the subreports are being re-orded from how I am placing them. I am using JasperReports-0.4.6 and I am trying to get a report that looks like: Master detail Subreport A Subreport B -- page break Subreport C1 Subreport C2 -- page break Subreport C1 Subreport C2 -- page break Subreport C1 -- page break Subreport C1 Subreport C2 -- page break Subreport D Am I doing something wrong? Column.java: public class Column { private int dataPosition, labelPosition; public Column(int labelPosition, int dataPosition) { this.dataPosition = dataPosition; this.labelPosition = labelPosition; return; } /* Getters & setters: */ public int getDataPosition() { return(dataPosition); } public int getLabelPosition() { return(labelPosition); } } Report.java: public class Report { private dori.jasper.engine.design.JRDesignReportFont boldFont, italicFont, normalFont; private dori.jasper.engine.design.JasperDesign jasperDesign; private int pageColumnWidth, rowHeight, rowSpacing; public Report(int marginTop, int marginBottom, int pageColumnWidth, int rowHeight, int rowSpacing) throws dori.jasper.engine.JRException { this.pageColumnWidth = pageColumnWidth; this.rowHeight = rowHeight; this.rowSpacing = rowSpacing; // Create common fonts: normalFont = new dori.jasper.engine.design.JRDesignReportFont(); normalFont.setName("Arial_Normal"); normalFont.setDefault(true); normalFont.setFontName("Arial"); normalFont.setSize(10); normalFont.setPdfFontName("Helvetica"); normalFont.setPdfEncoding("Cp1252"); normalFont.setPdfEmbedded(false); boldFont = new dori.jasper.engine.design.JRDesignReportFont(); boldFont.setName("Arial_Bold"); boldFont.setDefault(false); boldFont.setFontName("Arial"); boldFont.setSize(10); boldFont.setBold(true); boldFont.setPdfFontName("Helvetica-Bold"); boldFont.setPdfEncoding("Cp1252"); boldFont.setPdfEmbedded(false); italicFont = new dori.jasper.engine.design.JRDesignReportFont(); italicFont.setName("Arial_Italic"); italicFont.setDefault(false); italicFont.setFontName("Arial"); italicFont.setSize(10); italicFont.setItalic(true); italicFont.setPdfFontName("Helvetica-Oblique"); italicFont.setPdfEncoding("Cp1252"); italicFont.setPdfEmbedded(false); // Initialize the report design: jasperDesign = new dori.jasper.engine.design.JasperDesign(); jasperDesign.setName("tmp"); jasperDesign.setOrientation(dori.jasper.engine.JRReport.ORIENTATION_LANDSCAPE); jasperDesign.setPageWidth(842); jasperDesign.setPageHeight(595); jasperDesign.setColumnSpacing(0); jasperDesign.setLeftMargin((842 - pageColumnWidth) / 2); jasperDesign.setRightMargin((842 - pageColumnWidth) / 2); jasperDesign.setTopMargin(marginTop); jasperDesign.setBottomMargin(marginBottom); jasperDesign.setColumnWidth(pageColumnWidth); jasperDesign.addFont(normalFont); jasperDesign.addFont(boldFont); jasperDesign.addFont(italicFont); return; } public void addDetailBand(dori.jasper.engine.design.JRDesignBand band, boolean forceNewPage) throws dori.jasper.engine.JRException { if (forceNewPage) { dori.jasper.engine.design.JRDesignGroup group = new dori.jasper.engine.design.JRDesignGroup(); group.setName("dummy"); group.setStartNewPage(true); group.setGroupHeader(band); jasperDesign.addGroup(group); jasperDesign.setTitleNewPage(true); } else jasperDesign.setDetail(band); return; } public void addDetailColumns(dori.jasper.engine.design.JRDesignBand band, java.util.List columns, int dataFields) { dori.jasper.engine.design.JRDesignRectangle rectangle; dori.jasper.engine.design.JRDesignStaticText staticText; Column column; int col = 1, extraFields, fieldCount = 1, fieldsPerColumn, row = band.getHeight() + 1, startRow = row; /* How many fields per column will we print - take into account the fact that there may not be the same number of fields for each column (extraFields): */ extraFields = (dataFields % columns.size()); fieldsPerColumn = (dataFields / columns.size()); /* Working from top of the page towards the bottom, from left column to right, display all fields: */ column = (Column) columns.get(0); for (int x = 0; x < dataFields; x++) { // Field label: staticText = new dori.jasper.engine.design.JRDesignStaticText(); staticText.setX(column.getLabelPosition()); staticText.setY(row); staticText.setWidth(40); staticText.setHeight(rowHeight); staticText.setTextAlignment(dori.jasper.engine.JRTextElement.TEXT_ALIGN_LEFT); staticText.setFont(boldFont); staticText.setText("Label"); band.addElement(staticText); // Field data rectangle: rectangle = new dori.jasper.engine.design.JRDesignRectangle(); rectangle.setX(column.getDataPosition() - 1); rectangle.setY(row); rectangle.setWidth(82); rectangle.setHeight(rowHeight); rectangle.setBackcolor(new java.awt.Color(0xEA, 0xEC, 0xEF)); rectangle.setPen(dori.jasper.engine.JRGraphicElement.PEN_NONE); rectangle.setStretchType(dori.jasper.engine.JRGraphicElement.STRETCH_TYPE_NO_STRETCH); band.addElement(rectangle); // Field data: staticText = new dori.jasper.engine.design.JRDesignStaticText(); staticText.setX(column.getDataPosition()); staticText.setY(row); staticText.setWidth(80); staticText.setHeight(rowHeight); staticText.setTextAlignment(dori.jasper.engine.JRTextElement.TEXT_ALIGN_LEFT); staticText.setFont(normalFont); staticText.setText("Data item " + (x + 1)); band.addElement(staticText); if (++fieldCount > (fieldsPerColumn + ((extraFields > 0) ? 1 : 0))) { --extraFields; if (col < columns.size()) column = (Column) columns.get(col); ++col; row = startRow; fieldCount = 1; } else row += rowHeight + rowSpacing; } // Position end row below the longest column: row = (rowHeight + rowSpacing) * (fieldsPerColumn + (((dataFields % columns.size()) > 0) ? 1 : 0)) + startRow + 5; band.setHeight(row); return; } public void addDetailTable(dori.jasper.engine.design.JRDesignBand band, java.util.List fields, int dataRows) { dori.jasper.engine.design.JRDesignStaticText staticText; dori.jasper.engine.design.JRDesignRectangle rectangle; int row = band.getHeight() + 1, width; // Header rectangle: width = 2; for (int x = 0; x < fields.size(); x++) width += ((TableField) fields.get(x)).getWidth(); rectangle = new dori.jasper.engine.design.JRDesignRectangle(); rectangle.setX(((TableField) fields.get(0)).getStartColumn() - 1); rectangle.setY(row); rectangle.setWidth(width); rectangle.setHeight(rowHeight); rectangle.setBackcolor(new java.awt.Color(0x33, 0x33, 0x33)); rectangle.setPen(dori.jasper.engine.JRGraphicElement.PEN_NONE); rectangle.setStretchType(dori.jasper.engine.JRGraphicElement.STRETCH_TYPE_NO_STRETCH); band.addElement(rectangle); // Print the table column headers: for (int x = 0; x < fields.size(); x++) { TableField field = (TableField) fields.get(x); staticText = new dori.jasper.engine.design.JRDesignStaticText(); staticText.setX(field.getStartColumn()); staticText.setY(row); staticText.setWidth(field.getWidth()); staticText.setHeight(rowHeight); staticText.setTextAlignment(dori.jasper.engine.JRTextElement.TEXT_ALIGN_LEFT); staticText.setForecolor(new java.awt.Color(0xFF, 0xFF, 0xFF)); staticText.setFont(boldFont); staticText.setText(field.getName()); band.addElement(staticText); } row += rowHeight + rowSpacing; // Print the data rows: for (int x = 0; x < dataRows; x++) { if (((x + 1) % 2) == 0) { rectangle = new dori.jasper.engine.design.JRDesignRectangle(); rectangle.setX(((TableField) fields.get(0)).getStartColumn() - 1); rectangle.setY(row); rectangle.setWidth(width); rectangle.setHeight(rowHeight); rectangle.setBackcolor(new java.awt.Color(0xEA, 0xEC, 0xEF)); rectangle.setPen(dori.jasper.engine.JRGraphicElement.PEN_NONE); rectangle.setStretchType(dori.jasper.engine.JRGraphicElement.STRETCH_TYPE_NO_STRETCH); band.addElement(rectangle); } for (int y = 0; y < fields.size(); y++) { TableField field = (TableField) fields.get(y); staticText = new dori.jasper.engine.design.JRDesignStaticText(); staticText.setX(field.getStartColumn()); staticText.setY(row); staticText.setWidth(field.getWidth()); staticText.setHeight(rowHeight); staticText.setTextAlignment(dori.jasper.engine.JRTextElement.TEXT_ALIGN_LEFT); staticText.setFont(normalFont); staticText.setText(field.getData()); band.addElement(staticText); } row += rowHeight + rowSpacing; } band.setHeight(row + 3); return; } public void addPageFooter() { dori.jasper.engine.design.JRDesignBand band = new dori.jasper.engine.design.JRDesignBand(); dori.jasper.engine.design.JRDesignExpression expression; dori.jasper.engine.design.JRDesignLine line; dori.jasper.engine.design.JRDesignTextField textField; band.setHeight(14); line = new dori.jasper.engine.design.JRDesignLine(); line.setX(0); line.setY(0); line.setWidth(pageColumnWidth); line.setHeight(0); band.addElement(line); textField = new dori.jasper.engine.design.JRDesignTextField(); textField.setX(0); textField.setY(1); textField.setWidth(80); textField.setHeight(12); textField.setTextAlignment(dori.jasper.engine.JRTextElement.TEXT_ALIGN_RIGHT); textField.setFont(normalFont); expression = new dori.jasper.engine.design.JRDesignExpression(); expression.setValueClass(java.lang.String.class); expression.setText(""Page " + String.valueOf($V{PAGE_NUMBER}) + " of""); textField.setExpression(expression); band.addElement(textField); textField = new dori.jasper.engine.design.JRDesignTextField(); textField.setX(80); textField.setY(1); textField.setWidth(75); textField.setHeight(12); textField.setTextAlignment(dori.jasper.engine.JRTextElement.TEXT_ALIGN_LEFT); textField.setFont(normalFont); textField.setEvaluationTime(dori.jasper.engine.JRExpression.EVALUATION_TIME_REPORT); expression = new dori.jasper.engine.design.JRDesignExpression(); expression.setValueClass(java.lang.String.class); expression.setText("" " + String.valueOf($V{PAGE_NUMBER})"); textField.setExpression(expression); band.addElement(textField); jasperDesign.setPageFooter(band); return; } public void addSubreport(dori.jasper.engine.design.JRDesignBand band, java.io.File subreportFile) { dori.jasper.engine.design.JRDesignExpression expression; dori.jasper.engine.design.JRDesignSubreport subreport = new dori.jasper.engine.design.JRDesignSubreport(); subreport.setX(0); subreport.setY(band.getHeight()); subreport.setWidth(pageColumnWidth); subreport.setHeight(1); subreport.setPositionType(dori.jasper.engine.JRElement.POSITION_TYPE_FLOAT); subreport.setRemoveLineWhenBlank(true); expression = new dori.jasper.engine.design.JRDesignExpression(); expression.setValueClass(java.lang.String.class); expression.setText(""" + subreportFile.getName() + """); subreport.setExpression(expression); expression = new dori.jasper.engine.design.JRDesignExpression(); expression.setValueClass(dori.jasper.engine.JRDataSource.class); expression.setText("new dori.jasper.engine.JREmptyDataSource()"); subreport.setDataSourceExpression(expression); band.addElement(subreport); band.setHeight(band.getHeight() + 1); return; } public void addSubreportTitle(dori.jasper.engine.design.JRDesignBand band, java.lang.String subreportTitle) { dori.jasper.engine.design.JRDesignReportFont tmp = new dori.jasper.engine.design.JRDesignReportFont(); dori.jasper.engine.design.JRDesignStaticText staticText = new dori.jasper.engine.design.JRDesignStaticText(); staticText.setX(0); staticText.setY(0); staticText.setWidth(pageColumnWidth); staticText.setHeight(15); staticText.setTextAlignment(dori.jasper.engine.JRTextElement.TEXT_ALIGN_LEFT); tmp.setName("Arial_Bold"); tmp.setDefault(false); tmp.setFontName("Arial"); tmp.setSize(14); tmp.setBold(true); tmp.setItalic(true); tmp.setUnderline(true); tmp.setPdfFontName("Helvetica-Bold"); tmp.setPdfEncoding("Cp1252"); tmp.setPdfEmbedded(false); staticText.setFont(tmp); staticText.setText(subreportTitle); band.addElement(staticText); band.setHeight(24); return; } public void addTitle(java.lang.String title) throws dori.jasper.engine.JRException { dori.jasper.engine.design.JRDesignBand band = new dori.jasper.engine.design.JRDesignBand(); dori.jasper.engine.design.JRDesignExpression expression; dori.jasper.engine.design.JRDesignImage image; dori.jasper.engine.design.JRDesignReportFont tmp; dori.jasper.engine.design.JRDesignStaticText staticText; band.setHeight(45); // Add the report title: staticText = new dori.jasper.engine.design.JRDesignStaticText(); staticText.setX(0); staticText.setY(0); staticText.setWidth(pageColumnWidth); staticText.setHeight(25); staticText.setTextAlignment(dori.jasper.engine.JRTextElement.TEXT_ALIGN_CENTER); tmp = new dori.jasper.engine.design.JRDesignReportFont(); tmp.setName("Arial_Bold"); tmp.setDefault(false); tmp.setFontName("Arial"); tmp.setSize(22); tmp.setBold(true); tmp.setPdfFontName("Helvetica-Bold"); tmp.setPdfEncoding("Cp1252"); tmp.setPdfEmbedded(false); staticText.setFont(tmp); staticText.setText(title); band.addElement(staticText); jasperDesign.setTitle(band); return; } public void compileToFile(java.lang.String fileName) throws dori.jasper.engine.JRException { dori.jasper.engine.JasperCompileManager.compileReportToFile(jasperDesign, fileName); return; } } Sample.java: public class Sample { public static void main(java.lang.String args[]) { sample1(); sample2(); return; } private static void sample1() { dori.jasper.engine.design.JRDesignBand band; java.io.File master = new java.io.File("sample1.jasper"), pdf = new java.io.File("sample1.pdf"); java.util.List subreports = new java.util.ArrayList(0); Report report; try { // Create some subreports: subreports.add(subreportC1(1, false)); subreports.add(subreportC2(1)); band = new dori.jasper.engine.design.JRDesignBand(); // Create the master design: report = new Report(10, 10, 822, 15, 4); report.addTitle("Report C1"); for (int x = 0; x < subreports.size(); x++) report.addSubreport(band, (java.io.File) subreports.get(x)); report.addDetailBand(band, false); report.addPageFooter(); report.compileToFile(master.getName()); // Create a PDF: dori.jasper.engine.JasperRunManager.runReportToPdfFile(master.getName(), pdf.getName(), null, new dori.jasper.engine.JREmptyDataSource()); // Launch Acrobat - .pdf must be a registered type: if (pdf.exists()) java.lang.Runtime.getRuntime().exec("cmd.exe /c start " + pdf.getName()); } catch (java.lang.Exception ex) { ex.printStackTrace(); } finally { master.delete(); // Remove all of the .jasper files: for (int x = 0; x < subreports.size(); x++) ((java.io.File) subreports.get(x)).delete(); } return; } private static void sample2() { dori.jasper.engine.design.JRDesignBand band; java.io.File master = new java.io.File("sample2.jasper"), pdf = new java.io.File("sample2.pdf"); java.util.List columns = new java.util.ArrayList(0), subreports = new java.util.ArrayList(0); Report report; try { // Create some subreports: subreports.add(subreportA()); subreports.add(subreportB()); subreports.add(subreportC1(1, true)); subreports.add(subreportC2(1)); subreports.add(subreportC1(2, true)); subreports.add(subreportC2(2)); subreports.add(subreportC1(3, true)); subreports.add(subreportC1(4, true)); subreports.add(subreportC2(4)); subreports.add(subreportD()); columns.add(new Column(50, 125)); columns.add(new Column(225, 300)); columns.add(new Column(400, 475)); columns.add(new Column(575, 650)); band = new dori.jasper.engine.design.JRDesignBand(); // Create the master design: report = new Report(10, 10, 822, 15, 4); report.addTitle("Sample Report"); report.addDetailColumns(band, columns, 32); for (int x = 0; x < subreports.size(); x++) report.addSubreport(band, (java.io.File) subreports.get(x)); report.addDetailBand(band, false); report.addPageFooter(); report.compileToFile(master.getName()); // Create a PDF: dori.jasper.engine.JasperRunManager.runReportToPdfFile(master.getName(), pdf.getName(), null, new dori.jasper.engine.JREmptyDataSource()); // Launch Acrobat - .pdf must be a registered type: if (pdf.exists()) java.lang.Runtime.getRuntime().exec("cmd.exe /c start " + pdf.getName()); } catch (java.lang.Exception ex) { ex.printStackTrace(); } finally { master.delete(); // Remove all of the .jasper files: for (int x = 0; x < subreports.size(); x++) ((java.io.File) subreports.get(x)).delete(); } return; } private static java.io.File subreportA() throws dori.jasper.engine.JRException { dori.jasper.engine.design.JRDesignBand band = new dori.jasper.engine.design.JRDesignBand(); java.io.File retVal = new java.io.File("subreportA.jasper"); java.util.List columns = new java.util.ArrayList(0); Report report; columns.add(new Column(0, 55)); columns.add(new Column(200, 255)); columns.add(new Column(400, 455)); columns.add(new Column(600, 655)); report = new Report(0, 0, 842, 15, 4); report.addSubreportTitle(band, "Subreport A"); report.addDetailColumns(band, columns, 16); report.addDetailBand(band, false); report.compileToFile(retVal.getName()); return(retVal); } private static java.io.File subreportB() throws dori.jasper.engine.JRException { dori.jasper.engine.design.JRDesignBand band = new dori.jasper.engine.design.JRDesignBand(); java.io.File retVal = new java.io.File("subreportB.jasper"); java.util.List columns = new java.util.ArrayList(0); Report report; columns.add(new Column(0, 55)); columns.add(new Column(200, 255)); columns.add(new Column(400, 455)); columns.add(new Column(600, 655)); report = new Report(0, 0, 842, 15, 4); report.addSubreportTitle(band, "Subreport B"); report.addDetailColumns(band, columns, 28); report.addDetailBand(band, false); report.compileToFile(retVal.getName()); return(retVal); } private static java.io.File subreportC1(int x, boolean isSubreport) throws dori.jasper.engine.JRException { dori.jasper.engine.design.JRDesignBand band = new dori.jasper.engine.design.JRDesignBand(); java.io.File retVal = new java.io.File("subreportC1_" + x + ".jasper"); java.util.List columns = new java.util.ArrayList(0); Report report; columns.add(new Column(0, 75)); columns.add(new Column(240, 305)); columns.add(new Column(470, 555)); report = new Report(0, 0, 842, 12, 3); if (isSubreport) report.addSubreportTitle(band, "Subreport C1"); report.addDetailColumns(band, columns, 39); report.addDetailBand(band, isSubreport); report.compileToFile(retVal.getName()); return(retVal); } private static java.io.File subreportC2(int x) throws dori.jasper.engine.JRException { dori.jasper.engine.design.JRDesignBand band = new dori.jasper.engine.design.JRDesignBand(); java.io.File retVal = new java.io.File("subreportC2_" + x + ".jasper"); java.util.List columns = new java.util.ArrayList(0); Report report; columns.add(new Column(0, 65)); columns.add(new Column(230, 295)); columns.add(new Column(450, 515)); report = new Report(0, 0, 842, 12, 3); report.addSubreportTitle(band, "Subreport C2"); report.addDetailColumns(band, columns, 32); report.addDetailBand(band, false); report.compileToFile(retVal.getName()); return(retVal); } private static java.io.File subreportD() throws dori.jasper.engine.JRException { dori.jasper.engine.design.JRDesignBand band = new dori.jasper.engine.design.JRDesignBand(); java.io.File retVal = new java.io.File("subreportD.jasper"); java.util.List fields = new java.util.ArrayList(5); Report report; fields.add(new TableField("One", 26, 50, "This")); fields.add(new TableField("Two", 76, 100, "is")); fields.add(new TableField("Three", 176, 75, "a")); fields.add(new TableField("Four", 251, 50, "data")); fields.add(new TableField("Five", 301, 50, "row")); report = new Report(0, 0, 842, 15, 2); report.addSubreportTitle(band, "Subreport D"); report.addDetailTable(band, fields, 5); report.addDetailBand(band, true); report.compileToFile(retVal.getName()); return(retVal); } } TableField.java: public class TableField { private java.lang.String data, name; private int startColumn, width; public TableField(java.lang.String name, int startColumn, int width, java.lang.String data) { this.name = name; this.startColumn = startColumn; this.width = width; this.data = data; return; } /* Getters & setters: */ public java.lang.String getData() { return(data); } public java.lang.String getName() { return(name); } public int getStartColumn() { return(startColumn); } public int getWidth() { return(width); } } build.xml: <project name="JasperReports" default="run" basedir="."> <path id="project.classpath"> <pathelement location="."/> <pathelement path="F:/Clients/Anaglyph/Jasper/JasperReports-0.4.6/lib/jasperreports.jar"/> <pathelement path="F:/Clients/Anaglyph/Jasper/JasperReports-0.4.6/lib/commons-beanutils.jar"/> <pathelement path="F:/Clients/Anaglyph/Jasper/JasperReports-0.4.6/lib/commons-collections.jar"/> <pathelement path="F:/Clients/Anaglyph/Jasper/JasperReports-0.4.6/lib/commons-digester.jar"/> <pathelement path="F:/Clients/Anaglyph/Jasper/JasperReports-0.4.6/lib/commons-logging.jar"/> <pathelement path="F:/Clients/Anaglyph/Jasper/JasperReports-0.4.6/lib/iText-0.96.jar"/> </path> <!-- Compiles the java source files of the test application. --> <target name="javac"> <javac srcdir="." destdir="." debug="true" optimize="false" deprecation="false"> <classpath refid="project.classpath"/> </javac> </target> <!-- Fills the compiled report design and produce the .jrprint file. --> <target name="run" depends="javac"> <java classname="Sample" fork="true"> <classpath refid="project.classpath"/> </java> </target> <!-- Deletes all the generated files. --> <target name="clean"> <delete> <fileset dir="." includes="**/*.class" /> <fileset dir="." includes="**/*.jasper" /> <fileset dir="." includes="**/*.pdf" /> </delete> </target> </project> By: Daryl Jackson - dkjjr RE: Subreports - possible bug? 2003-07-08 12:12 Subreport ordering still appears to be broken in 0.5.0. By: Daryl Jackson - dkjjr RE: Subreports - possible bug? 2003-06-22 14:20 No takers? No one else has observed similar behavior? I have not had the time to look at the Jasper source so I could really use some help. Thanks, Daryl By: Rick Rogerson - gr8north RE: Subreports - possible bug? 2003-09-16 13:20 I've got the same problem. Did you ever resolve it? Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now