IReport在设置参数的时候需要先在左边新建一个parameter,
然后再把该parameter托到右边的设计栏中。
将需要批量打印的内容生成的结果集传递给报表模板就可以了,会自动批量打印。不预览循环批量打印要怎样实现?
需要调用打印接口 JasperPrintManager类可以直接实现打印。具体资料你可以参考Api
我用的是printReport 方法。
主要就是先在服务器端生成JasperPrint对象,返回给客户端。
下面代码百度到的,你可以参考。
import java.io.File
import java.io.ObjectOutputStream
import java.util.ArrayList
import java.util.List
import java.util.Map
import javax.naming.Context
import javax.naming.InitialContext
import javax.naming.NameNotFoundException
import javax.servlet.ServletOutputStream
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse
import javax.sql.DataSource
import net.sf.jasperreports.engine.JRException
import net.sf.jasperreports.engine.JasperFillManager
import net.sf.jasperreports.engine.JasperPrint
import net.sf.jasperreports.engine.JasperPrintManager
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource
import org.apache.struts.action.Action
import org.apache.struts.action.ActionForm
import org.apache.struts.action.ActionForward
import org.apache.struts.action.ActionMapping
import com.lowagie.text.ExceptionConverter
import com.sofn.struts.dto.UserInfoDTO
import com.sofn.struts.op.UserInfo
import com.sofn.util.UserSessionOperate
public class ReportViewAction extends Action {
(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response)
throws Exception {
//已编译文件路径和格式
String fp =this.getServlet().getServletContext().getRealPath("/")+ "report\\jasper\\"+ request.getAttribute("rdoc")+ ".jasper"
File reportFile = new File(fp)
//System.out.println("报表路径!!!!!!!"+reportFile)
Map parameters = (Map) request.getAttribute("paras")
byte[] bytes = null
List list = new ArrayList()
DataSource ds = null
JasperPrint jasperPrint=null
//参数传递
UserSessionOperate uso = new UserSessionOperate()
String user = uso.getUser(request)
UserInfo eidr = new UserInfo()
UserInfoDTO eidrdto = null
String deptname = "物流部门"
String username = "陈云刚"
parameters.put("marker", username)
parameters.put("bumen", deptname)
//数据库连接
try {
String source = "java:comp/env/jdbc/posuse"
Context ic = null
if (ic == null)
ic = new InitialContext()
ds = (DataSource) ic.lookup(source)
if (ds == null) {
System.out.println("Reportview----22222!")
}
} catch (NameNotFoundException nfe) {
nfe.toString())
} catch (Exception ne) {
ne.printStackTrace()
}
//使用数据源
if (request.getAttribute("datasource") != null) {
list = (List) request.getAttribute("reportlist")
JRBeanCollectionDataSource jds =new JRBeanCollectionDataSource(list) //使用数据源
}
//使用SQL查询
try {
jasperPrint =JasperFillManager.fillReport(reportFile.getPath(),parameters,ds.getConnection())//填充报表数据生成JasperPrint对象
JasperPrintManager.printReport(jasperPrint, false)//2008-08-25 直接打印,不用预览PDF直接打印 true为d出打印机选择.false为直接打印.
} catch (JRException jre) {
//System.out.println("Reportview----JRException88888")
jre.printStackTrace()
} catch (ExceptionConverter ec) {
ec.getLocalizedMessage())
ec.printStackTrace()
} catch (NullPointerException npe) {
npe.getLocalizedMessage())
npe.getMessage())
npe.toString())
System.err)
} catch (Exception ee) {
ee.printStackTrace()
}
//输出
response.setContentType("application/octet-stream")
ServletOutputStream ouputStream = response.getOutputStream()
ObjectOutputStream oos = new ObjectOutputStream(ouputStream)
oos.writeObject(jasperPrint)//将JasperPrint对象写入对象输出流中
oos.flush()
oos.close()
ouputStream.flush()
ouputStream.close()
return mapping.findForward("view") //转向
}
}
我看了一下楼主的代码,没有错误,你是直接采用jasper.xml生成报表, 在填充数据的那一段报错,很有可能是获取list集合的时候,有问题导致,
如果是采用Hibernate,检查一下,你的字段的映射关系,
最好能把错误也贴出来,我们也能帮你分析一下:
以下是我之前使用ireport工具做报表的代码:希望能带来帮助,
/**
*生成报表方法
*/
public ByteArrayOutputStream generatePdf(String jasperFile, HashMap map,
Collection beanCollection, ResourceBundle bundle, Locale locale) {
logger.info("Start generatePdf with bean collection, jasper file: " + jasperFile)
ByteArrayOutputStream out = new ByteArrayOutputStream()
if (map == null)
map = new HashMap()
if (locale != null)
//传入国际化文件
map.put(JRFillParameter.REPORT_LOCALE, locale)
map.put(JRFillParameter.REPORT_RESOURCE_BUNDLE, bundle)
//获取Inputstream流
InputStream in = ReportGeneratorImpl.class.getClassLoader()
.getResourceAsStream(jasperFile + ".jrxml")
try {
//编译成jasper.xml文件
JasperReport jreport = JasperCompileManager.compileReport(in)
//填充报表参数为,jasper文件,map集合,数据源
JasperPrint print = JasperFillManager.fillReport(jreport, map,
new JRBeanCollectionDataSource(beanCollection))
//最后导出到outputStream
JasperExportManager.exportReportToPdfStream(print, out)
} catch (JRException e) {
logger.logExceptionCaught(e)
} finally {
try {
logger.info("Close input stream")
in.close()
} catch (Exception e) {
logger.logExceptionCaught(e)
}
}
return out
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)