2011-12-19 32 views
17

Tôi phải chuẩn bị báo cáo bằng năm truy vấn sql khác nhau. Mỗi truy vấn sẽ đưa ra một bảng báo cáo.Cách đối chiếu nhiều báo cáo jrxml jasper thành một tệp đầu ra pdf duy nhất

Vì vậy, tôi đã viết 5 file jrxml mỗi tương ứng với một trong các truy vấn trên với các tiêu đề của riêng mình, thiết lập tiêu đề, footers, pagenumbers vv

Bây giờ, tôi có thể biên dịch, in ấn và xuất khẩu mỗi trên jrxmls thành 5 bản pdf khác nhau.

Tuy nhiên, khách hàng muốn tất cả các báo cáo được đối chiếu thành một bản pdf duy nhất. Đó là trong pdf cuối cùng, đầu tiên bốn trang sẽ được báo cáo một, năm trang tiếp theo báo cáo hai, sau đó báo cáo ba và vv và vv.

1) Làm cách nào để đạt được điều này?

2) Mỗi ​​báo cáo có số trang là 1/4, 2/4, 3/4, vv. Trường hợp phần thứ hai nghĩa là số trang hoàn thành được đánh giá với thời gian đánh giá dưới dạng báo cáo. Vì vậy, khi tôi sẽ tổng hợp tất cả các báo cáo trong pdf đơn (nếu có thể), nó cũng sẽ có thể tái số các trang trong justification để pdf cuối cùng?

Dựa trên câu trả lời dưới đây, tôi đã làm như sau trong lớp java của tôi và nó hoạt động:

try 
      { 
      JasperReport jreport1 = JasperCompileManager.compileReport(input1); 
      JasperPrint jprint1 = JasperFillManager.fillReport(jreport1, new HashMap(), new JREmptyDataSource()); 
      //JasperExportManager.exportReportToPdfFile(jprint, "/home/ashutosh/Desktop/desktop/nikunj/JasperTestApp/output/mytest.pdf"); 

      JasperReport jreport2 = JasperCompileManager.compileReport(input2); 
      JasperPrint jprint2 = JasperFillManager.fillReport(jreport2, new HashMap(), new JREmptyDataSource()); 

      JasperReport jreport3 = JasperCompileManager.compileReport(input3); 
      JasperPrint jprint3 = JasperFillManager.fillReport(jreport3, new HashMap(), new JREmptyDataSource()); 

      List<JasperPrint> jprintlist = new ArrayList<JasperPrint>(); 

      jprintlist.add(jprint1); 
      jprintlist.add(jprint2); 
      jprintlist.add(jprint3); 

      JRExporter exporter = new JRPdfExporter(); 
      exporter.setParameter(JRPdfExporterParameter.JASPER_PRINT_LIST, jprintlist); 

      OutputStream output = new FileOutputStream(new File("/home/ashutosh/Desktop/desktop/nikunj/JasperTestApp/output/mytestbatch.pdf")); 

      exporter.setParameter(JRPdfExporterParameter.OUTPUT_STREAM, output); 
      exporter.exportReport(); 

      }catch(Exception e) 
      { 
       e.printStackTrace(); 
      } 

Ảnh trên: Input1, Input2, Input3 là đường dẫn chuỗi đầu vào jrxmls

đâu file JRXML của tôi chỉ cần in ba thư: Hello World 1, Hello World 2, Hello World 3.

<?xml version="1.0"?> 
<!DOCTYPE jasperReport 
    PUBLIC "-//JasperReports//DTD Report Design//EN" 
    "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> 

<jasperReport name="Simple_Report"> 
<detail> 
    <band height="20"> 
     <staticText> 
     <reportElement x="180" y="0" width="200" height="20"/> 
     <text><![CDATA[Hello World One!]]></text> 
     </staticText> 
    </band> 
    </detail> 
</jasperReport> 

Cảm ơn bạn đã đọc!

+0

câu trả lời Alex K là tốt. Bạn cũng có thể nhận được những gì bạn muốn bằng cách đặt các báo cáo riêng lẻ vào các báo cáo con của một báo cáo chính. Nó sẽ có nhiều công việc hơn, nhưng nó sẽ cho phép bạn xử lý yêu cầu đánh số trang. Bạn chắc chắn nên bỏ phiếu cho điều này là tốt. Nó sẽ bao gồm chính xác những gì bạn mô tả: http://jasperforge.org/projects/jasperreports/tracker/view.php?id=4178 – mdahlman

Trả lời

13

Bạn có thể tận dụng lợi thế của xuất khẩu the whole list jasperprint:

List jpList = new ArrayList(); 
jpList.add(JRLoader.loadObjectFromFile("build/reports/Report1.jrprint")); 
... 
JRExporter exporter = new JRPdfExporter(); 
exporter.setParameter(JRPdfExporterParameter.JASPER_PRINT_LIST, jpList); 
exporter.setParameter(JRPdfExporterParameter.OUTPUT_STREAM, stream); 
exporter.exportReport(); 
+1

