十、撰寫程式來產生報表PDF
輸出成pdf主要的內容在save(String fileName)這個function裡,而jasper檔需放置在class的根目路上。
package com.izero.print.pdf;
import java.io.File;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.util.JRLoader;
public class ToFile {
private com.izero.print.datasource.AddressSource cds;
public ToFile(com.izero.print.beansList.AddressList addrlist)
{
cds = new com.izero.print.datasource.AddressSource(addrlist);
}
public void save(String fileName)throws Exception
{
String root_path = this.getClass().getResource("/").getPath();
//root_path = root_path.replace('\\', '/');
String reportFilePath = root_path
+ "proftk.jasper";
System.out.println(reportFilePath);
JRDataSource dataSource = this.createDataSource();
Map<String, String> parameters = new HashMap<String, String>();
//parameters.put("SUBREPORT_DIR", root_path
//+ "h:/");
JasperReport report = (JasperReport) JRLoader
.loadObject(reportFilePath);
JasperPrint jasperPrint = JasperFillManager.fillReport(report,
parameters, dataSource);
java.io.File f = new java.io.File(fileName);
if(f.isDirectory())
f = new java.io.File(f.getPath()+File.separator+"proftk.pdf");
System.out.println(f.getPath());
java.io.OutputStream outputStream = new java.io.FileOutputStream(f);
// 使用JRPdfExproter導出器導出pdf
JRPdfExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
outputStream);
exporter.exportReport();
outputStream.close();
}
private JRDataSource createDataSource() {
if(cds==null)
cds = new com.izero.print.datasource.AddressSource();
return cds;
}
}
以下是操作的畫面,使用Virtual Editor Layout出來的,主要有一個載入檔案的按鈕,來載入檔案,並把檔案顯示在table裡,另一個按鈕來設定輸出路徑,設定好後會自動把報表產生完成。
package com.izero;
import java.awt.BorderLayout;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.Dimension;
import javax.swing.JButton;
import java.awt.Rectangle;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class Printer extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JButton jButton = null;
private JScrollPane jScrollPane = null;
private JTable jTable = null;
private JButton jButton1 = null;
/**
* This is the default constructor
*/
public Printer() {
super();
initialize();
}
/**
* This method initializes this
*
* @return void
*/
private void initialize() {
this.setSize(528, 358);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
}
/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(null);
jContentPane.add(getJButton(), null);
jContentPane.add(getJScrollPane(), null);
jContentPane.add(getJButton1(), null);
}
return jContentPane;
}
/**
* This method initializes jButton
*
* @return javax.swing.JButton
*/
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setBounds(new Rectangle(381, 11, 120, 34));
jButton.setText("載入檔案");
jButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
chooser.setApproveButtonText("確定");
chooser.showDialog(jButton, null); //留 null 否則上一行的設定被覆蓋
java.io.File filePath = chooser.getSelectedFile();
if(filePath!=null && !filePath.getPath().equals("")){
//jTextField1.setText(filePath.getPath());
java.io.BufferedReader reader = null;
try
{
String str = null;
reader = new java.io.BufferedReader(new java.io.FileReader(filePath));
while((str=reader.readLine())!=null)
{
String[] rowData = str.split(",");
((DefaultTableModel)getJTable().getModel())
.addRow(rowData);
}
}catch(java.io.IOException ex)
{
ex.printStackTrace();
}
finally
{
try
{
if(reader!=null)
reader.close();
}catch(java.io.IOException exx)
{
}
}
}
}
});
}
return jButton;
}
/**
* This method initializes jScrollPane
*
* @return javax.swing.JScrollPane
*/
private JScrollPane getJScrollPane() {
if (jScrollPane == null) {
jScrollPane = new JScrollPane();
jScrollPane.setBounds(new Rectangle(6, 50, 492, 195));
jScrollPane.setViewportView(getJTable());
}
return jScrollPane;
}
private DefaultTableModel getModel()
{
String[] headers = { "名稱", "郵地區號", "地址" };
Object[][] cellData = null;
DefaultTableModel model = new DefaultTableModel(cellData, headers) {
public boolean isCellEditable(int row, int column) {
return false;
}
};
return model;
}
/**
* This method initializes jTable
*
* @return javax.swing.JTable
*/
private JTable getJTable() {
if (jTable == null) {
jTable = new JTable();
jTable.setModel(getModel());
}
return jTable;
}
/**
* This method initializes jButton1
*
* @return javax.swing.JButton
*/
private JButton getJButton1() {
if (jButton1 == null) {
jButton1 = new JButton();
jButton1.setBounds(new Rectangle(338, 272, 151, 34));
jButton1.setText("選取目錄");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
chooser.setApproveButtonText("確定");
chooser.showDialog(jButton1, null); //留 null 否則上一行的設定被覆蓋
java.io.File filePath = chooser.getSelectedFile();
if(filePath!=null && !filePath.getPath().equals("")){
com.izero.print.beansList.AddressList addrlist =
new com.izero.print.beansList.AddressList();
DefaultTableModel tableModel = (DefaultTableModel) getJTable()
.getModel();
int rowCount=tableModel.getRowCount();
for(int i = 0 ; i < rowCount;i++)
{
addrlist.addBean(new com.izero.print.beans.Address((String)tableModel.getValueAt(i, 0),
(String)tableModel.getValueAt(i, 1),(String)tableModel.getValueAt(i, 2)));
}
com.izero.print.pdf.ToFile save = new com.izero.print.pdf.ToFile(addrlist);
try
{
save.save(filePath.getPath());
javax.swing.JOptionPane.showMessageDialog(((JButton)e.getSource()).getParent(),
"已輸出pdf完成!\r\n"+filePath.getPath());
}catch(Exception ex)
{
ex.printStackTrace();
}
}
}
});
}
return jButton1;
}
public static void main(String args[])
{
(new Printer()).setVisible(true);
}
}
檔案格式如下圖姓名、郵遞區號、地址。


選取目錄後,等待一下會告知輸出pdf完成,就可以在剛才選取的路徑看到報表pdf檔的產生了。

大概內容如下,如此就可以把內容輸出至印表機了。

ps.
程式需要的pdf檔列表如下:
- commons-beanutils-1.8.0.jar
- commons-collections-2.1.1.jar
- commons-digester-1.7.jar
- commons-javaflow-20060411.jar
- commons-logging-1.0.4.jar
- groovy-all-1.7.5.jar
- iText-2.1.7.jar
- iTextAsian.jar
- jasperreports-4.0.0.jar