由于需求是要求发送附件到邮箱,可以grails插件对附件的支持不是很好,最终决定用birt api将报表导出到一个目录,然后发送附件是通过java mail发送!
导出碰到的问题:
1.导出报表只能到处一张,后面的初始化环境报错(猜测是birt环境初始化太频繁了),解决方法:将所有的报表导出后,在关闭birt平台;
部分方法:
public class ExportReport {
/**
* 初始化
*
* @return
*/
public IReportEngine configReport() {
IReportEngine engine = null;
EngineConfig config = null;
try {
config = new EngineConfig();
// config.setBIRTHome("E:\\birt-2.5.0\\ReportEngine");
// config.setBIRTHome("E:\\birt-runtime-2_3_1\\ReportEngine");
config.setBIRTHome("D:\\birtReportWork\\birt-runtime-2_3_1\\ReportEngine");
// // 这是CS程序,直接设置birthome
Platform.startup(config);
IReportEngineFactory factory = (IReportEngineFactory) Platform
.createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
engine = factory.createReportEngine(config);
return engine;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* close
*
* @param task
* @param engine
*/
public void closeReport(IRunAndRenderTask task, IReportEngine engine) {
if (task != null) {
task.close();
}
if (engine != null) {
engine.destroy();
}
Platform.shutdown();
}
@SuppressWarnings("unchecked")
private void runReportPdf(Map reportName,String parameter) {
IReportEngine engine = configReport();
IRunAndRenderTask task = null;
try {
IReportRunnable design = null;
// String prefix = "C:\\apache-tomcat-6.0.18\\webapps\\WebViewerExample\\report\\";
String prefix ="C:\\Program Files\\Apache Software Foundation\\Tomcat 6.0\\webapps\\WebViewerExample\\report";
HTMLRenderOption options = new HTMLRenderOption();
String pathPrefix = "D:\\birtReportWork/output/";
// String pathPrefix = "E:\\output/";
// System.out.println(pathPrefix + reportName + "." + format);
for (Object o : reportName.entrySet()) {
Map.Entry<String, String> m = (Map.Entry<String, String>)o;
//logger.info("email-" + m.getKey() + ":" + m.getValue());
String key = m.getKey();
String value = m.getValue();
String[] list = key.split(",");
for (int i = 0; i < list.length; i++) {
String end = ".rptdesign";
design = engine.openReportDesign(prefix + list[i] + end); // 打开这个已经写好的报表文件
task = engine.createRunAndRenderTask(design);
task.setParameterValue("name", "china");
System.out.println(list[i]);
options.setOutputFileName(pathPrefix + list[i] + "."
+ value); // 设置生成的pdf名称,动态的。
options.setOutputFormat(value); // 设置显示格式为pdf,可以改成html
options.setHtmlRtLFlag(false);
options.setEmbeddable(false);
task.setRenderOption(options);
//task.setParameterValue("name", parameter);
task.run();
}
}
System.out.println("succuess");
closeReport(task, engine);
} catch (Exception e) {
e.printStackTrace();
}
}
private void runReportExl(Map reportName,String parameter) {
IReportEngine engine = configReport();
IRunAndRenderTask task = null;
try {
IReportRunnable design = null;
String prefix = "C:\\apache-tomcat-6.0.18\\webapps\\WebViewerExample\\report\\";
// String prefix =
// "C:\\Program Files\\Apache Software Foundation\\Tomcat 6.0\\webapps\\WebViewerExample\\report";
EXCELRenderOption options = new EXCELRenderOption(); //生成到xls
// String pathPrefix = "D:\\birtReportWork/output/";
String pathPrefix = "E:\\output/";
// System.out.println(pathPrefix + reportName + "." + format);
for (Object o : reportName.entrySet()) {
Map.Entry<String, String> m = (Map.Entry<String, String>)o;
//logger.info("email-" + m.getKey() + ":" + m.getValue());
String key = m.getKey();
String value = m.getValue();
String[] list = key.split(",");
for (int i = 0; i < list.length; i++) {
String end = ".rptdesign";
design = engine.openReportDesign(prefix + list[i] + end); // 打开这个已经写好的报表文件
task = engine.createRunAndRenderTask(design);
task.setParameterValue("name", "china");
System.out.println(list[i]);
options.setOutputFileName(pathPrefix + list[i] + "."
+ value); // 设置生成的pdf名称,动态的。
options.setOutputFormat(value);
task.setRenderOption(options);
task.run();
}
}
System.out.println("succuess");
closeReport(task, engine);
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.导出pdf是没有问题的,导出xls如果包含图片就看不到图片,现在还没有解决
java mail发送附件的方法:
public class SendMail {
public SendMail(String title, String from, String[] sendTo,String content, String[] fileNames){
try {
// MailSender mailsender = new MailSender();
sendmail(title, from, sendTo, content, fileNames,
"text/html;charset=utf-8");
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void sendmail(String subject, String from, String[] to,
String text, String[] filenames, String mimeType) throws Exception {
// ResourceBundle mailProps = ResourceBundle.getBundle("mail");
// 可以从配置文件读取相应的参数
Properties props = new Properties();
String smtp = "smtp.163.com"; // 设置发送邮件所用到的smtp
String servername = "******@163.com";
String serverpaswd = "***********";
javax.mail.Session mailSession; // 邮件会话对象
javax.mail.internet.MimeMessage mimeMsg; // MIME邮件对象
props = java.lang.System.getProperties(); // 获得系统属性对象
props.put("mail.smtp.host", smtp); // 设置SMTP主机
props.put("mail.smtp.auth", "true"); // 是否到服务器用户名和密码验证
// 到服务器验证发送的用户名和密码是否正确
EmailAutherticatorbean myEmailAuther = new EmailAutherticatorbean(
servername, serverpaswd);
// 设置邮件会话
mailSession = javax.mail.Session.getInstance(props,
(Authenticator) myEmailAuther);
// 设置传输协议
javax.mail.Transport transport = mailSession.getTransport("smtp");
// 设置from、to等信息
mimeMsg = new javax.mail.internet.MimeMessage(mailSession);
if (!StringUtils.isEmpty(from)) {
InternetAddress sentFrom = new InternetAddress(from);
mimeMsg.setFrom(sentFrom); // 设置发送人地址
}
InternetAddress[] sendTo = new InternetAddress[to.length];
for (int i = 0; i < to.length; i++) {
System.out.println("发送到:" + to[i]);
sendTo[i] = new InternetAddress(to[i]);
}
mimeMsg.setRecipients(javax.mail.internet.MimeMessage.RecipientType.TO,
sendTo);
mimeMsg.setSubject(subject, "gb2312");
MimeBodyPart messageBodyPart1 = new MimeBodyPart();
// messageBodyPart.setText(UnicodeToChinese(text));
messageBodyPart1.setContent(text, mimeType);
Multipart multipart = new MimeMultipart();// 附件传输格式
multipart.addBodyPart(messageBodyPart1);
for (int i = 0; i < filenames.length; i++) {
MimeBodyPart messageBodyPart2 = new MimeBodyPart();
// 选择出每一个附件名
String filename = filenames[i].split(",")[0];
System.out.println("附件名:" + filename);
String displayname = filenames[i].split(",")[1];
// 得到数据源
FileDataSource fds = new FileDataSource(filename);
// 得到附件本身并至入BodyPart
messageBodyPart2.setDataHandler(new DataHandler(fds));
// 得到文件名同样至入BodyPart
// messageBodyPart2.setFileName(displayname);
// messageBodyPart2.setFileName(fds.getName());
messageBodyPart2.setFileName(MimeUtility.encodeText(displayname));
multipart.addBodyPart(messageBodyPart2);
}
mimeMsg.setContent(multipart);
// 设置信件头的发送日期
mimeMsg.setSentDate(new Date());
mimeMsg.saveChanges();
// 发送邮件
transport.send(mimeMsg);
transport.close();
}
}
还有个辅助类
public class EmailAutherticatorbean extends Authenticator {
private String m_username = null;
private String m_userpass = null;
public void setUsername(String username) {
m_username = username;
}
public void setUserpass(String userpass) {
m_userpass = userpass;
}
public EmailAutherticatorbean(String username, String userpass) {
super();
setUsername(username);
setUserpass(userpass);
}
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(m_username, m_userpass);
}
}
这样就实现了报表附件的发送!
birt报表开发:
现在还在继续中,只做了几张,不过有写问题解决还是靠 ‘呼唤’大哥的帮忙
http://www.birthome.cn上有很多教程,做报表可以学习很多,如果碰到问题提问,呼唤会第一时间回答你的!差不多了,现在想到的就这么多以后补
分享到:
相关推荐
【描述】"项目总结报告" 指出这是一份对某个IT项目进行全面回顾和分析的文件,旨在总结项目从启动到结束的全过程,包括目标设定、团队协作、技术实施、问题解决、项目管理等方面的情况。 【标签】"final_project ...
5. **项目关闭**:正式通知所有相关人员项目结束,更新组织过程资产。 这些IT项目管理表格通常包括但不限于项目启动文档、需求文档、计划表、进度报告、变更请求表、风险管理表、质量检查表和项目总结报告等。有效...
IT项目管理是信息技术行业中至关重要的一个领域,它涵盖了规划、执行、监控以及结束项目的一系列过程,以确保项目能够按时、按预算、按质量完成。本资料包“IT项目管理表格大全”提供了一系列全面的工具,帮助项目...
以下是关于这个项目的一些关键知识点: 1. **基本概念** - **Java基础**:本项目的基础是Java编程语言,因此需要掌握Java的基本语法、面向对象编程(OOP)以及异常处理等核心概念。 - **图形用户界面(GUI)**:...
【项目管理】 项目管理是一门综合性的...以上就是项目管理作业中涉及的一些核心概念和知识点,它们涵盖了成本管理、沟通管理、风险管理、采购管理、合同管理等多个领域。理解并掌握这些知识对于成功管理项目至关重要。
- **结论与展望**:总结项目成果,对未来可能的改进方向进行展望。 这个项目不仅提供了实践机会,也是深入学习Java编程和软件工程的宝贵资料。通过分析和修改源码,学生能够进一步提升编程能力,了解游戏开发的...
本文讨论了项目教学法在机械CAD教学改革中的具体应用,并提出了一些实施建议。 一、项目教学法的主要特点 项目教学法的核心是项目,它通过将教学内容划分为多个模块,组织学生围绕实际项目进行合作学习。这种方法...
在这个项目中,我们可能用到了单片机或者微控制器作为核心处理单元,通过连接多个开关到其输入引脚,实现对多盏灯的控制。每个开关的闭合或断开会产生一个中断请求,CPU接收到请求后,根据中断向量找到对应的中断...
项目管理是组织、规划、执行和控制任何有明确目标的临时性工作的过程,通常在商业、工程或技术领域中应用广泛。"项目管理五阶段"指的是项目的生命周期,它包括启动、规划、执行、监控和收尾五个关键阶段。这个压缩包...
例如,启动过程组中的关键输入是商业论证和批准的项目章程,输出是初步的项目范围说明书,而可能用到的工具技术包括专家判断和会议等。 备考PMP时,4~13章是核心章节,涵盖了十大知识领域的主要内容,如: 1. 整合...
项目结束后,进行总结与评估,评价项目绩效,为未来项目提供参考。主要成果为: - **项目回顾会议**:分析项目执行过程中的得失,总结经验教训。 - **绩效考核**:评估项目成员的表现,激励团队成长。 #### 七、...
施工过程中,需要用到铅笔、卷尺、水平尺等测量工具,以及手锤、剥线钳、电钻等安装工具。 四、质量要求 根据《建筑电气工程施工质量验收规范》(GB50303-2002),对高压开关柜、低压成套柜和照明配电箱的质量控制有...
3. **关键技术**:解释选用的特定技术和工具,并说明其在项目中的作用。 4. **实现过程**:步骤分解,展示如何从零开始构建系统。 5. **性能测试与优化**:通过压力测试分析系统性能,并提出优化方案。 6. **项目...
总结来说,"基于PHP的新版渠成项目管理系统Alpha1.zip"代表了一个使用PHP技术开发的项目管理应用的早期版本,涵盖了项目管理的多种功能,并且依赖于成熟的PHP框架和Web开发技术。对于开发者来说,理解和掌握这些技术...
为避免沟通误解,计划书中需列出项目中可能用到的专业术语和缩写词,确保所有相关人员对这些词汇有共同的理解。 #### 1.4 参考资料 列举参考文献、类似项目案例或相关标准,以支持项目计划的制定,确保其科学性和...
- **定义**:列出项目中可能用到的专业术语和缩写,避免沟通中的误解。 - **参考资料**:列出用于编写计划书的参考文献、研究数据和其他相关资料,为读者提供更深入的背景信息。 2. **项目概述** - **工作内容**...
在本项目“射击弹球小游戏”中,开发者通过实践学习并掌握了多项重要的IT技术与编程概念,这将有助于深入理解游戏开发的过程以及软件工程的基本原理。以下是对该项目中涉及的知识点的详细阐述: 1. **游戏引擎基础*...
总结性报告通常在项目结束后编写,回顾项目的全过程,总结经验教训,为未来的项目提供参考。 可行性报告是在项目启动前进行的一项研究,评估项目的经济、技术、法律和社会可行性,决定项目是否值得投资和实施。 ...
10. **后期总结**:活动结束后,对项目执行情况进行复盘,总结经验教训,为未来类似项目提供参考。 通过《天猫双11项目组织协同.pptx》这份文件,我们可以更深入地了解这些环节的具体操作和执行细节,从而提升在...
项目采购管理过程中会用到各种工具和技术来支持上述活动的进行,包括但不限于: - **市场调研工具**:帮助了解市场状况,识别潜在供应商。 - **合同管理软件**:用于管理合同的生命周期,包括起草、审批、执行和...