当前位置:文档之家› JasperReport报表设计总结

JasperReport报表设计总结

JasperReport报表设计总结
JasperReport报表设计总结

为了开发报表,已经拜读了一大堆的资料,其中大部分是重复的。可以看得出,国人还是比较热衷于copy&paste的工作。所以找了一大堆的资料都是相同的,或者可以用一个词来形容,换汤不换药的。

有必要对于jasper Report的学习进度进行一下总结,一来可以更新一下以前的资料中的一些旧得不能再旧的不再适用的东西,二来让后来者可以轻松的上手。首先,jasperReport是一个以java实现的报表工具,(好像是句废话)。可以实现多种格式的报表。

再我们先理解一下jasperReport的实现过程。笔者不再画图,网上到处都是。1)定制报表格式。

有二种方式,一种就是写jrxml文件,其实就是xml文件,只不过是后缀名不一样罢了。另一种方式更直接,就是生成一个JasperDesign类的实例,在japsperDesign中自己定义模板。jrxml文件也是通过一个JRXmlLoad加载过来,转成JasperDesign类的实例。也就是说写jrxml文件还需要进行解析,加载。现实中我们使用的报表一般格式比较固定,因而可以通过先使用iReport工具生成模板,再加载解析的方式。这种方式简单,而且可见性强。

2)填充数据。

在最新版(2007.4.30发布)的jasperReports1.3.3中,支持了很多的格式,包括了对于Hibernate的支持。填充数据对于我们经常使用的来说,一般是二种方式,一种方式是通过JDBC连接提供数据源,一种就是通过javaBean的集合提供数据源。当然还有web Service的xml文件提供的。我的建议是,如果你的程序中的统计直接使用Jdbc就可以完成,那么就使用jdbc数据源的方法,反之,使用javaBean的集合是不错的选择,因为这样不会在意你的数据的来源,你也可以任意处理,比如说,要通过权限检查的数据才在报表中生成的话,就可以过滤到不符合权限的数据。

3)显示或打印。

显示,即将JasperReport生成的文件直接显示出来,打印所使用的方式其实就是生成文件,然后调用打印来对文件进行打印。

看起来是不是很简单,对,确实很简单。

笔者主要从事基于B/S模式的开发,相信大部分人的使用也是基于web进行使用。故笔者对于基于web的开发进行详细讲述。

1、工程环境配置。

将以下包加入WEB-INF/lib中。

commons-beanutils-1.7.jar;commons-collections-2.1.jar;commons-digeste r-1.7.jar;commons-logging-1.0.2.jar;commons-logging-api-1.0.2.jar;ite xt-1.3.1.jar;jasperreports-1.3.3.jar;jdt-compiler-3.1.1.jar;jxl-2.6.j ar;png-encoder-1.5.jar;poi-2.0-final-20040126.jar

以上包是jasperReport必须。

2、iReport的安装

这个很简单,直接下一步就可以了。

3、使用iReport生成 .jasper文件

.jasper是经过编译的japserReport模板,即.jrxml编译后的。

对于iReport的使用网络上已经有了详细的中文的文档,具体可以下载附件查看。使用.jasper文件可以避免在系统中再进行编译,增加系统的压力。

4、数据填充

数据填充是相对于比较重要的一步,数据填充的目的是为了将数据填充进去,生成一个JapserPrint对象。笔者在之前已经阐述过,现在主要是基于关系型数据库(比较简单的,没有权限控制的),以及基于JavaBean Collection进行数据填充。进行数据填充的基本就是一定要实现JRDataSource,JRDataSource定义了二个方法,一个是指针移动的方法next(),另一个是取值的getFieldValue ()方法,用来取值填充。

对于关系型数据库,即直接利用数据库的表来生成报表的,只需要传入一个Java Connection即可。JasperReport已经有了个默认的实现的JRDataSource的接口了。对于Java Conncetion的获得,笔者建议使用工厂方法或者使用Spring方式来获得。可以参照笔者写的如下:

java 代码

1./**

2. * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd.

3. * @author Jimmy.Shine 2007-5-11

4. */

5.package https://www.doczj.com/doc/8111037602.html,.reachway.framework.report;

6.

7.import java.sql.Connection;

8.import java.sql.DriverManager;

9.

10.import https://www.doczj.com/doc/8111037602.html,.reachway.framework.exception.JasperReportExceptio

n;

11.

12./**

13. * Used for get a JDBC connection for Jasper Report

14. */

15.public class JDBCConnection {

16. /**

17. * Which Jdbc driver were used. Like: "net.sourceforge.jtds.jd

bc.Driver"

18. */

19. private String jdbcDriver;

20. /**

21. * The jdbc url,define which database server,which db. Like:

22. * "jdbc:jtds:sqlserver://192.168.1.50:1433;DatabaseName=JAVA5

;SelectMethod=Cursor"

23. */

24. private String jdbcUrl;

25.

26. private String dbUser;

27.

28. private String dbPassword;

29.

30. public String getDbPassword() {

31. return dbPassword;

32. }

33.

34. public void setDbPassword(String dbPassword) {

35. this.dbPassword = dbPassword;

36. }

37.

38. public String getDbUser() {

39. return dbUser;

40. }

41.

42. public void setDbUser(String dbUser) {

43. this.dbUser = dbUser;

44. }

45.

46. public String getJdbcDriver() {

47. return jdbcDriver;

48. }

49.

50. public void setJdbcDriver(String jdbcDriver) {

51. this.jdbcDriver = jdbcDriver;

52. }

53.

54. public String getJdbcUrl() {

55. return jdbcUrl;

56. }

57.

58. public void setJdbcUrl(String jdbcUrl) {

59. this.jdbcUrl = jdbcUrl;

60. }

61.

62. public JDBCConnection() {

63. super();

64. }

65. /**

66. * Get the Connection

67. * @return connection

68. * @throws JasperReportException

69. */

70. public Connection getConnection() throws JasperReportException

{

71. Connection con;

72. try {

73. check();

74. Class.forName(this.jdbcDriver);

75. con = DriverManager.getConnection(this.jdbcUrl, this.dbUser,

this.dbPassword);

76. return con;

77. } catch (Exception e) {

78. e.printStackTrace();

79. throw new JasperReportException("Get JDBC Connection Error")

;

80. }

81. }

82.

83. /**

84. * Check the Configure

85. * @throws JasperReportException

86. */

87. private void check() throws JasperReportException {

88. if (this.jdbcDriver == null || this.jdbcDriver.equals("") ||

this.jdbcUrl == null || this.jdbcUrl.equals("")

89. || this.dbUser == null || this.dbUser.equals("") || this.db

Password == null) {

90. throw new JasperReportException("Jdbc Configure error!");

91. }

92. }

93.

94.}

95.

java 代码

1./**

2. * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd.

3. * @author Jimmy.Shine 2007-5-14

4. */

5.package https://www.doczj.com/doc/8111037602.html,.reachway.framework.report.dataSource;

6.

7.import net.sf.jasperreports.engine.JRDataSource;

8.import net.sf.jasperreports.engine.JRException;

9.import net.sf.jasperreports.engine.JRField;

10.

11./**

12. * 报表的dataSource的基类,所有利用DataSource产生报表的继承此

13. */

14.public abstract class ReportDataSource implements JRDataSource

{

15.

16. /**

17. * 取值

18. */

19. public abstract Object getFieldValue(JRField jrField) throws J

RException;

20.

21. /**

22. * 指针移动

23. */

24. public abstract boolean next() throws JRException;

25.

26.}

27.

这样可以共用配置文件中的jdbc连接的相关参数。

对于其它的数据源,JavaBean Collection,笔者采用了一个抽象类,使用抽象类的目的,是为了使开发者尽可能不用直接接触jasperReport(此为笔者自己的方式,笔者是PM,为了考虑底下的人的开发)。以下为抽象类以及笔者提供的一个sample:

1./**

2. * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd.

3. * @author Jimmy.Shine 2007-5-14

4. */

5.package https://www.doczj.com/doc/8111037602.html,.reachway.framework.report.dataSource;

6.

7.import java.util.ArrayList;

8.import java.util.List;

9.

10.import net.sf.jasperreports.engine.JRException;

11.import net.sf.jasperreports.engine.JRField;

12.