@NikunjChauhan Mẫu [ở đây] (http://jasperforge.org/uploads/ xuất bản/jasperreportswebsite/trunk/sample.reference/batchexport/index.html). Thư mục 'demo \ samples \ batchexport' từ gói phân phối JasperReports. –

+0

@Wojtek O.: Cách xác định jpList ?? Nó là một danh sách đơn giản của các đối tượng jprint? – Nik

+0

@AlexK: Bạn có thể vui lòng dán lại liên kết ... nó không có .. cảm ơn! – Nik

1

Số trang mà không iText ...

private void drawPageNumbers(List<JasperPrint> listJasperPrint, int totalPages) throws JRException { 

    int pageCount = 0; 
    int posY = 0; 
    int posX = 0; 

    for (JasperPrint jasperPrint : listJasperPrint) { 

     if (jasperPrint.getOrientation() == JRReport.ORIENTATION_PORTRAIT) { 
      posY = 805; 
      posX = 472; 
     } 

     if (jasperPrint.getOrientation() == JRReport.ORIENTATION_LANDSCAPE) { 
      posY = 558; 
      posX = 717; 
     } 

     for (Object obj : jasperPrint.getPages()) { 

      pageCount++; 
      JRPrintPage page = (JRPrintPage) obj; 

      JRPrintText textTotalPages = new JRTemplatePrintText(new JRTemplateText(
        jasperPrint.getOrigins()[0], jasperPrint.getDefaultStyleProvider())); 
      textTotalPages.setX(posX + 54); 
      textTotalPages.setY(posY); 
      textTotalPages.setWidth(40); 
      textTotalPages.setHeight(16); 
      textTotalPages.setText(" " + totalPages); 
      page.addElement(textTotalPages); 

      JRPrintText textPageNumber = new JRTemplatePrintText(new JRTemplateText(
        jasperPrint.getOrigins()[0], jasperPrint.getDefaultStyleProvider())); 
      textPageNumber.setX(posX); 
      textPageNumber.setY(posY); 
      textPageNumber.setWidth(80); 
      textPageNumber.setHeight(16); 
      textPageNumber.setText("Página " + pageCount + " de"); 
      page.addElement(textPageNumber); 
     } 
    } 

    return; 
} 
0

(iReport chẳng hạn)

Phần I:

  • tạo một jasper trống mới báo cáo như báo cáo wrapper cho các báo cáo khác nhau
  • data adapter = Một bản ghi trống - Rỗng Hàng
  • bấm vào nút "New ..."
  • chọn "hàng trống rỗng"
  • nhấp chuột "bên cạnh"
  • số bản ghi trống = 1 (vì vậy bạn sẽ mô phỏng trên bản ghi và chỉ ONE dải chi tiết sẽ được in)
  • để báo cáo trống sẵn sàng Khi bạn gọi báo cáo này ra khỏi chương trình JAVA của mình, trước tiên hãy mở kết nối dữ liệu vào cơ sở dữ liệu và trao đổi kết nối này trong nền. SubReports của báo cáo wrapper của chúng tôi có thể kế thừa kết nối này thông qua các tham số!

Phần 2)

  • thêm cho mỗi báo cáo bạn muốn nhúng một ban nhạc chi tiết mới.
  • mỗi băng chi tiết chứa một subreport (liên kết đến các báo cáo độc lập khác của khóa học)
  • thiết lập thuộc tính "chạy xuống dưới" sang "True" trong định nghĩa subreport của báo cáo wrapper của chúng tôi

khái niệm này làm việc cho tôi. tùy thuộc vào thông số, bạn có thể bật hoặc tắt các dải khác nhau, tất nhiên.

+0

Tôi nghĩ OP đang tìm kiếm một cách tiếp cận có lập trình ... –

4

Câu trả lời này là để giúp người dùng với JASPER BÁO CÁO VERSION> 5,6 (mới nhất các phiên bản), do đó loại bỏ mã phản đối.

Kể từ jasper-báo cáo 5,6 JRPdfExporterParameter.JASPER_PRINT_LISTdeprecated mã hiện tại của Wojtek Owczarczyk answer là:

List<JasperPrint> jpList = new ArrayList<>(); 
//add your JasperPrint's from loading jrprint or more 
//commonly filling report with JasperFillManager.fillReport 

JRPdfExporter exporter = new JRPdfExporter(); 
exporter.setExporterInput(SimpleExporterInput.getInstance(jpList)); //Set as export input 
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(stream)); //Set output stream 
SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration(); 
//set your configuration 
exporter.setConfiguration(configuration); 
exporter.exportReport(); 
+0

Lưu ý: việc xuất với chất lượng tốt nhất (JRGraphics2DExporter) không hoạt động với nhiều jasperPrint. Tham khảo: mã nguồn của JRGraphics2DExporter – Topera

Các vấn đề liên quan