zsww-成功源于创新!

水晶报表使用经验谈1--建立水晶报表第一步及编译最易出现错误的解决方法及报表转换成pdf文档进行打印方法

初用水晶报表(vs .net2003集成,版本Version=9.1.5000.0)
装好后要注册 注册号:6707437608 密码:AAP5GKS0000GDE100DS


想要在.aspx文件中使用水晶报表
1.先新建文件webform1.aspx 在页面拖入组件CrystalReportViewer 生成代码

2.在项目的同个文件夹中新建文件crystalreport1.rpt? 在字段资源管理器的数据库字段“添加数据库” 请使用oledb连接 从而选择你所要在报表中显示的数据表(有向导)

3.在webform1.aspx.cs主要代码如下:
protected CrystalDecisions.Web.CrystalReportViewer CrystalReportViewer1;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
TableLogOnInfo logOnInfo = new TableLogOnInfo ();
ReportDocument oRpt = new ReportDocument();
string RptDir="f:\\bbs\\test\\crystal\\crystalreport1.rpt"; //crystalreport1.rpt文件所在的绝对路径
oRpt.Load(RptDir);

//设置logOnInfo参数,注意这里如果不设?编译时最容易出现“登陆失败”的错误!
logOnInfo.ConnectionInfo.ServerName = "服务器名";
logOnInfo.ConnectionInfo.DatabaseName = "数据库名";
logOnInfo.ConnectionInfo.UserID = "用户名";
logOnInfo.ConnectionInfo.Password = "密码";
oRpt.Database.Tables [0].ApplyLogOnInfo(logOnInfo);

//建立.rpt文件与CryStalReportviewer文件之间的连接
CrystalReportViewer1.ReportSource=oRpt;
}

4.//生成pdf文档 在以上代码中加入
 ExportOptions crExportOptions=new ExportOptions();
DiskFileDestinationOptions crDiskFileDestinationOptions=new DiskFileDestinationOptions();
crDiskFileDestinationOptions.DiskFileName="f:\\bbs\\test\\crystal\\crystalreport1.pdf";
crExportOptions=oRpt.ExportOptions ;
crExportOptions.DestinationOptions=crDiskFileDestinationOptions;
crExportOptions.ExportDestinationType =ExportDestinationType.DiskFile;
crExportOptions.ExportFormatType =ExportFormatType.PortableDocFormat ;

oRpt.Export();
oRpt.Close();

5.//读取报表导出的内容并传到客户端?继续加入以下代码
Response.ClearContent();
Response.ClearHeaders ();
Response.ContentType ="application/pdf";
Response.WriteFile("f:\\bbs\\test\\crystal\\crystalreport1.pdf");

Response.Flush();
Response.Close();?
 
以上完全是个人使用总结 如有不对或可以改进的地方 请大家指正!!!

posted on 2004-02-04 11:00 zsww 阅读(12068) 评论(27)  编辑 收藏 网摘 所属分类: .NET - CrystalReport

评论

#1楼  2004-02-16 18:20 初学者 [未注册用户]

请问在生成pdf文档之前,如何传参数?   回复  引用    

#2楼  2004-02-17 08:33 zsww [未注册用户]

请问你要传递何种参数 简单说明一下!   回复  引用    

#3楼  2004-03-30 14:20 spy7 [未注册用户]

为何用“5.//读取报表导出的内容并传到客户端?”代码在win98+adobe reader5.0中有时会出现“文件不已%pdf-开头”提示,以至无法显示情况,如何解决??   回复  引用    

#4楼  2004-09-09 17:58 linda [未注册用户]

为何我设了logoninfo信息,还是提示登录失败,我的数据库和应用不是在同一台机器上的   回复  引用    

#5楼  2004-11-04 21:24 workhyj@163.com [未注册用户]

是呀,我也是这样,不知要怎么解决!!!!!!!


快要死了!!!!!!!!

有没有谁出来帮忙呢?   回复  引用    

#6楼  2004-11-20 14:04 礼貌 [未注册用户]

编译器错误信息: CS1595: 已在多处定义“CrystalDecisions.Web.CrystalReportViewer”;使用“c:\WINNT\assembly\GAC\CrystalDecisions.Web\9.1.5000.0__692fbea5521e1304\CrystalDecisions.Web.dll”中的定义
  回复  引用    

#7楼  2004-11-30 14:36 javasion [未注册用户]