13./**

14. * 利用JavaBean Collection生成ReportDataSource的例子

16.public class ReportDataSourceSample extends ReportDataSource {

17.

18. private List docs = new ArrayList();

19.

20. private int index = -1;

21.

22. public ReportDataSourceSample() {

23. for (int i = 0; i < 10; i++) {

24. Document doc = new Document("ViewTimes is:" + i, i);

25. this.docs.add(doc);

26. }

27. }

28.

29. // 内部类,作为demo时使用

30. private class Document {

31. private String name;

32.

33. private int viewTimes;

34.

35. public String getName() {

36. return name;

37. }

38.

39. public void setName(String name) {

40. https://www.doczj.com/doc/8111037602.html, = name;

41. }

42.

43. public int getViewTimes() {

44. return viewTimes;

45. }

46.

47. public void setViewTimes(int viewTimes) {

48. this.viewTimes = viewTimes;

49. }

50.

51. public Document() {

52. }

53.

54. public Document(String name, int viewTimes) {

55. https://www.doczj.com/doc/8111037602.html, = name;

56. this.viewTimes = viewTimes;

57. }

59.

60. public List getDocs() {

61. return docs;

62. }

63.

64. public void setDocs(List docs) {

65. this.docs = docs;

66. }

67.

68. @Override

69. public Object getFieldValue(JRField jrField) throws JRExceptio

n {

70.

71. String fieldName = jrField.getName();

72. Document doc = this.docs.get(index);

73. if ("name".equals(fieldName)) {

74. return doc.getName();

75. }

76. if ("viewTimes".equals(fieldName)) {

77. return doc.getViewTimes();

78. }

79. return null;

80. }

81.

82. @Override

83. public boolean next() throws JRException {

84. index++;

85. return (index < this.docs.size());

86. }

87.}

88.

java 代码

以上的例子应当很清楚的写明了如何生成数据源。

对于数据源的填充,笔者使用了二个类,分别用来对应使用Connction及JavaBean Collection进行填充。

java 代码

1./**

2. * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd.

3. * @author Jimmy.Shine 2007-5-12

5.package https://www.doczj.com/doc/8111037602.html,.reachway.framework.report.jasperPrint;

6.

7.import java.io.File;

8.import java.sql.Connection;

9.import java.util.Map;

10.

11.import net.sf.jasperreports.engine.JRException;

12.import net.sf.jasperreports.engine.JasperFillManager;

13.import net.sf.jasperreports.engine.JasperPrint;

14.import net.sf.jasperreports.engine.JasperReport;

15.import net.sf.jasperreports.engine.util.JRLoader;

16.import https://www.doczj.com/doc/8111037602.html,.reachway.framework.exception.JasperReportExceptio

n;

17.

18./**

19. * 使用报表模板及数据等来生成JapserPrint

20. */

