【Stimulsoft Reports Java教程】在執行時建立關係報表
阿新 • • 發佈:2018-11-20
此示例專案顯示了使用關係和自定義物件資料庫在執行時建立報表的可能性。
首先,建立一個將儲存資料的物件類。
public class ObjectCell { public String val; @Override public boolean equals(Object obj) { return val.equals(((ObjectCell) obj).val); } public String toString() { return val; } public ObjectCell(String val) { this.val = val; } }
接下來,建立從StiDatabase類擴充套件的父資料庫並填充connect事件上的資料。
public class ParentDatabase extends StiDatabase { public ParentDatabase() { super("Demo.Parent");// Database name } public void connect(StiDataStoreSource stiDataStoreSource, Boolean fillTable) throws StiException { DataTable dataTable = stiDataStoreSource.createNewTable(); for (int i = 0; i < 5; i++) { DataRow dataRow = dataTable.createNewRow(); dataRow.addCell("cId", new ObjectCell("Object" + i)); dataRow.addCell("cName", "Parent cId: " + i); } stiDataStoreSource.setDataTable(dataTable); } public void disconnect() { } public void connect(StiDataStoreSource stiDataStoreSource) throws StiException { connect(stiDataStoreSource, true); } }
接下來,建立相同的子資料庫。
public class ChildDatabase extends StiDatabase { public ChildDatabase() { super("Demo.Child");// Database name } public void connect(StiDataStoreSource stiDataStoreSource, Boolean fillTable) throws StiException { DataTable dataTable = stiDataStoreSource.createNewTable(); for (int i = 0; i < 5; i++) { for (int k = 0; k < 5; k++) { DataRow dataRow = dataTable.createNewRow(); dataRow.addCell("cId", new ObjectCell("Object" + i)); for (int j = 1; j < dataRow.getColumns().size(); j++) { // fill row wiht my data dataRow.addCell(dataRow.getColumns().get(j).getColumnName(), "Child cId: " + i + " value: " + j); } } } stiDataStoreSource.setDataTable(dataTable); } public void disconnect() { } public void connect(StiDataStoreSource stiDataStoreSource) throws StiException { connect(stiDataStoreSource, true); } }
要顯示報表,我們需要建立Java檢視器。建立JFrame,設定必要的選項並新增檢視器控制元件。
public class CreateRelationsReport extends JPanel { private static final long serialVersionUID = 330448692680237867L; private static final Dimension FRAME_SIZE = new Dimension(800, 800); public static void main(final String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { try { JFrame frame = new JFrame(); frame.add(new CreateRelationsReport(frame)); frame.setSize(FRAME_SIZE); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } catch (Throwable e) { StiExceptionProvider.show(e, null); } } }); } public CreateRelationsReport(final JFrame parentFrame) throws IOException { setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); setPreferredSize(FRAME_SIZE); StiViewerFx viewerPanel = new StiViewerFx(parentFrame); add(viewerPanel); ...
接下來,建立新的報表物件,然後將父資料庫和子資料庫新增到其中。
... StiReport report = new StiReport(); StiPage page = new StiPage(report); report.getPages().add(page); page.setName(StiNameCreation.createName(report, StiNameCreation.generateName(page))); report.setDictionary(new StiDictionary(report)); report.getDictionary().getDatabases().add(new ParentDatabase()); report.getDictionary().getDatabases().add(new ChildDatabase()); ...
接下來,在物件表源中設定自定義列。
... List<StiDataTableSource> tableSources = new ArrayList<StiDataTableSource>(); // parent StiDataTableSource tSource = new StiDataTableSource("Demo.Parent", "Parent", "Parent"); tSource.setColumns(new StiDataColumnsCollection()); tSource.getColumns().add( new StiDataColumn("cId", "cId", StiSystemType.getSystemType("System.Object"))); tSource.getColumns().add( new StiDataColumn("cName", "cName", StiSystemType.getSystemType("System.String"))); tSource.setDictionary(report.getDictionary()); report.getDictionary().getDataSources().add(tSource); tableSources.add(tSource); // child tSource = new StiDataTableSource("Demo.Child", "Child", "Child"); tSource.setColumns(new StiDataColumnsCollection()); tSource.getColumns().add( new StiDataColumn("cId", "cId", StiSystemType.getSystemType("System.Object"))); for (int i = 0; i < 4; i++) { tSource.getColumns().add( new StiDataColumn("cData" + i, "cData" + i, StiSystemType.getSystemType("System.String"))); } tSource.setDictionary(report.getDictionary()); report.getDictionary().getDataSources().add(tSource); tableSources.add(tSource); ...
將帶有文字框的標題區帶和資料帶新增到報表中。
... // Create TitleBand StiHeaderBand titleBand = new StiHeaderBand(); titleBand.setHeight(0.85); titleBand.setName("TitleBand"); page.getComponents().add(titleBand); // Create Title text on header StiText headerText = new StiText(new StiRectangle(0, 0, page.getWidth(), 0.85)); headerText.setTextInternal("Tacticdescription"); headerText.setHorAlignment(StiTextHorAlignment.Left); headerText.setName("TitleHeader"); headerText.setFont(new StiFont("Arial", 12F, StiFontStyle.Bold)); titleBand.getComponents().add(headerText); Integer nameIndex = 1; List<StiDataBand> dataBands = new ArrayList<StiDataBand>(); for (StiDataTableSource tableSource : tableSources) { // Create Databand StiDataBand dataBand = new StiDataBand(); dataBand.setDataSourceName(tableSource.getName()); dataBand.setHeight(0.5); dataBand.setName("DataBand" + nameIndex); nameIndex++; page.getComponents().add(dataBand); double pos = 0; double columnWidth = page.getWidth() / tableSource.getColumns().size(); for (StiDataColumn dataColumn : tableSource.getColumns()) { StiText dataText = new StiText(new StiRectangle(pos, 0, columnWidth, 0.5)); dataText.setText("{" + tableSource.getName() + "." + dataColumn.getName() + "}"); dataText.setName("DataText" + nameIndex.toString()); dataText.getBorder().setSide(StiBorderSides.All); dataBand.getComponents().add(dataText); pos = pos + columnWidth; nameIndex++; } dataBands.add(dataBand); } ...
建立報表的所有元件,我們現在可以配置資料關係。
... dataBands.get(1).setDataRelationName("Relation"); dataBands.get(1).setMasterComponent(dataBands.get(0)); ArrayList<String> cols = new ArrayList<String>(); cols.add("cId"); StiDataRelation rel = new StiDataRelation("Relation", tableSources.get(0), tableSources.get(1), cols, cols); report.getDictionary().getRelations().add(rel); ...
最後,渲染報表並在Java檢視器中顯示它。
... report.Render(); viewerPanel.getStiViewModel() .getEventDispatcher() .dispatchStiEvent( new StiViewCommonEvent(StiViewCommonEvent.DOCUMENT_FILE_LOADED, new StiDocument(report), null)); }
示例程式碼的結果如下圖所示: