项目快结束了,总结一下项目中用到的一些技术(二)

由于需求是要求发送附件到邮箱,可以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报表开发:
现在还在继续中,只做了几张,不过有写问题解决还是靠 ‘呼唤’大哥的帮忙
[url]http://www.birthome.cn[/url]上有很多教程,做报表可以学习很多,如果碰到问题提问,呼唤会第一时间回答你的!差不多了,现在想到的就这么多以后补
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值