21.public class JasperPrintWithConnection {

22. /** 传入的参数 */

23. private Map params;

24. /** 模板文件的地址 */

25. private String reportFilePath;

26. /** JDBC connection */

27. private Connection con;

28.

29. public Connection getCon() {

30. return con;

31. }

32.

33. public void setCon(Connection con) {

34. this.con = con;

35. }

36.

37. public Map getParams() {

38. return params;

39. }

40.

41. public void setParams(Map params) {

42. this.params = params;

43. }

44.

45. public String getReportFilePath() {

46. return reportFilePath;

48.

49. public void setReportFilePath(String reportFilePath) throws Ja

sperReportException {

50. if (reportFilePath == null || !reportFilePath.endsWith(".jasp

er"))

51. throw new JasperReportException("您传入的模板文件格式不对,请

传入以.jasper为后缀的文件!");

52. this.reportFilePath = reportFilePath;

53. }

54.

55. public JasperPrintWithConnection() {

56. super();

57. }

58.

59. public JasperPrintWithConnection(String reportFilePath, Map pa

rams, Connection con) throws JasperReportException {

60. if (reportFilePath == null || !reportFilePath.endsWith(".jasp

er"))

61. throw new JasperReportException("模板文件格式不对,请传入

以.jasper为后缀的文件!");

62. if (con == null)

63. throw new JasperReportException("Conncetion不应当为

null!");

64. this.setReportFilePath(reportFilePath);

65. this.setParams(params);

66. this.setCon(con);

67. }

68.

69. /**

70. * 取得JasperPrint

71. * @return

72. * @throws JasperReportException

73. */

74. public JasperPrint getJasperPrint() throws JasperReportExcepti

on {

75. File reportFile = new File(this.reportFilePath);

76. if (!reportFile.exists())

77. throw new JasperReportException("传入的模板文件不存在!");

78.

79. try {

80. // Load编译好的模板

81. JasperReport jasperReport = (JasperReport) JRLoader.loadObje

ct(reportFile.getPath());

82. // 进行数据填充

83. JasperPrint jasperPrint = JasperFillManager.fillReport(jaspe

rReport, this.params, this.con);

84. return jasperPrint;

85.

86. } catch (JRException jre) {

87. jre.printStackTrace();

88. throw new JasperReportException("在进行数据填充时发生了错误

中,请检查是否是数据库连接错误或者是用来填充的参数map有

误!");

89. }

90.

91. }

92.}

93.

1./**

2. * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd.

3. * @author Jimmy.Shine 2007-5-14

4. */

5.package https://www.doczj.com/doc/8111037602.html,.reachway.framework.report.jasperPrint;

6.

7.import java.io.File;

8.import java.util.Map;

9.

10.import net.sf.jasperreports.engine.JRDataSource;

11.import net.sf.jasperreports.engine.JRException;

12.import net.sf.jasperreports.engine.JasperFillManager;

13.import net.sf.jasperreports.engine.JasperPrint;

14.import net.sf.jasperreports.engine.JasperReport;

15.import net.sf.jasperreports.engine.util.JRLoader;

16.import https://www.doczj.com/doc/8111037602.html,.reachway.framework.exception.JasperReportExceptio

n;

17.

18./**

19. *

20. */

21.public class JasperPrintWithDataSource {

22. /** 传入的参数 */

23. private Map params;

24. /** 模板文件的地址 */

25. private String reportFilePath;

26. /** dataSrouce */

27. private JRDataSource dataSource;

28.

29. public JRDataSource getDataSource() {

30. return dataSource;

31. }

32.

33. public void setDataSource(JRDataSource dataSource) {

34. this.dataSource = dataSource;

35. }

36.

37. public Map getParams() {

38. return params;

39. }

40.

41. public void setParams(Map params) {

42. this.params = params;

43. }

44.

45. public String getReportFilePath() {

46. return reportFilePath;

47. }

48.

49. public void setReportFilePath(String reportFilePath) throws Ja

sperReportException {

50. if (reportFilePath == null || !reportFilePath.endsWith(".jasp

er"))

51. throw new JasperReportException("您传入的模板文件格式不对,请

传入以.jasper为后缀的文件!");

52. this.reportFilePath = reportFilePath;

53. }

54.

55. public JasperPrintWithDataSource() {

56. super();

57. }

58.

59. public JasperPrintWithDataSource(String reportFilePath, Map pa

rams, JRDataSource dataSource)

60. throws JasperReportException {

61. if (reportFilePath == null || !reportFilePath.endsWith(".jasp

er"))

62. throw new JasperReportException("模板文件格式不对,请传入

以.jasper为后缀的文件!");

63. if (dataSource == null)

64. throw new JasperReportException("DataSource不应当为

null!");

65. this.setReportFilePath(reportFilePath);

66. this.setParams(params);

67. this.setDataSource(dataSource);

68. }

69. /**

70. * 取得JasperPrint

71. * @return

72. * @throws JasperReportException

73. */

74. public JasperPrint getJasperPrint() throws JasperReportExcepti

on {

75. File reportFile = new File(this.reportFilePath);

76. if (!reportFile.exists())

77. throw new JasperReportException("传入的模板文件不存在!");

78.

79. try {

80. // Load编译好的模板

81. JasperReport jasperReport = (JasperReport) JRLoader.loadObje

ct(reportFile.getPath());

82. // 进行数据填充

83. JasperPrint jasperPrint = JasperFillManager.fillReport(jaspe

rReport, this.params, this.dataSource);

84. return jasperPrint;

85.

86. } catch (JRException jre) {

87. jre.printStackTrace();

88. throw new JasperReportException("在进行数据填充时发生了错误

中,请检查是否是数据库连接错误或者是用来填充的参数map有

误!");

89. }

90.

91. }

92.}

93.

java 代码

其中使用的JasperReportException为笔者定义的异常,用来统一处理报表异常。

5、报表产生

报表产生是程序中最终可见的一部分,在jasperReport的demo中,大部分中使用了jasperReport的net.sf.jasperreports.j2ee.servlets.*中的类来生成。

其实这也算是开源的产品的一个问题,其实jasperReport提供的report的工具,只能算是demo级别的,不能算是产品级别的。相信很多的朋友在使用的时候就碰上无法生成的问题。笔者在此基础上封装了一下。

java 代码

1./**

2. * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd.

3. * @author Jimmy.Shine 2007-5-12

4. */

5.package https://www.doczj.com/doc/8111037602.html,.reachway.framework.report.export;

6.

7.import java.io.IOException;

8.import java.io.PrintWriter;

9.import java.sql.Connection;

10.import java.util.Map;

11.

12.import javax.servlet.http.HttpServletRequest;

13.import javax.servlet.http.HttpServletResponse;

14.

15.import net.sf.jasperreports.engine.JRDataSource;

16.import net.sf.jasperreports.engine.JRExporterParameter;

17.import net.sf.jasperreports.engine.JasperPrint;

18.import net.sf.jasperreports.engine.export.JRHtmlExporter;

19.import net.sf.jasperreports.engine.export.JRHtmlExporterParamet

er;

20.import net.sf.jasperreports.j2ee.servlets.ImageServlet;

21.import https://www.doczj.com/doc/8111037602.html,.reachway.framework.exception.JasperReportExceptio

n;

22.import https://www.doczj.com/doc/8111037602.html,.reachway.framework.report.jasperPrint.JasperPrint

WithConnection;

23.import https://www.doczj.com/doc/8111037602.html,.reachway.framework.report.jasperPrint.JasperPrint

WithDataSource;

24.

25./**

26. * 利用报表生成HTML格式报表

27. */

28.public class HTMLExport {

29.

30. /**

31. * 导出报表

32. *

33. * @param request

34. * @param response

35. * @param reportFilePath

36. * @param params

37. * @param con

38. * @throws JasperReportException

39. */

40. public void export(HttpServletRequest request, HttpServletR

esponse response, String reportFilePath, Map params,

41. Connection con) throws JasperReportException {

42. try {

43. PrintWriter out = response.getWriter();

44. try {

45. response.setContentType("text/html;charset=UTF-

8");

46. JasperPrint jasperPrint = new JasperPrintWithCo

nnection(reportFilePath, params, con).getJasperPrint();

47. // 使用JRHtmlExproter导出Html格式

48. JRHtmlExporter exporter = new JRHtmlExporter();

49. request.getSession().setAttribute(ImageServlet.

DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);

50. exporter.setParameter(JRExporterParameter.JASPE

R_PRINT, jasperPrint);

51. exporter.setParameter(JRExporterParameter.OUTPU

T_WRITER, out);

52. exporter.setParameter(JRHtmlExporterParameter.I

MAGES_URI, "./servlets/image?image=");

53. exporter.setParameter(JRExporterParameter.CHARA

CTER_ENCODING, "UTF-8");

54. // 导出

55. exporter.exportReport();

56. } catch (Exception e) {

57. e.printStackTrace();

58. throw new JasperReportException("在导出Html格

式报表时发生错误!");

59. } finally {

60. if (out != null) {

61. try {

62. out.close();

63. } catch (Exception e) {

64. }

65. }

66. }

67. } catch (IOException ioe) {

68. ioe.printStackTrace();

69. throw new JasperReportException("从Response中取得

PrintWriter时发生错误!");

70. }

71. }

72.

73. /**

74. * 导出报表

75. *

76. * @param request

77. * @param response

78. * @param reportFilePath

79. * @param params

80. * @param dataSource

81. * @throws JasperReportException

82. */

83. public void export(HttpServletRequest request, HttpServletR

esponse response, String reportFilePath, Map params,

84. JRDataSource dataSource) throws JasperReportExcepti

on {

85. try {

86. PrintWriter out = response.getWriter();

87. try {

88. response.setContentType("text/html;charset=UTF-

8");

89. JasperPrint jasperPrint = new JasperPrintWithDa

taSource(reportFilePath, params, dataSource)

90. .getJasperPrint();

91. // 使用JRHtmlExproter导出Html格式

92. JRHtmlExporter exporter = new JRHtmlExporter();

93. request.getSession().setAttribute(ImageServlet.

DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);

94. exporter.setParameter(JRExporterParameter.JASPE

R_PRINT, jasperPrint);

95. exporter.setParameter(JRExporterParameter.OUTPU

T_WRITER, out);

96. exporter.setParameter(JRHtmlExporterParameter.I

MAGES_URI, "./servlets/image?image=");

97. exporter.setParameter(JRExporterParameter.CHARA

CTER_ENCODING, "UTF-8");

98. // 导出

99. exporter.exportReport();

100. } catch (Exception e) {

101. e.printStackTrace();

102. throw new JasperReportException("在导出Html格式报表时发生错误!");

103. } finally {

104. if (out != null) {

105. try {

106. out.close();

107. } catch (Exception e) {

108. }

109. }

110. }

111. } catch (IOException ioe) {

112. ioe.printStackTrace();

113. throw new JasperReportException("从Response中取得PrintWriter时发生错误!");

114. }

115. }

116.

117.}

Excel格式的:

java 代码

1./**

2. * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd.

3. * @author Jimmy.Shine 2007-5-13

4. */

5.package https://www.doczj.com/doc/8111037602.html,.reachway.framework.report.export;

6.

7.import java.io.IOException;

8.import java.io.OutputStream;

9.import https://www.doczj.com/doc/8111037602.html,.URLEncoder;

10.import java.sql.Connection;

11.import java.util.List;

12.import java.util.Map;

13.

14.import javax.servlet.http.HttpServletRequest;

15.import javax.servlet.http.HttpServletResponse;

16.

17.import net.sf.jasperreports.engine.JRDataSource;

18.import net.sf.jasperreports.engine.JRException;

19.import net.sf.jasperreports.engine.JRExporterParameter;

20.import net.sf.jasperreports.engine.JasperPrint;

21.import net.sf.jasperreports.engine.export.JRXlsAbstractExporter

;

22.import net.sf.jasperreports.engine.export.JRXlsAbstractExporter

Parameter;

23.import net.sf.jasperreports.j2ee.servlets.BaseHttpServlet;

24.import https://www.doczj.com/doc/8111037602.html,.reachway.framework.exception.JasperReportExceptio

n;

25.import https://www.doczj.com/doc/8111037602.html,.reachway.framework.report.jasperPrint.JasperPrint

WithConnection;

26.import https://www.doczj.com/doc/8111037602.html,.reachway.framework.report.jasperPrint.JasperPrint

WithDataSource;

27.

28./**

29. * 利用报表生成Xls的基类

30. */

31.public abstract class BaseExcelExport {

32. /**

33. * 导出报表

34. *

35. * @param request

36. * @param response

37. * @param reportFilePath

38. * @param params

39. * @param con

40. * @param fileName

41. * @throws JasperReportException

42. */

43. public void export(HttpServletRequest request, HttpServletR

esponse response, String reportFilePath, Map params,

44. Connection con, String fileName) throws JasperRepor

tException {

45. JasperPrint jasperPrint = new JasperPrintWithConnection

(reportFilePath, params, con).getJasperPrint();

46. // 将填充完的japserPrint放入session中。

47. request.getSession().setAttribute(BaseHttpServlet.DEFAU

LT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);

48. // 拿到japserPrintList

49. List jasperPrintList = BaseHttpServlet.getJasperPrintLi

st(request);

50. // 若没有JasperPrintList,则抛出异常

51. if (jasperPrintList == null) {

52. throw new JasperReportException("在Http Session中

没有找到JasperPrint List");

53. }

54. try {

55. OutputStream ouputStream = response.getOutputStream

();

56. try {

57.

58. response.setContentType("application/xls");

59. response.setCharacterEncoding("UTF-8");

60. if (fileName == null || fileName.equals(""))

61. response.setHeader("Content-Disposition", "

inline; filename=\"noTitle.xls\"");

62. else {

63. response.setHeader("Content-Disposition", "

inline; filename=\""

64. + URLEncoder.encode(fileName, "UTF-

8") + ".xls\"");

65.

66. }

67. // Xls格式的导出器 JRXlsAbstractExport

68. JRXlsAbstractExporter exporter = getXlsExporter

();

69.

70. // 在导出器中放入要导出的japserPrintList

71. exporter.setParameter(JRExporterParameter.JASPE

R_PRINT_LIST, jasperPrintList);

72.

73. exporter.setParameter(JRExporterParameter.OUTPU

T_STREAM, ouputStream);

74. // 设置Xls的属性

75. exporter.setParameter(JRXlsAbstractExporterPara

meter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);

76. exporter.setParameter(JRXlsAbstractExporterPara

meter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);

77. // 导出

78. exporter.exportReport();

79. } catch (JRException e) {

80. e.printStackTrace();

81. throw new JasperReportException("在生成XLS报表

时发生错误!");

82. }

83.

84. finally {

85. if (ouputStream != null) {

86. try {

87. ouputStream.close();

88. } catch (IOException ex) {

89. }

90. }

91. }

92. } catch (IOException ioe) {

93. ioe.printStackTrace();

94. throw new JasperReportException("从Response中取得

OutputStream时发生错误!");

95. }

96.

97. }

98.

99. /**

100. * 导出报表

101. *

102. * @param request

103. * @param response

104. * @param reportFilePath

105. * @param params

106. * @param dataSource

107. * @param fileName

108. * @throws JasperReportException

109. */

110. public void export(HttpServletRequest request, HttpSer vletResponse response, String reportFilePath, Map params, 111. JRDataSource dataSource, String fileName) thro ws JasperReportException {

112. JasperPrint jasperPrint = new JasperPrintWithDataS ource(reportFilePath, params, dataSource).getJasperPrint(); 113. // 将填充完的japserPrint放入session中。

114. request.getSession().setAttribute(BaseHttpServlet.

DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);

115. // 拿到japserPrintList

116. List jasperPrintList = BaseHttpServlet.getJasperPr intList(request);

117. // 若没有JasperPrintList,则抛出异常

118. if (jasperPrintList == null) {

119. throw new JasperReportException("在Http Session中没有找到JasperPrint List");

120. }

121. try {

122. OutputStream ouputStream = response.getOutputS tream();

123. try {

124.

125. response.setContentType("application/xls") ;

126. response.setCharacterEncoding("UTF-8"); 127. if (fileName == null || fileName.equals(""

))

128. response.setHeader("Content-Dispositio n", "inline; filename=\"noTitle.xls\"");

129. else {

130. response.setHeader("Content-Dispositio n", "inline; filename=\""

131. + URLEncoder.encode(fileName, "UTF-8") + ".xls\"");

132.

133. }

134. // Xls格式的导出器 JRXlsAbstractExport 135. JRXlsAbstractExporter exporter = getXlsExp orter();

136.

137. // 在导出器中放入要导出的japserPrintList 138. exporter.setParameter(JRExporterParameter.

JASPER_PRINT_LIST, jasperPrintList);

139.

140. exporter.setParameter(JRExporterParameter.

OUTPUT_STREAM, ouputStream);

141. // 设置Xls的属性

142. exporter.setParameter(JRXlsAbstractExporte rParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);

143. exporter.setParameter(JRXlsAbstractExporte rParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);

144. // 导出

145. exporter.exportReport();

146. } catch (JRException e) {

147. e.printStackTrace();

148. throw new JasperReportException("在生成XLS 报表时发生错误!");

149. }

150.

151. finally {

152. if (ouputStream != null) {

153. try {

润乾报表与帆软报表产品对比

润乾报表与帆软报表产品对比

目录 (2) 前言 (3) 第一章报表设计 (3) 1.1对EXCEL的支持 (3) 1.1.1设计器打开Excel文件 (3) 1.1.2对Excel的公式支持 (4) 1.1.3复制粘贴Excel的内容 (4) 1.2制作报表 (4) 1.3制作统计图 (7) 1.4远程设计 (8) 第二章功能性 (9) 2.1中国式复杂报表 (9) 2.2.1多源分片 (9) 2.2.2动态格间运算 (10) 2.2.3行列对称 (10) 2.2.4不规则分组 (11) 2.2数据源 (11) 2.3主子表 (12) 2.4行类型 (13) 2.5折叠报表 (13) 2.6统计图 (16) 2.7超链接 (16) 2.8参数与宏 (17) 第三章集成性 (18) 3.1WEB应用集成 (18) 3.2API接口 (19) 3.3自定义数据接口 (19) 3.4移动端展现 (19) 第四章性能与容量 (21) 4.1多源关联 (21) 4.2容量 (21) 4.3响应 (22) 4.4并发 (22) 第五章美观性 (23) 4.1设计器UI (23) 4.2统计图 (24) 第六章总结 (25)

多年以来,我们经常被客户询问关于润乾报表与帆软报表的不同之处,对此我们的态度一直是避而不谈,因为从心底里不愿意去做这样的对比,我们坚信“你若盛开,清风自来”,也一直在秉行只说自己好,不去评判竞争者好坏的商业原则。如果客户在面对选型时有所纠结,我们都是建议客户自己去对比选择并积极配合。但是现在这样的客户反馈越来越多,而且确实有许多客户对报表工具不熟悉,不知道在选型时该对比哪些内容。另外,市场上长期以来充斥着一些倾向性非常明显、内容却很片面且与实际不符的对比材料,其编造者也不敢署名,这些错误的材料误导了客户对报表市场的感知能力。因此,不管是客户需求,还是市场需要,还是自我澄清,我们现在都有必要做个回应。下面对两种产品进行了详细测评,并整理汇总出文档供业界参考。我们力求做到客观公正,但由于对友商的产品不是非常熟悉(我们的精力更多的是研究客户需求,而不是竞争者),因此难免有错,敬请广大业内人士指正,特别是敬请友商指正。 润乾报表和帆软报表都是国内知名的报表解决方案供应商,两者的共同特点都是类Excel的纯Java的Web报表工具,但在技术细节和发展方向上存在差异。 本文主要考察这两款报表工具在制作固定报表时的差异。固定报表是指由报表开发人员预先定义好报表样式、取数规则、查询条件、业务逻辑等,报表的使用人员仅在Web端进行报表的查看,不涉及报表结构的修改。固定报表是业务系统中最常用的、开发工作量最大的任务,其制作方便性及能力对项目开发周期有很大的影响。另外,由于固定报表主要是在应用程序中使用,其集成性也是非常重要。本文将对这些方面进行客观的测评。 第一章报表设计 1.1对EXCEL的支持 既然润乾和帆软都是类Excel的设计模型,那么我们先来看看二者对Excel 的支持情况。对Excel的支持从以下几方面进行: 1.1.1设计器打开Excel文件

杰控第26章数据库报表

26.数据库报表26.数据库报表

26.1水晶报表 选择数据库连接或批量数据库连接: 执行<制作报表格式>: 执行<新建>按钮,选择Crystal(水晶星)报表格式: 执行Cancel,直接取消;

执行菜单File->New: 执行按钮: 执行按钮,选择ODBC数据源: 执行按钮,继续选择报表使用的数据表或视图:

执行按钮,再执行按钮: 执行按钮,选择参与报表字段: 执行按钮,完成报表初始化参数设置;

执行选项,继续设计基本报表格式: [1].设计模式,即使报表内容有多条记录,也只设计一行; [2].报表格式内容,通过对象表示,通过修改对象属性改变报表格式; [3].改变字体,选中某对象,点击右键,执行弹出菜单; [4].改变标题及文本内容,选中某标题对象,点击右键,执行从弹出菜单; [5].记录序号,执行菜单Special Field->Record Number Field>命令; [6].画表格线,执行菜单Line>; [7].添加图片,执行菜单Picture>; [8].添加字段,执行菜单Database Field>; [9].刷新数据库结构, 执行菜单Verify Database>; 报表建立后,数据表结构发生变化,需通知报表格式; [A].多选字段,执行菜单Select Fields>,再选择字段并编辑; [B].刷新报表内容,执行菜单Refresh Report Data>; 制作报表时,数据表记录内容发生变化,为浏览正常需通知报表格式; 基本报表格式设计完成:

Visual Studio 2008 水晶报表快速入门

Visual Studio 2008 水晶报表快速入门 医手 先新建一个Web项目: CrystalWebApp 为项目添加新项: CrystalReport1.rpt

在弹出的对话框,选择作为空白报表。用向导当然更方便,但在这里,白手起家或许能更好地理解。 在工具箱选择 Text Object,拖到报表头。写些字,设置字体之类的。在属性选项卡设置它的名字为 txtTitle 以供将来程序访问。 水晶报表对于程序员来说其实跟 Repeater 控件是很相似的。于是需要数据和字段名。在Repeater 控件中你可以很随意地指定要绑定的字段名。在程序还没有真正运行之前,这个字段名可以没有任何表的字段名跟它匹配,也可以没有任何类的属性名跟它匹配。但在水晶报表中,字段名在设计阶段就必须是真实存在的。还能稍感安慰的是,水晶报表一旦设计好之后,就能像 Repeater 控件那样绑定任意类型的对像。而不必是设计时指定字段来源的表或类。所以我们现在要创造些真实存在的字段名…… create table TabTest ( UserID int, UserName nvarchar(50), Age int, Birthday datetime ) 你可以用 Access 或者 Excel 来创造真实存在的字段名,但我这里是使用 SQL Server。 在 "字段资源管理器" 的 "数据库字段" 上按右键,选择 "数据库专家..."。在

弹出的对话框中,创建新连接==>OLE DB (ADO)(Access 或者 Excel 应点 "数据库文件" 前的 "+" 号)。在弹出的对话框,选择 "SQL Native Client" 作为提供程序。 按提示一步步地做,直到连上数据库。选择表 TabTest,把它弄到右边的框中。再点击确定。 折腾了半天就是为了这些字段名。对水晶报表的开发商无语…… 把需要显示的字段拖到 "详细资料"。"页眉" 和 Word 文档中的页眉完全不是一回事。这里的页眉其实就是列名(表头)。那么就顺便改一下列名吧。默认是有下划线的,可以改一下格式。

VB中如何使用水晶报表

水晶报表(Crystal Report)的业内最专业、功能最强的报表系统,它除了强大的报表功能外,最大的优势是实现了与绝大多数流行开发工具的集成和接口。在https://www.doczj.com/doc/8111037602.html,平台做过报表开发的程序员,一定都对水晶报表强大、高效、集成等特性留下了深刻印象。除了开发新程序外,在工作中我们常需要接触到很多较早的软件系统报表功能升级的需求,如果能结合水晶报表这一强大的工具,往往能事半功倍。 VB是以前流行的数据库开发平台,用其开发的C/S系统在社会上有非常大的保有量,但VB 超弱的报表功能往往让程序员面对客户的升级要求一筹莫展。本文并不做水晶报表的使用和编程教学,实际上水晶报表本身的使用方法和https://www.doczj.com/doc/8111037602.html,平台并没有太大的差别,我主要是和大家探讨一下VB和水晶报表的一种较方便的接口方式。我的开发测试平台是Windows2003 Standard简体中文版、VB6.0+sp5英文版、Crystal 9.0简体中文开发版。 关于在水晶报表中制作报表模板的方法,并非本文的探讨范围,读者可以参考Crystal Report 的帮助文件和官方网站的技术资料。简单地说,首先要通过水晶报表的数据库引擎手动连接相应的表结构,制作报表模板,并保存为rpt文件,该项操作和利用VB自带的报表工具制作报表大同小异。 用VB调用水晶报表进行报表开发的简单接口方法就是,在水晶报表中用"仅字段定义"来获得字段分布文件,用虚拟的文件创建表字段,用CRAXDRT对象来强制改变数据源(ADO.recordset),其效果相当于在VB中调用了rpt文件。下面分步骤介绍编程方法。 第一步: 在VB工程中Project菜单加入"Add Crystal Report 9",报表名使用默认即可。这时Form2(Crystal Rerport自动添加的Form,假设名为Form2)被自动分配了如下代码: Option Explicit dim Report as New Cystal1 Private Sub Form_Load() Screen.MousePointer = vbHourglass '调用水晶报表时置鼠标为沙漏状 CRViewer91.ReportSource = Report '该语句的赋值将在后面被修改

总结了润乾报表的查询标签属性

1)raq:部署到通用查询应用中的报表的名称,为必须项,格式要符合文件名或变量名规则通用查询面板的布局方式。 2)srcType:报表源的类型,默认值为file。 3)needSave:是否生成通用查询页面上的保存按钮,即保存当前查询设置的保存按钮,默认值是yes。 4)needReload:是否生成通用查询页面上的载入已定义按钮,即载入已有的查询条件设置的按钮,默认值是yes。 5)needQuery:是否生成通用查询页面下方提交查询设置的查询按钮,默认值是yes。 6)conditions:设置可见的预置条件,预置条件为预先设置查询条件作为默认查询条件。预置条件的固定设置格式为:数据集名称,(,字段名称,比较符,条件值1,条件值2,),逻辑符; 一个预置条件必须含有八项(其中括号”()”算一项且必须),包括:数据集名称、左括号、所选的字段名称、比较符(参见比较符对应表)、条件值1、条件值2、右括号、逻辑符(or或and);其中两个条件值是针对选择”在……之间”这种类型的比较符,若选择的是只需一个条件值的比较符,那么只设置条件值1,条件值2为空即可。 7)hiddenConditions:将预先设置的查询条件隐藏,这样进入通用查询页面时,预置条件不显示,在提交查询条件时,与用户设置的查询条件一同传入报表。不可见预置条件的设置方法与规则同可见预置条件的一致。 8)dataSets:生成通用查询面板所使用的数据集列表,设置报表模板中的数据集,设置格式为半角逗号分割的列表。 9)macroNames:若设计的报表模板含有宏,则在这个标签处设置报表中的宏,此处宏名称的列表要与数据集名称一一对应。 10)fieldColWidth:设置通用查询字段列表的宽度,格式是像素值,或者百分比。 11)setupIcon:”高级设置”功能键对应的图标路径,格式可以是绝对或相对URL地址。 12)multiIcon:”横向布局”功能键对应的图片路径,格式可以是绝对或相对URL地址。 13)saveIcon:”保存”功能键对应的图标路径,格式可以是绝对或相对URL地址。 14)reloadIcon:”载入已定义”功能键对应的图标路径,格式可以是绝对或相对URL 地址。 15)calIcon:”日历编辑风格”对应的图标路径,格式可以是绝对或相对URL地址。

水晶报表是一个功能强大的报表工具

水晶报表是一个功能强大的报表工具,现在已经被Microsoft Visual Studio 2005(下文以VS2005简称)集成在一起。喜欢水晶报表的朋友可以方便使用了。我把水晶报表在vs2005的使用方法总结一下,供大家参考。 首先介绍一下我用的软件环境:Microsoft Visual Studio 2005;Microsoft SQL Server 2005 【数据用例】 服务器:SQLEXPRESS 数据库名:Test 数据库表:T 【说明】 水晶报表在应用时分两种方法,分别是拉模式(PULL)、推模式(PUSH)。拉模式:在水晶报表生成时的数据源是从水晶报表文件中的SQL语句从数据库中提取的,在编程时不用重写SQL语句,但要加上登录信息(具体方法,后面介绍)。推模式:在水晶报表生成时的数据源,是用编程时重写水晶报表中SQL语句而生成的dataset对像。也就是说,推模式是用dataset 组装水晶报表。 水晶报表组件介绍。水晶报表在VS2005中有两种组件,在WEB项目是分别是CrystalReportSource,CrystalReportViewer。在FORM项目里是分别是crystalReport,CrystalReportViewer。 CrystalReportSource,crystalReport是水晶报表的数据提供者;CrystalReportViewer是水晶报表的浏览器。另外还要介绍一下水的报表的文件是以rpt为扩展名的文件,该文件可以用VS2005生成。 下面分别介绍具体操作方法: 拉模式(PULL): 在拉模式中如要在水晶报表中的SQL语句加上条件参数时要用{?参数名}方式给出。例:“Select T1, T2, T3 FROM T Where T1=''{?parm}''” parm就是参数名 以下例子中所用到的水晶报表文件中使用的SQL语句是“Select T1, T2, T3 FROM T Where T1=''{?parm}''” parm就是参数名。 【WEB方式下】 using CrystalDecisions.Shared; using CrystalDecisions.CrystalReports.Engine; ///

///功能:拉模式提取水晶报表 ///个人主页:https://www.doczj.com/doc/8111037602.html,/ /// /// /// protected void Button_pull_Click(object sender, EventArgs e) { // CrystalReport.rpt是水晶报表文件的名称;CrystalReportSource1是从工具箱加到页面上的水晶报表数据源对像。 CrystalReportSource1.ReportDocument.Load(Server.MapPath("CrystalRepor t.rpt")); // SetDatabaseLogon 拉模式中必须用这个方法来设置登录信息,参数一:用户名;参数二:

水晶报表CrystalReports培训教程(可编辑)

水晶报表CrystalReports培训教程(可编辑)水晶报表CrystalReports培训教程 Crystal Reports 用户指南 Crystal Reports 11专利 Business Objects 拥有以下美国专利,涵盖 Business Objects 提供和销售的产品: 5,555,403、6,247,008 B1、6,578,027 B2、6,490,593 和 6,289,352。商标Business Objects、Business Objects 徽标、Crystal Reports 和Crystal Enterprise 是 Business Objects SA 或其附属公司在美国和其他国家 / 地区的商标或注册商标。此处提到 的所有其他名称可能是各自所有者的商标。 版权所有 Copyright C 2004 Business Objects。保留所有权利。目录第1 章 Crystal Reports 11 简介 1.1 关于 Crystal Reports21 1.2 关于本指南22 1.2.1联机帮助.22 1.2.2Business Objects 信息资源..22 第2 章 Crystal Reports 11 中的新功能 2.1 介绍 23 2.2 强大的报表创制功能.23 2.3 提高的实用性.24 2.4 扩展的应用程序开发功能 25 2.4.1一般说明.25

2.4.2报表应用程序服务器 RAS26 2.4.3报表设计器组件 RDC.27 2.4.4Crystal Reports .NET.27 2.5 与 BusinessObjects Enterprise 11 的集成.28 第3 章安装 Crystal Reports 11 3.1 安装 Crystal Reports 1130 3.2 安装要求30 3.3 在本地计算机上安装 Crystal Reports31 3.4 创建安装点并从网络服务 器进行安装..32 3.4.1创建 Crystal Reports 的安装点.32 3.4.2从网络安装 Crystal Reports.33 34 Crystal Reports 用户指南 3.5 自定义安装34 3.6 运行无提示安装..35 3.7 升级 Crystal Reports 组件37 第4 章快速开始 4.1 学习如何使用 Crystal Reports39 4.1.1示例数据 -- Xtreme.mdb39 4.2 报表创建向导.39 4.2.1标准40 4.2.2交叉表 40 4.2.3邮件标签. 40 4.2.4OLAP40 4.3 新用户快速入门..41 4.3.1开始之前. 41 4.3.2创建报表. 42 4.3.3记录选定. 52 4.3.4分组及排序55 4.3.5完成报表. 58 4.4 高级用户快速开始59 第5 章报表设计概念 5.1 基本报表设计.64 5.2 决定报表内容.64 5.2.1说明目的. 64 5.2.2确定报表布局 65 5.2.3查找数据. 66 5.2.4操作数据. 67 5.2.5确定打印区域特性68 5.3 设计纸张原型.69 第6 章建立报表简介 6.1 报表创建选项.70 6.1.1报表创建向导 70 6.1.2另一个报表70

润乾报表实现预置分组报表及改进

润乾报表实现预置分组报表及改进 预置分组报表在报表开发中比较常见而且比较棘手。所谓预置分组报表是指分组没有规律,可能是分组范围没有规律,也可能分组顺序没有规律,需要报表开发人员事先预置(固定)分组的报表。常见的预置分组报表一般有如下三类:按段分组报表、固定次序分组报表、多层固定次序分组报表。下面分别看一下这几类报表的特点,以及润乾报表的实现方法。 按段分组报表 这类报表的特点是分段的区间并未在数据库中存储需要根据相应字段(如年龄、日期)计算,并且每个分段可能会发生变化(如每年节假日所在日期可能不同),经常由用户随意指定。如:统计20-30岁,30-40岁,40-50岁各年龄段的用户数量;每年节假日(春节、端午节、国庆节)期间公路铁路承载的旅客统计。 下面通过实例说明,报表样式如下: 该报表是根据订单表统计各(预置)时间段内,各地区的订单数量、订单金额汇总。其中各时间段范围为: 【1996年圣诞前:date <= 1996-12-25 1996年圣诞--1997年国庆:1996-12-25 <=date <= 1997-10-1 1997年国庆--1998年五一:1997-10-1 < date <= 1998-5-1 1998年五一以后:date>1998-5-1】 实现 润乾报表实现该类按段分组报表主要使用ds.plot()函数,计算一个值在一个完全划分中的位置。报表模板及其表达式如下: 其中,参数arg1为日期组,默认值为:1996-12-25,1997-10-1,1998-5-1。 设置B1显示值表达式:map(to(0,count(arg1)+1),arg2),其中参数arg2为字符串组,默认值为:1996年圣诞前,1996年圣诞--1997年国庆,1997年国庆--1998年五一,1998年五一以后。 使用ds.plot()函数可以非常方便地实现上述报表,而且可以通过该函数的参数控制是否包含边界,对于分组较少并且边界包含规律的分组报表尤其适用。 不过,当段界包含不规律时则无法使用ds.plot()实现,比如上例中如果时间范围变成:

润乾报表入门

1 前言 鉴于目前报表开发没有一个统一的规范,每个开发的风格和习惯也不一致,所以动手写了这份报表开发文档,一来有助于统一大家的报表的风格,提供一些常见问题的解决方案,二来方便以后新人的学习使用。本人也是略懂皮毛,有什么错误和不足之处,欢迎大家补充修改。

2.报表工具安装 解压后运行runqian-v4.5.5-install.exe安装文件,按引导完成安装。其中,在初次打开报表文件和发布报表文件的时候(后续会提到),会提示我们需要lic文件,就是下图中的两个lic文件。 Figure 1

3.报表工具的使用 3-1 配置数据源 使用报表时需要先对数据源进行配置: Figure 2选择新建一个数据源:

Figure 3 项目中默认使用的数据源名称为reportjndi.参考图3进行配置后,点击连接,进行数据源连接,这样就完成了报表服务器与数据库的连接。 3-2 新建报表 目前的报表形式分为两部分,一是用来显示查询结果的“报表名.raq”文件,另一个是用来提供查询条件的“报表名_arg.raq”文件。我们只需要在保存文件的时候,按上述格式命名,打开.raq文件时,会自动打开相关的_arg.raq文件。 3-3 结果显示报表设计 首先新建一张报表,直接点击左上角工具栏上的即可。按照给定的表样设计好报表名名、列名。如下图,这里提供一种样式当做参考模板,如客户无特殊需求,希望各开发按照统一的样式标准进行设计,有助于提高所有报表的统一性,后面还会提到一些规范,希望大家也可以遵守起来。

Figure 4 报表名这一行,采用黑色、二号字,加粗。列名采用白色、三号字,加粗,背景色使用淡紫色(颜色相近即可)。若每一列下面还要分列,则使用黑色、小三号字,结果数据使用黑色、四号字。 Figure 5 设定好报表样式后,开始根据逻辑进行取数,设置每一列的宽度时,如果需要在一行中完整显示的,要选择“按单元格内容扩大”,并去掉“自动换行”。

26.数据库报表

26.数据库报表 序号 描述 页码 26.1 水晶报表 26-2 26.2 Excel报表 26-11 26.3 打印按钮 26-15 26.4 用户报表 26-21 26.5 根据分钟报表生成小时和日报表 26-22 26.6 水晶报表字段有效数值统计 26-23 26.7 水晶报表根据某字段有效性对其他字段进行统计 26-24 26.8 水晶报表连接远程数据库 26-25 26.9 水晶报表不支持太多nvarchar类型字段 26-25 26.10 Excel报表执行宏函数 26-25 26.11 水晶报表导出Excel文件失败 26-27 26.12 动态改变水晶报表标题 26-27 26.13 后台打印报表为PDF文件 26-28 26.14 脚本控制Bullzip打印机实现报表打印 26-30 26.15 定义日报表的开始时间 26-31 26.16 控制水晶报表输出打印机 26-31 26.17 水晶报表计算某字段最大值与最小值的差值 26-34 26.18 显示水晶报表首尾记录时间差 26-37 26.19 水晶报表统计同类记录 26-41 26.20 使用视图在报表中显示多个数据表数据 26-46 26.21 通过视图实现分项平均统计 26-47 26.22 Excel报表数值枚举文本 26-48 26.23 根据日统计数据生成月报表 26-49 26.24 水晶报表统计符合某条件的记录数量 26-55

26.1水晶报表 选择数据库连接或批量数据库连接: 执行<制作报表格式>: 执行<新建>按钮,选择Crystal(水晶星)报表格式: 执行Cancel,直接取消;

FineReport与润乾报表的比较

fineReport报表与润乾报表的比较 一.概述 通过对合肥警综业务功能和客户需求的分析,需要定制开发针对合肥警综平台的报表系统。考虑到人力资源和开发成本,目前的合肥警综开发项目组依托自身资源想要开发一套报表系统,难度高、代价大、可复用性低,通过多方协商和研讨,最终确定使用第三方报表工具生成报表并集成到合肥警综系统中。目前国内主流报表系统主要有FineReport报表系统和润乾报表系统,下面对这两款报表工具进行全面的分析和对比,以供后来者技术选型做参考。 二.优缺点比较 fineReport与润乾报表工具的优缺点比较主要以表格的形式展现 表1 fineReport与润乾比较表 比较范围报表FineReport 润乾 参数设计对比参数的定义与引用(定义 参数形式:SQL语句定义、 报表参数定义、单元格中 直接引用) 定义参数的形式相互独立,根据 需要定义 须现在报表参数中定义参数,然后 在单元格或SQL语句中引用参数预定义参数编辑控件支持不支持 拖拽式设计报表参数 支持从预定义控件中点击然后拖 入相应的单元格 需要对每个单元格定义编辑器,如 果参数较多工作量较大,影响工作 效率 参数控件风格支持将近20种编辑风格仅支持6中编辑风格 展示功能对比树状报表展现(组织递归 树) 支持通过添加树状展现,不需 要写代码 支持需要通过编写繁琐代码实 现 单元格形态(根据数据字 典显示相应的数据) 支持 不支持但有设置显示值的功能, 功能不够强大 单元格绑定数据和数据过 滤(在制作报表的时候需 要将数据放到单元格中, 设置他的扩展属性。如果 较简单只需要进项简单的界 面设置,在单元格过滤中添加过 滤条件即可 较复杂需要在单元格内写表达 式传参数的方式

最新水晶报表函数大全-汇总函数

汇总函数的条件 以下是每个汇总函数的条件列表: 布尔型条件?任何更改 ?更改为“是” ?更改为“否' ?对每个“是” ?对每个“否” *对下一个“是” ?对下一个否” 日期条件时间条件 ?每天 ?每周 ?每两周 ?每半月 ?每月 * 每季 ?每半年 ?每年 ?每秒 *每分钟 ?每小时 * 上午/下午 Sum Basic语法和Crystal语法。 重载 * Sum (fid) * Sum (fid, condFid) * Sum (fid, condFid, cond) * Sum (x) 参数 * fid是可由函数求值的任何有效的数据库字段或公式字段。

? cond是表明condFId分组类型的字符串。只能在condFId是一个日期、时间、日期时间或布尔字段时才指定此参数。有矢此参数有效字符串的详细信息,参见汇总函数的条件。 *x是可由正在使用的函数求值的数字或货币值的数组。 返回 数字 操作 使您能够添加报表中出现的值。例如: ?如果销售报表包含一个显示每张订单金额的字段,则可以计算报表上出现的所有订单的总和(总计和)。 ?如果对订单进行分组(例如,按订单所来自的省份对其分组),则可以计算每组订单金额的总和(在本例中,为每个省)。 ?如果将订单按日期或布尔值分组(例如,对订单按其发出的月份进行分组),则可以根据日期字段或布尔字段中的特定变化來计算每组订单金额的总和(在本例中,为每月)。 ?如果指定单个值的集合,则也可以计算该集合中值的总和。有矢这种汇总的详细信息,参见数组汇总函数。 示例 下列示例适用于Basic语法和Crystal语法: Sum ({file.QTY}) 计算QTY字段中所有值的总和。 Sum ({订单.金额} , {订单.客户ID}) 对“金额”字段中每个订单组的订单求和(总计)。每当“客户ID”字段中的值变化时,订单都将进行分组。 Sum ({订单.金额} , {订单.日期}/'monthly") % Sum ({订单.金额}) 对“金额”字段中的值按月分组,并计算每个月组中值的总和相对于整个报表值的总和的百分比。 Sum ( [ {file.AMOUNT} , {file.PRICE} , {file.COST}]) “金额”、“价格”和“费用”字段中值的总和。

润乾报表基本介绍

润乾报表3.0介绍 润乾报表 3.0是用于统计报表制作及报表及数据填报的大型企业级工具软件。产品首次成功解决了报表单元格与关系数据库之间的关联规律性,特别适合于中国式报表的填报和统计。 一、产品优势 1.绘制方便 润乾报表采用类EXCEL的绘制方式,真正做到所见即所得,把程序员从繁重且无聊的报表格式设置工作中解脱出来,极大的提高的表格绘制的方便度和效率,产品特有的EXCEL导入功能(包括格式)可充分利用业务人员原有积累。 2.数据模型先进 润乾报表独创的数据模型首次成功地解决了中国报表中单元格与数据字段之间的弱关联性,彻底打破传统行式报表方案,报表行列完全对称,特有的层次扩展机制使多层分组及交叉报表制作非常简单,提供针对关联格的跨行跨组运算,很容易计算小计、同期比等数据。同一报表中支持多个异构的数据源,允许报表各片之间无关,可用多个简单的数据集成组合出复杂报表,程序员无须再为每张报表编程(脚本或存储过程)或写复杂SQL准备数据。

3.输出能力丰富 润乾报表每个单元格属性均提供条件控制,如颜色、行高、是否可见等均可与格内数据相关;支持代码显示值对应、多种数据格式、图片文件和图片字段的处理。产品提供十几种各类统计图,支持PNG/GIF/JPG三种格式。每张报表均可生成HTML、EXCEL、PDF三种输出格式(输出结果完全不失真,包括其内的统计图)。单元格与统计图例均可加带参数的链接从而实现数据钻取功能,多层报表可在线收缩展开。

4.打印控制强大 润乾报表提供强大的打印控制功能,按行数和纸张大小分页分栏或强制分页,表头自动重复(包括左表头),允许一张纸上打多个报表,提供末页补足空行。可采用像素和毫米两种计量单位,独创的底图描绘功能以支持套打; 5.集成性好 润乾报表采用纯JAVA开发,利用服务器端提供丰富的API调用和标记可完全无缝地嵌入到基于J2EE的应用程序中(可看作应用程序员自己写的代码),程序员可更换报表的数据库连接和数据源、采用应用服务器的连接池管理;设计器也提供外置的数据源和数据字典定义,可由应用程序员提供这些信息。 6.特色填报功能 除统计报表外,润乾报表还提供数据填报功能,填报表中可加入跨行跨表的合法性检查规则,支持自动计算,与数据库表关系定义灵活,可同时写入多表,支持自由式填报(每表一条记录)、行式填报(每行一条记录)和交叉表填报(每格一条记录),支持多级填报(填报表部分数据可来自其它数据库的汇总表)。

Web水晶报表部署总结

将webconfig 中true更改为false 具体为修改注册表下面两个键的值。 [HKEY_LOCAL_MACHINE\SOFTWARE\Crystal Decisions\10.2\Report Application Server\InProcServer] 修改"PrintJobLimit"="1000"

修改为1000 [HKEY_LOCAL_MACHINE\SOFTWARE\Crystal Decisions\10.2\Report Application Server\Server] 修改"PrintJobLimit"="1000" 下载注册表文件 PS:另外一种修改方法是改成-1 如果还不行,请参考此贴,需要修改代码 https://www.doczj.com/doc/8111037602.html,/Forums/en-US/vscrystalreports/thread/143f3517- c5c4-4c17-9da0-8c4bd54b6604 水晶报表打印不出来,请更换本机的PrintControl.cab包替换。 1.进入Windows功能窗口,然后看到internet信息服务选项,然后按照图中设置 即可,Ps:打√的选项下面为全选,方圈的下面按照图中打√的选择即可。

2.然后确定,会进入系统安装设置,此时可能需要等待两三分钟的样子。

缺少水晶报表DLL 没有添加默认页面

安装CRRuntime_32bit_13_0去解决 log4net问题 如果是报表未能加载,是权限问题,请将net service 用户加入到c:/Windows/Temp文件夹的权限列表 *windows server 2012R2中如果找不到netserveice,则查找 NETWORK SERVICE 用户

水晶报表公式大全

水晶报表公式大全 汇总函数的条件 以下是每个汇总函数的条件列表: 布尔型条件 任何更改 更改为“是” 更改为“否” 对每个“是” 对每个“否” 对下一个“是” 对下一个“否” 日期条件 每天 每周 每两周 每半月 每月 每季 每半年 每年 时间条件 每秒 每分钟 每小时 上午/下午 Sum Basic语法和Crystal语法。 重载 Sum(fld) Sum(fld,condFld) Sum(fld,condFld,cond) Sum(x) 参数 fld是可由函数求值的任何有效的数据库字段或公式字段。 condFld是用于对fld中的值进行分组时所依据的字段。 cond是表明condFld分组类型的字符串。只能在condFld是一个日期、时间、日期时间或布尔字段时才指定此参数。有关此参数有效字符串的详细信息,参见汇总函数的条件。 x是可由正在使用的函数求值的数字或货币值的数组。 返回 数字 操作 使您能够添加报表中出现的值。例如: 如果销售报表包含一个显示每张订单金额的字段,则可以计算报表上出现的

所有订单的总和(总计和)。 如果对订单进行分组(例如,按订单所来自的省份对其分组),则可以计算每组订单金额的总和(在本例中,为每个省)。 如果将订单按日期或布尔值分组(例如,对订单按其发出的月份进行分组),则可以根据日期字段或布尔字段中的特定变化来计算每组订单金额的总和(在本例中,为每月)。 如果指定单个值的集合,则也可以计算该集合中值的总和。有关这种汇总的详细信息,参见数组汇总函数。 示例 下列示例适用于Basic语法和Crystal语法: Sum({file.QTY}) 计算QTY字段中所有值的总和。 Sum({订单.金额},{订单.客户ID}) 对“金额”字段中每个订单组的订单求和(总计)。每当“客户ID”字段中的值变化时,订单都将进行分组。 Sum({订单.金额},{订单.日期},"monthly")%Sum({订单.金额}) 对“金额”字段中的值按月分组,并计算每个月组中值的总和相对于整个报表值的总和的百分比。 Sum([{file.AMOUNT},{file.PRICE},{file.COST}]) “金额”、“价格”和“费用”字段中值的总和。 注意:在公式中使用此函数强制在打印时对公式求值。有关求值时间考虑因素的详细信息,参见求值时间。 Average Basic语法和Crystal语法。 重载 Average(fld) Average(fld,condFld) Average(fld,condFld,cond) Average(x) 参数 fld是可由函数求值的任何有效的数据库字段或公式字段。 condFld是用于对fld中的值进行分组时所依据的字段。 cond是表明condFld分组类型的字符串。只能在condFld是一个日期、时间、日期时间或布尔字段时才指定此参数。有关此参数有效字符串的详细信息,参见汇总函数的条件。 x是可由正在使用的函数求值的数字或货币值的数组。 返回 数字 操作 使您能够对报表中出现的值求平均值。例如: 如果销售报表包含显示每个订单金额的字段,则可以计算该报表上出现的所有订单的平均值(总计平均值)。 如果将订单进行分组(例如,对订单按其来自的省份进行分组),则可以计算每组订单的平均金额(在本例中,为每个省)

个人周工作总结和计划表(最新版)

编号:YB-JH-0630 ( 工作计划) 部门:_____________________ 姓名:_____________________ 日期:_____________________ WORD文档/ A4打印/ 可编辑 个人周工作总结和计划表(最 新版) Frequently formulating work plans can make people’s life, work and study more regular, and develop good habits, which is a habit necessary for success in doing things

个人周工作总结和计划表(最新版) 摘要:经常制订工作计划,可以使人的生活、工作和学习比较有规律性,养成良好的习惯,因为习惯了制订 工作计划,于是让人变得不拖拉、不懒惰、不推诿、不依赖,养成一种做事成功必须具备的习惯。本内容可 以放心修改调整或直接使用。 大家好!近几日虽然是阴雨绵绵,但咱们过得忙碌、愉快而充实,现将周工作总结如下: 一、上周工作总结: 1、在周一的晨检中,本班幼儿的个人卫生做的很干净,头发洗了,园服也很整洁,只有极个别幼儿指甲没剪,幼儿都保护自己很好,没有带外伤的幼儿,孩子们都能高高兴兴入园。 2、本周孩子们进行了正常的教育教学活动,还贯穿了幼儿的常规训练,比如:上操、吃饭、上床睡觉的安全等,孩子们都能按老师的要求积极参与,成效还不错,另外,我们应做好安全工作总结。 3、本周接连几天下雨,早晚天气还是有点冷,温差比较大,流行病偶有发生,希望家长朋友们给孩子做好预防工作,本周除王宁、张凯、张亚楠三个小朋友请长假外,其他幼儿请假的少,所以,本周幼儿的出勤率比较高,只有极个别的孩子带药了,老师都能及时

水晶报表

水晶报表 水晶报表是一个功能强大的报表工具,现在已经被Microsoft Visual Studio 2005(下文以VS2005简称)集成在一起。喜欢水晶报表的朋友可以方便使用了。我把水晶报表在vs2005的使用方法总结一下,供大家参考。 首先介绍一下我用的软件环境:Microsoft Visual Studio 2005;Microsoft SQL Server 2005 【数据用例】 服务器:SQLEXPRESS 数据库名:Test 数据库表:T 【说明】 水晶报表在应用时分两种方法,分别是拉模式(PULL)、推模式(PUSH)。拉模式:在水晶报表生成时的数据源是从水晶报表文件中的SQL语句从数据库中提取的,在编程时不用重写SQL语句,但要加上登录信息(具体方法,后面介绍)。推模式:在水晶报表生成时的数据源,是用编程时重写水晶报表中SQL 语句而生成的dataset对像。也就是说,推模式是用dataset组装水晶报表。水晶报表组件介绍。水晶报表在VS2005中有两种组件,在WEB项目是分别是CrystalReportSource,CrystalReportViewer。在FORM项目里是分别是crystalReport,CrystalReportViewer。 CrystalReportSource,crystalReport是水晶报表的数据提供者;CrystalReportViewer是水晶报表的浏览器。另外还要介绍一下水的报表的文件是以rpt为扩展名的文件,该文件可以用VS2005生成。 下面分别介绍具体操作方法: 拉模式(PULL): 在拉模式中如要在水晶报表中的SQL语句加上条件参数时要用{?参数名}方式给出。例:“Select T1, T2, T3 FROM T Where T1=''{?parm}''” parm就是参数名 以下例子中所用到的水晶报表文件中使用的SQL语句是“Select T1, T2, T3 FROM T Where T1=''{?parm}''” parm就是参数名。 【WEB方式下】 using CrystalDecisions.Shared; using CrystalDecisions.CrystalReports.Engine; ///

///功能:拉模式提取水晶报表 /// /// /// protected void Button_pull_Click(object sender, EventArgs e) {

水晶报表公式必读

水晶报表公式必读水晶报表公式使用必读 一、公式组件 二、公式语法 三、公式类型公式包含两个关键部分:组件和语法。组件是创建公式所添加的部分,而语法是组织组件所遵循的规则。 在Crystal Reports 中有几种不同种类的公式:报表、格式化、选定、搜索、运行总计条件和警报公式。报表中的多数公式为报表公式和条件格式化公式。 一、公式组件 在Crystal Reports 中创建公式与在任何电子数据表应用程序中创建公式类似。可以在公式中使用下列组件:字段 示例:{客户.客户名} 、{客户.去年销售额} 数字 示例:1、2、3.1416 Text 示例:“数量”、“:”、“您的文本” 运算符 示例:+ (加)、/ (除)、-X (求负) 运算符是可以在公式中使用的操作。 函数 示例:Round (x)、Trim (x) 函数执行求平均值、求和与计数之类的计算。列出所有可用的函数,其参数一并列出,并根据用途排列。自定义函数 示例:cdFirstDayofMonth 、cdStatutoryHolidays 自定义函数提供了一种共享和重复使用公式逻辑的途径。它们可存储在Crystal 储备库中, 而后可将其添加到报表中。一旦自定义函数添加到报表后,当创建公式时,用户就可在“公式专家”中使用自定义函数。 控制结构 示例:“If和“Select、" "For循环 组字段值 示例:Average (fld, condFld) 、Sum (fld, condFld, " 条件") 组字段值对组进行汇总。例如,可以使用组字段值来得出各个组在总计中所占百分比。 其它公式 示例:{@GrossProfit} 、{@QUOTA} 有关详细信息,请参阅公式语法。 二、公式语法语法规则用于创建正确的公式。一些基本规则有:将文本字符串括在引号内。

水晶报表开发

创建简单水晶报表步骤 1:打开VS工具,新建解决方案和项目 2:先创建一个一个ds文件,在ds文件中添加一个datatable,并添加需要显示的列(此处的列和你从数据库中查询出来的字段名称相同),右击属性,选择相应字段的相应类型 3:创建水晶报表文件(rptShow) 选择标准- 在项目数据中找到刚刚创建好的数据集,并选择相应的datatable至右面的文本框中,点击完成,创建好报表文件。 5-1:在我做的报表文件中主要遇到的一个困难是求和;所以这里特别记录下 1:新建【运行总计字段】并取名,这里设计名称为:Sum_Qty

从报表字段中选择需要求和的字段,在汇总类型中选择和即可,此种方法为其一,还有一种方法则是建立好名称后,在公式工作室选择公式--→函数-→选择需要的函数并把相应的字段填充进去,我这里需要的是数量的求和,所以,选择好后是Sum(Qty) 即可,然后直接把之前创建好的名称放在报表文件中。 2:求和不同类型的数据,则需要进行判断,在我的数据库中有金和石两种数据,所以我要对石和金进行统计并求和。 同样需要创建运行总计字段,Sum_Qty,进入到公式工作室,找到刚刚创建好的运行总计字段名称(Sum_Qty),在右面的空白处写上判断 格式:if UOM=’G’ then 金的重量字段

4:调整好相应的格式,再新建一个项目文件(这里是针对winform程序,web的我还没试过,等试了再写) 5:在form表单中拉近一个报表显示控件,如图: 6:编写代码实现报表的显示: Dim rpt As New rptDetails ------rptDetails 指的前文创建的报表文件名称 Dim ds As New dsSummary.DeatilsQtyDataTable ------dsSummary(创建的数据集文件,DeatilsQtyDataTable 指的是数据集中,你想要使用的数据表,在此使用时,它会自动加上DataTable后缀,其实代表的就是你数据集中的DeatilsQty) rpt.SetDataSource(DBHelper.GetDetailsSummary(ds, PosCodes, txtFrom.Text.Trim,

相关主题
文本预览
相关文档 最新文档