2008年9月30日 星期二

使用IReport 產生EXCEL檔的範例








JasperPrint jasperPrint;
JRResultSetDataSource jrds=null;
/* 帶參數進去給報表 */
Map map = new HashMap();
map.put("name","王小明");
Date d = new Date();
String Pdf_Name= (d.getYear()+1900)+"_"+(d.getMonth()+1)+"_"+d.getDate()+"_"+d.getHours()+"_"+d.getMinutes()+"_"+d.getSeconds();


try{
StrSQL = " SELECT SN, PRODUCT_TYPE, TC001, TD004, TD005, TD008, TB005_A, TA018_A, BAD_RATE_A, TA017_A, TB005_B, TA018_B, BAD_RATE_B, TA017_B, TB005_C, TA018_C, ";
StrSQL += " BAD_RATE_C, TA017_C, TB005_4, TA018_4, BAD_RATE_4, TA017_4, SUB_BAD_RATE ";
StrSQL += " FROM CARD_MOC013R ";
StrSQL += " ORDER BY PRODUCT_TYPE, TC001 ";
//out.println(StrSQL);

rs= stmt.executeQuery(StrSQL);


rs= stmt.executeQuery(StrSQL);
if(!rs.next()){
out.println("沒有資料,請重新查詢!!");
out.println("統計表");
}else{
rs.previous() ;
String fileName = application.getRealPath("MOC013R.jasper");
String outPath = application.getRealPath("MOC013R_"+Pdf_Name+".xls");
String outPath2 = application.getRealPath("MOC013R_"+Pdf_Name+".pdf");

File reportFile1 = new File(application.getRealPath("MOC013R.jasper"));

out.println("統計表_EXCEL版");



JasperPrint report = JasperFillManager.fillReport(fileName,map, new JRResultSetDataSource(rs));
JRAbstractExporter exporter = new JExcelApiExporter();
FileOutputStream output = new FileOutputStream(outPath);

exporter.setParameter(JRExporterParameter.JASPER_PRINT, report);
exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, false);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, output);
exporter.exportReport();
output.close();

JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile1.getPath());
jasperPrint = JasperFillManager.fillReport(jasperReport,map, new JRResultSetDataSource(rs));

JasperPrintManager.printReportToPdfFile(jasperPrint, outPath2);
/* 把報表轉換成 PDF, 給定 ( RecordSet, 輸出路徑 ) */
JasperExportManager.exportReportToPdfFile(jasperPrint,outPath2);
}

/* 連線關閉 */
} catch (JRException e) {
e.printStackTrace();
}

ireport 的四則運算

IReport 說好用也好用,說難用也很難用!!
它的功能很強,不輸水晶,但操作起來並不直覺。
但習慣後還真不能沒有它。雖然它讓我吃盡苦頭。
如下面是兩數相除,要用下面的語法
new java.lang.Float( ($V{SUM_TA018_C_1}.floatValue()) /($V{SUM_TB005_C_1}.floatValue()) )

如下面僅僅是兩個數相加
(new BigDecimal( Double.parseDouble($V{SUM_week_1_6} +"") +Double.parseDouble($V
{SUM_week_2_4}+"") ))

這個是Boolean判斷式的寫法
new Boolean($V{REPORT_COUNT}.intValue() % 2 == 0)

這是if 判斷的寫法
$F{quantity} == null ? "No data" : String.valueOf($F{quantity})

在IReport 中的四則運算, 不能只單純使用數目的加減乘除, 所以如果忘記或不熟加減乘除的寫法,
可以照下面圖片, 去產生語法範例, 注意喔, 它僅僅是範例, 所以還有改寫成要 去產生語法範例, 注意喔, 它僅僅是範例, 所以還有改寫成要操作的運算式, 在報表中使用.