自定義填報
在使用Java報表軟件填報時,個別用戶為了需求,需要自定義填報。
下面以FineReportJava報表軟件在報表屬性中的填報頁面設(shè)置中可以自定義填報功能。
實例:
該實例實現(xiàn)首先在工具欄上加一個按鈕,通知服務(wù)器要做填報;然后服務(wù)器獲得當(dāng)前的SessionIDInfor,取出當(dāng)前的報表,獲得報表中A1、B1擴(kuò)展后的格子,再把這組數(shù)據(jù)insert到數(shù)據(jù)庫中;最后返回客戶端一個訊息,表示填報成功了,客戶端再彈個對話框,提示填報成功了。
1. 連接數(shù)據(jù)庫FRDemo
2. 報表設(shè)計
2.1 新建報表
2.2 模板設(shè)計
添加一個名為ds1的數(shù)據(jù)庫查詢:SELECT * FROM customer,表樣設(shè)計,如圖

2.3 自定義報表填報屬性

2.4 定義單元格空間屬性
2.5 自定義報表Web屬性

點擊菜單欄報表|報表Web屬性,進(jìn)入報表Web屬性窗口,在填報頁面設(shè)置欄目中,將左邊需要顯示的按鈕拖到中間的窗口中,并在右邊窗口添加加載結(jié)束事件,實現(xiàn)自定義的填報功能,如圖所示

在加載結(jié)束事件窗口中添加事件的JS代碼

具體js代碼如下
var $toolbar = $('.FR-ToolBar-disabled > table >tbody>tr');
var option = {
//"icon": "css:x-emb-email",
"listeners": [ {"once": false,
"action": function(e){
var xml = _g('${SessionID}').generateReportXML();
$.ajax({
url : "test.jsp",
type : 'POST',
data : {op : 'test1', sessionID : '${SessionID}',
reportXML : xml},
complete : function(res, status) {
FR.showDialog("Relation", 300, 400, res.responseText);
}})
},
"eventName": "click"
}],
"text": "測試",
"invisible": false,
"type": "button",
"disabled": false,
"render": true};
$button = $('<div></div>');
FR.comp.create($button, "button", option);
$tc = $("<td>").append($button);
$toolbar.append($tc);
此段JS代碼引用了一個test.jsp,代碼為:
<%@ page import="com.fr.web.CustomSubmit" %>
<%@ page contentType="text/html" %>
<%
CustomSubmit.dealWithTest(request, response);
%>
將該test.jsp文件放在設(shè)計器安裝的WebReport目錄下。
該test.jsp文件又引用了一個CustomSubmit類,將該類編譯后的.class文件放在
%WebReport\WEB-INF\classes\com\fr\web目錄下,該類的代碼具體如下
packagecom.fr.web;
importjava.io.PrintWriter;
importjava.util.ArrayList;
importjava.util.List;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importcom.fr.base.ColumnRow;
importcom.fr.report.Report;
importcom.fr.report.core.FormReport;
importcom.fr.report.core.PackedReport;
importcom.fr.web.ParameterConsts;
importcom.fr.web.core.SessionDealWith;
importcom.fr.web.core.SessionIDInfor;
importcom.fr.web.core.WebUtils;
publicclassCustomSubmit {
publicstaticvoiddealWithTest(HttpServletRequestreq, HttpServletResponse res) throws Exception {
String sessionID = WebUtils.getHTTPRequestParameter(req,ParameterConsts.SESSION_ID);
SessionIDInforsessionIDInfor = SessionDealWith.getSessionIDInfor(sessionID);
List cellRelation = newArrayList();
for(int i = 0, len = sessionIDInfor.getWorkBook2Show().getReportCount(); i <len; i++) {
Report report = sessionIDInfor.getWorkBook2Show().getReport(i);
if (report instanceofFormReport&& report instanceofPackedReport) {
Report fr = (PackedReport)report;
//請注意這步,我想要取的是A1和B1兩個格子擴(kuò)展以后的他們之間關(guān)系和值,如果是想拿A1,B1,D5,對應(yīng)添加ColumnRow.valueOf("D5")既可
List rl = ((FormReport)report).getExtendColumnRowList(newColumnRow[] {ColumnRow.valueOf("A1"), ColumnRow.valueOf("B1")});
for (int c = 0, cl = rl.size(); c < cl; c++) {
ColumnRow[] crs = (ColumnRow[])rl.get(c);
ColumnRowValue[] crvs = newColumnRowValue[crs.length];
for (int index = 0, il = crs.length; index <il; index++) {
crvs[index] = newColumnRowValue(crs[index], fr.getCellValue(crs[index].column, crs[index].row));
}
cellRelation.add(crvs);
}
}
}
//cellRelation里面存放著擴(kuò)展以后的格子之間的關(guān)系和格子的值
//以111.cpt模板為例,數(shù)據(jù)列擴(kuò)展后城市NewYork對應(yīng)ID 1和4,在cellRelation里面就是cellRelation.get(0)和cellRelation.get(1),對應(yīng)著兩個ColumnRowValue[]
//第一個ColumnRowValue數(shù)組的ColumnRowValue[0]的ColumnRow是A1,Value是NewYork,ColumnRowValue[1]的ColumnRow是B1,Value是1
//第二個ColumnRowValue數(shù)組的ColumnRowValue[0]的ColumnRow是A1,Value是NewYork,ColumnRowValue[1]的ColumnRow是B2,Value是4
if (cellRelation.size() > 0) {
PrintWriter writer = WebUtils.createPrintWriter(res);
for (int i = 0, len = cellRelation.size(); i <len; i++) {
ColumnRowValue[] crvs = (ColumnRowValue[])cellRelation.get(i);
StringBuffersb = newStringBuffer();
for (int v = 0, vl = crvs.length; v <vl; v++) {
if (v != 0) {
sb.append(" ");
}
sb.append(crvs[v].toString());
if (v == vl - 1) {
sb.append("<br />");
}
}
writer.println(sb.toString());
}
writer.flush();
writer.close();
}
}
publicstaticclassColumnRowValue {
privateColumnRowcr;
private Object value;
publicColumnRowValue(ColumnRowcr, Object value) {
this.cr = cr;
this.value = value;
}
publicColumnRowgetColumnRow() {
returncr;
}
public Object getValue() {
return value;
}
public String toString() {
returnnew StringBuffer().append(cr.toString()).append(":").append(value.toString()).toString();
}
}
}
3. 保存并預(yù)覽
點擊填報預(yù)覽,BS界面除了FR報表自帶的提交按鈕和數(shù)據(jù)校驗按鈕外,還多了一個測試按鈕

點擊測試按鈕,出現(xiàn)測試界面

文章轉(zhuǎn)自:http://blog.csdn.net/best_report/archive/2010/09/24/5902877.aspx