请部我下载保存的时候不是××.Pdf而是所点击页面的网页名称呢(DD.ASPX)   回复  引用    

#8楼  2005-01-13 20:18 1097 [未注册用户]

response.write的方法,既然这么使用,那么是否类似从datagrid导为excel文件呢。
前面的代码应该是可以节省的   回复  引用    

#9楼  2005-02-17 14:29 城 [未注册用户]

在老大哥   回复  引用    

#10楼  2005-02-22 09:00 刘 [未注册用户]

我的代码也是这样。但是不知道为什么在执行
oRpt.Export();时出错。提示信息如下:
拒绝访问报表文件。其他程序可能正在使用它。


为什么?请求帮助
Msn:jiandwish@hotmail.com   回复  引用    

#11楼  2005-02-25 09:26 r [未注册用户]

oRpt.Export();时出错。提示信息如下:
拒绝访问报表文件。其他程序可能正在使用它   回复  引用    

#12楼  2005-03-16 13:26 liuyihua [未注册用户]

你的文件夹要设置可以访问哦!要可以写入哦!

要设置文件夹,知道吗?   回复  引用    

#13楼  2005-03-18 10:52 QQ [未注册用户]

我的水晶报表需要使用多个ODBC数据库产生报表,这些数据库都连接在一个access数据库中,但自从这些ODBC数据库更换系统后,原来可以通过webserver产生的报表不能运行了,请问这是什么原因? 我是着修改了crystal report 中的数据源位置,在crystal report中可以得到数据报表,不过无法通过ASP program 产生。谁可以帮助?
多谢了!   回复  引用    

#14楼  2005-05-11 18:25 小Q [未注册用户]

不好意思!我是新手,版主可不可以提供vb和水晶报表导出功能的示例代码?急着想要,谢谢了!   回复  引用    

#15楼  2005-05-27 16:29 股东风非国大 [未注册用户]

文件 D:\Inetpub\wwwroot\fjoil\ssl\rep\certificate_crpt.rpt 内出错:尚未执行操作。   回复  引用    

#16楼  2005-05-27 16:34 恶热发+ [未注册用户]

文件 D:\Inetpub\wwwroot\fjoil\ssl\rep\certificate_crpt.rpt 内出错:导出 DLL: 检测到错误
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: CrystalDecisions.CrystalReports.Engine.ExportException: 文件 D:\Inetpub\wwwroot\fjoil\ssl\rep\certificate_crpt.rpt 内出错:导出 DLL: 检测到错误
  回复  引用    

#17楼  2005-06-11 16:27 阿 [未注册用户]

{"文件 C:\\DOCUME~1\\LINGZH~1\\ASPNET\\LOCALS~1\\Temp\\temp_41e7086b-939f-4876-9a79-c06e7167d58d.rpt 内出错:\n拒绝访问报表文件。其他程序可能正在使用它。" }
我在 到处报表的时候出现了这样的问题,我运行了 OB公司的例子 也是这个问题 ,不知道该如何解决 ;
我的联系方式 QQ:47307116
Email:liuchengit@163.com
希望 各位能帮我解决 这个问题 。   回复  引用    

#18楼  2005-06-23 09:01 bigyyk [未注册用户]

如何把2张报表输出到1个pdf文件中呢, 期待高手们的回答   回复  引用    

#19楼  2005-09-02 21:09 Fico [未注册用户]

报表增加参数字段后设定参数后可以显示,倒出时PDF时出错:

丢失参数字段当前值。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: CrystalDecisions.CrystalReports.Engine.ParameterFieldCurrentValueException: 丢失参数字段当前值。

源错误:


行 138: crExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat;
行 139:
行 140: oRpt.Export();
行 141: oRpt.Close();
行 142:
  回复  引用    

#20楼  2005-11-08 22:25 黄剑锋 [未注册用户]

rpt 内出错:拒绝访问报表文件。其他程序可能正在使用它。
在自己机器上可以用.放到别的机器上就不可以用了.   回复  引用    

#21楼  2005-11-08 22:27 黄剑锋 [未注册用户]

rpt 内出错:拒绝访问报表文件。其他程序可能正在使用它。
在自己机器上可以用.放到别的机器上就不可以用了.
而且在别的机器上.可以打开报表.就是导出时出现了上面那个错误.

我的QQ107681435
email hjflmzhu@126.com   回复  引用    

#22楼  2005-12-06 08:21 Andily [未注册用户]

請問,如何給導出報表指定位置。。急   回复  引用    

#23楼  2006-06-21 12:43 hellp [未注册用户]

我的出现以下错误,那位兄弟帮帮忙了。急啊
Server Error in '/Eform' Application.
--------------------------------------------------------------------------------

Error in File D:\Eform\PurchaseCry\PurCryKin.rpt: Access to report file denied. Another program may be using it.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: CrystalDecisions.CrystalReports.Engine.LoadSaveReportException: Error in File D:\Eform\PurchaseCry\PurCryKin.rpt: Access to report file denied. Another program may be using it.

Source Error:


Line 54: crExportOptions.ExportFormatType =ExportFormatType.PortableDocFormat ;
Line 55:
Line 56: oRpt.Export();
Line 57: oRpt.Close();

  回复  引用    

#24楼  2008-05-27 22:42 ddf [未注册用户]

花了两天时间,终于把jasperreport与项目中使用的hibernate结合使用.最新版本的ireport支持HQL查询,可以在 ireport里面写HQL语句查询并设计好报表.需要注意的是把hibernate.cfg.xml包括进classpath!!(菜单options ->classpath进行设置)给张图:




设计好报表之后编译成jasper文件,在servlet中调用,我们需要实现自己的hibernate datasource:

public class HibernateQueryResultDataSource implements JRDataSource {

private String[] fields;

private Iterator iterator;

private Object currentValue;

public HibernateQueryResultDataSource(List list, String[] fields) {
this.fields = fields;
this.iterator = list.iterator();
}

public Object getFieldValue(JRField field) throws JRException {
Object value = null;
int index = getFieldIndex(field.getName());
if (index > -1) {
Object[] values = (Object[]) currentValue;
value = values[index];
}
return value;
}

public boolean next() throws JRException {
currentValue = iterator.hasNext() ? iterator.next() : null;
return (currentValue != null);
}

private int getFieldIndex(String field) {
int index = -1;
for (int i = 0; i < fields.length; i++) {
if (fields[i].equals(field)) {
index = i;
break;
}
}
return index;
}

}

此类构造函数需要两个参数,查询结果的list以及查询的所有属性名(这些属性名必须和报表界面的field名一致)

,使用方式如下:

1.导出pdf:

File reportFile = new File(getServletContext().getRealPath(
"/reports/" + queryResult.getReportFileName() + ".jasper"));

HibernateQueryResultDataSource dataSource = new HibernateQueryResultDataSource(
queryResult.getList(parameters), queryResult.getFields());
if (reportType.equals("pdf") || reportType.equals("")) {
try {
byte[] bytes = JasperRunManager.runReportToPdf(reportFile
.getPath(), null, dataSource);
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();

} catch (Exception e) {
e.printStackTrace();
}
}

2.导出excel,需要把poi-2.0-final-20040126.jar放进web的lib里:

try {

JasperPrint print = JasperFillManager.fillReport(
new FileInputStream(reportFile), null, dataSource);
// JRXlsExporter t=null;
JRXlsExporter jRXlsExporter = new JRXlsExporter();
ByteArrayOutputStream xlsReport = new ByteArrayOutputStream();
jRXlsExporter.setParameter(JRExporterParameter.JASPER_PRINT,
print);
jRXlsExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
xlsReport);
jRXlsExporter
.setParameter(
JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,
Boolean.TRUE);
jRXlsExporter.setParameter(
JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,
Boolean.TRUE);
// jRXlsExporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,ReportsConstants.bankDetailsHtml);

// jRXlsExporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,
// Boolean.TRUE);

jRXlsExporter.exportReport();
byte[] bytes = xlsReport.toByteArray();


response.setContentType("application/vnd.ms-excel");
response.setContentLength(bytes.length);
xlsReport.close();
OutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();

} catch (Exception e) {
e.printStackTrace();
}

  回复  引用    

#25楼  2008-06-17 23:23 7907 [未注册用户]

XFire提供了四种身份验证的方式,分别是http验证,JSR181,Handler验证,WS-Security。

SOAP的原理告诉我们一个WS交互的流程是客户端发送请求->服务器接收请求->服务器发送数据->客户

端接收数据,handler可以让我们在这四个操作中之前进行编码,所以,我们的验证进行在客户端发送请

求和服务器接收请求的时候,因此,我们要写两个handler,然后把它们装配上就可以了。

Handler验证方式如下:

主要参考的实例是XFIREdemo中的BOOK

服务器的代码如下

package com.nstar.xfire.auth;

import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.XFireRuntimeException;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;
import org.jdom.Namespace;

public class XfireAuthenticationHandler extends AbstractHandler {
private static final String USERNAME = "biansutao";
private static final String PASSWORD = "12345678";
private static final String NS = "http://xfire.codehaus.org/biansutao";

public void invoke(MessageContext ctx) throws Exception {
// Check if header exists

Element header = ctx.getInMessage().getHeader();
if (header == null) {
throw new XFireRuntimeException("Missing SOAP Header");
}
// Does it have version tag
Element name = header.getChild("USERNAME",Namespace.getNamespace(NS));
Element pass = header.getChild("PASSWORD",Namespace.getNamespace(NS));
if(name.getValue().equals(USERNAME) && pass.getValue().equals(PASSWORD)){
System.out.println("验证通过");
}
else{
System.out.println("验证未通过");
throw new XFireRuntimeException("Authentication Failure");
}
ctx.setProperty("USERNAME", USERNAME);
ctx.setProperty("PASSWORD", PASSWORD);
}
}

然后需要在services.xml中配置如下:

xml 代码

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>HelloWordService</name>
<serviceClass>com.nstar.xfire.IHelloWordService</serviceClass>
<implementationClass>
com.nstar.xfire.HelloWordServiceImpl
</implementationClass>
<style>wrapped</style>
<use>literal</use>
<scope>application</scope>
<inHandlers>
<handler handlerClass="com.nstar.xfire.auth.XfireAuthenticationHandler"></handler>
</inHandlers>
</service>
</beans>


客户端代码

package com.nstar.xfire.client.auth;

import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;

public class ClientHeaderHandler extends AbstractHandler {
//用户验证
private static final String USERNAME = "biansutao";
private static final String PASSWORD = "12345678";
private static final String NS = "http://xfire.codehaus.org/biansutao";
public void invoke(MessageContext ctx) throws Exception {
Element header = ctx.getOutMessage().getOrCreateHeader();
header.addContent(new Element("USERNAME",NS).addContent(USERNAME));
header.addContent(new Element("PASSWORD",NS).addContent(PASSWORD));
}

}



package com.nstar.xfire.client;

import java.util.List;
import java.lang.reflect.Proxy;
import java.net.MalformedURLException;
import java.util.ArrayList;

import org.codehaus.xfire.*;
import org.codehaus.xfire.client.Client;
import org.codehaus.xfire.client.XFireProxy;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import com.nstar.xfire.IHelloWordService;
import com.nstar.xfire.Student;
import com.nstar.xfire.client.auth.ClientHeaderHandler;

public class HelloWorldClient {

/**
* @param args
*/
public static void main(String[] args) {
Service serviceModel = new ObjectServiceFactory().create(IHelloWordService.class);
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
String url = "http://10.232.75.61:8090/Xfire/services/HelloWordService";
try {
IHelloWordService service = (IHelloWordService) factory.create(serviceModel, url);

XFireProxy proxy = (XFireProxy)Proxy.getInvocationHandler(service);
Client client = proxy.getClient();
client.addOutHandler(new ClientHeaderHandler());

List list = new ArrayList();
List list1 = new ArrayList();
list.add(new String("测试"));
int age = service.getAge("边苏涛");
String name = service.getName(1);
Student s = service.getOneStudent(27);
list1 = service.getStudent(list);
System.out.println("边苏涛's age =="+age);
System.out.println("学号为1的学生姓名 "+name);
System.out.println("age == "+s.getAge()+" name == "+s.getName()+" list content

"+s.getList().get(0).toString());
System.out.println(list1.size());
for(int i=0;i<list1.size();i++){
System.out.println(list1.get(i).toString());
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}






  回复  引用    

#26楼  2008-06-17 23:26 7907 [未注册用户]

http://www.51cto.com/art/200607/29265.htm   回复  引用    

#27楼  2008-09-02 17:59 像蚊子的小猫 [未注册用户]

导出 DLL: 检测到错误
怎么回事呀?   回复  引用    





标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-03-21 10:58 编辑过
Google站内搜索

相关文章:

相关链接:
 

<2008年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

导航

统计

公告

目前主要学习应用:


Counters
Counters

与我联系

搜索

 

常用链接

留言簿(14)

随笔分类

随笔档案

收藏夹

经常光顾的@Blog

友情@Blog

最新评论

阅读排行榜

评论排行榜