以下是小编为大家整理的DELPHI报表的动态生成(共含8篇),仅供参考,欢迎大家阅读。同时,但愿您也能像本文投稿人“王路飞王陆王靖雯”一样,积极向本站投稿分享好文章。
DELPHI报表的动态生成
DELPHI报表的动态生成
(Create
DelphiDynamic Report)
河海大学计算机及信息工程学院研究生 段智勇
摘要:本文主要介绍如何在DELPHI开发环境下动态生成报表,给出公用模块,并结合具体示例分析了实现的主要技术问题,给出解决这些问题的技术细节。
关键词:DELPHI报表、动态创建
一、引言
报表是
数据库应用程序的重要部分,可是报表的生成也是数据库开发中最麻烦的一项工作。报表格式复杂多样,一直是使程序员头疼的事。DELPHI在其3.0以后版本中加入了QUICKREPORT,使这种情形有所改变。它的全部可视化编程以及设计和运行过程中都可以进行预览等特性给程序开发带来了很大的方便。我们可以通过在应用程序设计阶段往窗体中添加报表控件,再与数据库表组件Ttable,查询组件Tquery等数据访问组件相关联,从而实现报表的预览与报表的输出。但在许多应用程序中,程序员往往期望从静态或者动态生成的'数据库表中动态提取所需数据,进而生成报表输出。本文介绍的就是如何动态选择所需数据,动态生成报表的公用模块。这种动态方式生成的报表更加灵活,也更加容易做到报表的格式统一。
动态报表主要是在程序运行阶段利用Creat方法动态创建控件,设置其Parent属性来设置其容器控件。然后,在程序中根据所选择的数据库表中的数据字段的长度和数目,通过修改控件的大小和位置属性,来控制控件的大小和外观,如果该控件有事件,可直接把函数或过程名赋给它的相应事件名。
一.iText简介
iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库,通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。
iText的安装非常方便,在itextpdf.com/ 网站上下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。
二、建立第一个PDF文档
用iText生成PDF文档需要5个步骤:
①建立com.lowagie.text.Document对象的实例。
Document document = new Document;
②建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
PDFWriter.getInstance(document, new FileOutputStream(“Helloworld.PDF”));
③打开文档。
document.open();
④向文档中添加内容。
document.add(new Paragraph(“Hello World”));
⑤关闭文档。
document.close();
通过上面的5个步骤,就能产生一个Helloworld.PDF的文件,文件内容为“Hello World”。
建立com.lowagie.text.Document对象的实例
com.lowagie.text.Document对象的构建函数有三个,分别是:
public Document();
public Document(Rectangle pageSize);
public Document(Rectangle pageSize,
int marginLeft,
int marginRight,
int marginTop,
int marginBottom);
构建函数的参数pageSize是文档页面的大小,对于第一个构建函数,页面的大小为A4,同Document(PageSize.A4)的效果一样;对于第三个构建函数,参数marginLeft、marginRight、marginTop、marginBottom分别为左、右、上、下的页边距。
通过参数pageSize可以设定页面大小、面背景色、以及页面横向/纵向等属性。iText定义了A0-A10、AL、LETTER、HALFLETTER、_11x17、LEDGER、NOTE、B0-B5、ARCH_A-ARCH_E、FLSA 和FLSE等纸张类型,也可以通过Rectangle pageSize = new Rectangle(144, 720);自定义纸张。通过Rectangle方法rotate()可以将页面设置成横向。
书写器(Writer)对象
一旦文档(document)对象建立好之后,需要建立一个或多个书写器(Writer)对象与之关联。通过书写器(Writer)对象可以将具体文档存盘成需要的格式,如com.lowagie.text.PDF.PDFWriter可以将文档存成PDF文件,com.lowagie.text.html.HtmlWriter可以将文档存成html文件。
设定文档属性
在文档打开之前,可以设定文档的标题、主题、作者、关键字、装订方式、创建者、生产者、创建日期等属性,调用的方法分别是:
public boolean addTitle(String title)
public boolean addSubject(String subject)
public boolean addKeywords(String keywords)
public boolean addAuthor(String author)
public boolean addCreator(String creator)
public boolean addProducer()
public boolean addCreationDate()
public boolean addHeader(String name, String content)
其中方法addHeader对于PDF文档无效,addHeader仅对html文档有效,用于添加文档的头信息。
当新的页面产生之前,可以设定页面的大小、书签、脚注(HeaderFooter)等信息,调用的方法是:
public boolean setPageSize(Rectangle pageSize)
public boolean add(Watermark watermark)
public void removeWatermark()
public void setHeader(HeaderFooter header)
public void resetHeader()
public void setFooter(HeaderFooter footer)
public void resetFooter()
public void resetPageCount()
public void setPageCount(int pageN)
如果要设定第一页的页面属性,这些方法必须在文档打开之前调用。
对于PDF文档,iText还提供了文档的显示属性,通过调用书写器的setViewerPreferences方法可以控制文档打开时Acrobat Reader的显示属性,如是否单页显示、是否全屏显示、是否隐藏状态条等属性。
另外,iText也提供了对PDF文件的安全保护,通过书写器(Writer)的setEncryption方法,可以设定文档的用户口令、只读、可打印等属性。
添加文档内容
所有向文档添加的内容都是以对象为单位的,如Phrase、Paragraph、Table、Graphic对象等。比较常用的是段落(Paragraph)对象,用于向文档中添加一段文字。
四、文本处理
iText中用文本块(Chunk)、短语(Phrase)和段落(paragraph)处理文本。
文本块(Chunk)是处理文本的最小单位,有一串带格式(包括字体、颜色、大小)的字符串组成。如以下代码就是产生一个字体为HELVETICA、大小为10、带下划线的字符串:
Chunk chunk1 = new Chunk(“This text is underlined”, FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE));
短语(Phrase)由一个或多个文本块(Chunk)组成,短语(Phrase)也可以设定字体,但对于其中以设定过字体的文本块(Chunk)无效。通过短语(Phrase)成员函数add可以将一个文本块(Chunk)加到短语(Phrase)中,如:phrase6.add(chunk);
段落(paragraph)由一个或多个文本块(Chunk)或短语(Phrase)组成,相当于WORD文档中的段落概念,同样可以设定段落的字体大小、颜色等属性。另外也可以设定段落的首行缩进、对齐方式(左对齐、右对齐、居中对齐)。通过函数setAlignment可以设定段落的对齐方式,setAlignment的参数1为居中对齐、2为右对齐、3为左对齐,默认为左对齐。
五、表格处理
iText中处理表格的类为:com.lowagie.text.Table和com.lowagie.text.PDF.PDFPTable,对于比较简单的表格处理可以用com.lowagie.text.Table,但是如果要处理复杂的表格,这就需要com.lowagie.text.PDF.PDFPTable进行处理。这里就类com.lowagie.text.Table进行说明。
类com.lowagie.text.Table的构造函数有三个:
①Table (int columns)
②Table(int columns, int rows)
③Table(Properties attributes)
参数columns、rows、attributes分别为表格的列数、行数、表格属性。创建表格时必须指定表格的列数,而对于行数可以不用指定。
建立表格之后,可以设定表格的属性,如:边框宽度、边框颜色、衬距(padding space 即单元格之间的间距)大小等属性。下面通过一个简单的例子说明如何使用表格,代码如下:
Table table = new Table(3);
table.setBorderWidth(1);
table.setBorderColor(new Color(0, 0, 255));
table.setPadding(5);
table.setSpacing(5);
Cell cell = new Cell(“header”);
cell.setHeader(true);
cell.setColspan(3);
table.addCell(cell);
table.endHeaders();
cell = new Cell(“example cell with colspan 1 and rowspan 2”);
cell.setRowspan(2);
cell.setBorderColor(new Color(255, 0, 0));
table.addCell(cell);
table.addCell(“1.1”);
table.addCell(“2.1”);
table.addCell(“1.2”);
table.addCell(“2.2”);
table.addCell(“cell test1”);
cell = new Cell(“big cell”);
cell.setRowspan(2);
cell.setColspan(2);
table.addCell(cell);
table.addCell(“cell test2”);
运行结果如下:
header cell test2
代码1-5行用于新建一个表格,如代码所示,建立了一个列数为3的表格,并将边框宽度设为1,颜色为蓝色,衬距为5。
代码6-10行用于设定表格的表头,第7行cell.setHeader(true);是将该单元格作为表头信息显示;第8行cell.setColspan(3);指定了该单元格占3列;为表格添加表头信息时,要注意的是一旦表头信息添加完了之后,必须调用endHeaders()方法,如第10行,否则当表格跨页后,表头信息不会再显示。
代码11-14行是向表格中添加一个宽度占一列,长度占二行的单元格。
往表格中添加单元格(cell)时,按自左向右、从上而下的次序添加。如执行完11行代码后,表格的右下方出现2行2列的空白,这是再往表格添加单元格时,先填满这个空白,然后再另起一行,15-24行代码说明了这种添加顺序。
六、图像处理
iText中处理表格的类为com.lowagie.text.Image,目前iText支持的图像格式有:GIF, Jpeg, PNG, wmf等格式,对于不同的图像格式,iText用同样的构造函数自动识别图像格式。通过下面的代码分别获得gif、jpg、png图像的实例。
Image gif = Image.getInstance(“vonnegut.gif”);
Image jpeg = Image.getInstance(“myKids.jpg”);
Image png = Image.getInstance(“hitchcock.png”);
图像的位置
图像的位置主要是指图像在文档中的对齐方式、图像和文本的位置关系。IText中通过函数public void setAlignment(int alignment)进行处理,参数alignment为Image.RIGHT、Image.MIDDLE、Image.LEFT分别指右对齐、居中、左对齐;当参数alignment为Image.TEXTWRAP、Image.UNDERLYING分别指文字绕图形显示、图形作为文字的背景显示。这两种参数可以结合以达到预期的效果,如setAlignment(Image.RIGHT|Image.TEXTWRAP)显示的效果为图像右对齐,文字围绕图像显示。
图像的尺寸和旋转
如果图像在文档中不按原尺寸显示,可以通过下面的函数进行设定:
public void scaleAbsolute(int newWidth, int newHeight)
public void scalePercent(int percent)
public void scalePercent(int percentX, int percentY)
函数public void scaleAbsolute(int newWidth, int newHeight)直接设定显示尺寸;函数public void scalePercent(int percent)设定显示比例,如scalePercent(50)表示显示的大小为原尺寸的50%;而函数scalePercent(int percentX, int percentY)则图像高宽的显示比例。
如果图像需要旋转一定角度之后在文档中显示,可以通过函数public void setRotation(double r)设定,参数r为弧度,如果旋转角度为30度,则参数r= Math.PI / 6。
七、中文处理
默认的iText字体设置不支持中文字体,需要下载远东字体包iTextAsian.jar,否则不能往PDF文档中输出中文字体。通过下面的代码就可以在文档中使用中文了:
BaseFont bfChinese = BaseFont.createFont(“STSong-Light”, “UniGB-UCS2-H”, BaseFont.NOT_EMBEDDED);
com.lowagie.text.Font FontChinese = new com.lowagie.text.Font(bfChinese, 12, com.lowagie.text.Font.NORMAL);
Paragraph pragraph=new Paragraph(“你好”, FontChinese);
八、分页处理
如果只是简单的显示当前页码,使用以下代码即可(设定了页面的大小后,会自动分页),
1 HeaderFooter footer = new HeaderFooter(new Phrase(“页码:”,keyfont), true);
2 footer.setBorder(Rectangle.NO_BORDER);
3 document.setHeader(footer);
如果要显示当前页码以及总页码。
则需要计算总页数,设定每页大小,使用pdf.newPage( )手动分页。
详见一下代码:
package com.foster;import java.io.File;import java.io.FileOutputStream;import java.util.ArrayList;import java.util.List;import com.lowagie.text.Cell;import com.lowagie.text.Document;import com.lowagie.text.DocumentException;import com.lowagie.text.Font;import com.lowagie.text.HeaderFooter;import com.lowagie.text.Image;import com.lowagie.text.Paragraph;import com.lowagie.text.Table;import com.lowagie.text.pdf.BaseFont;import com.lowagie.text.pdf.PdfPCell;import com.lowagie.text.pdf.PdfWriter;public class PDFReport { public static void main(String[] args) throws Exception, DocumentException { List 为了使副标题严格对齐,使用了表格table进行控制,但是却没能找到去掉表格边框的方法。 九、总结 总的来说,iText是一套java环境下不错的制作PDF的组件。因为iText支持jsp/javabean下的开发,这使得B/S应用中的报表问题能得到很好的解决。由于iText毕竟不是专门为制作报表设计,所有报表中的内容、格式都需要通过写代码实现,相对于那些专业的支持可视化设计的报表软件来说,编程的工作量就有一定程度的增加。 可以使用第三方专业控件进行对pdf,word文档的操作,例如pageoffice 在数据库应用程序 开发 中,系统设计员、程序设计员需要考虑的一个重要问题是如何设计和输出报表,在Delphi中我们可以采用多种方案来解决这一问题,如运用OLE自动化技术将数据输出到MS-Word、MS-Excel中等,但其中最直接、最 本地化 的还是使用Delphi3.0/40中的 在数据库应用程序开发中,系统设计员、程序设计员需要考虑的一个重要问题是如何设计和输出报表,在Delphi中我们可以采用多种方案来解决这一问题。如运用OLE自动化技术将数据输出到MS-Word、MS-Excel中等,但其中最直接、最本地化的还是使用Delphi3.0/40中的QuickReport报表组件。它是挪威QuSoft公司专门为Delphi 编写的,使QuickReport可以迅速设计出符合西方人习惯用的报表。 然而,在设计中国式报表时,笔者发现在QuickReport中设计列与列之间的竖线和斜线比较困难;虽然QuickReport提供了TQShape控件,使用该控件可以画出列与列之间的竖线,但如果用户不能正确地调整TQShape实例的高度,输出报表的竖线不是不连续就是超长,另外如果我们调整了某个Band的高度,我们将不得不调整该Band下的所有TQShape实例的高度;至于斜线,QuickReport报表组件根本就没有提供这一功能。 笔者认真查找了有关的资料,成功地解决了以上问题,希望能对大家有所帮助。 解决思路 以TQShape为父类,建立新的控件,新控件可以画竖线、斜线和反斜线。重载TQShape 类的Paint方法,这样在设计阶段可以非常直观地画坚线、斜线和反斜线。用户可以在设计阶段选择线的类型,如果选择直线,控件自动将其高度调整为所属Band的高度,用户可以调整其横向位置但不能调整其高度;如果选择斜线,用户可以根据需要调整斜线的长度和倾角。 重载TQShape 类的Print方法,这样可以在运行阶段输出直线和斜线。说明:该控件只能画直线和斜线,如果读者需要画矩形和圆,可以使用TQShape控件来实现。 控件设计步骤 步骤1.使用Delphi提供的控件向导,选择TQShape为父类,建立新类TMyQRShape,并选择适当的包(Package),最后生成单元文件。 步骤2.在生成的单元文件中,增加枚举类型。 TLines = ( None,TopBottom,BottomTop ) None、TopBottom、BottomTop三种取值,分别代表直线、斜线 \ 和反斜线 /。 步骤3.在新类TMyQRShape 中增加private 成员 FLineType:TLines ,增加published属性 LineType:TLines Read FLineType Write SetFLineType。 步骤4.建立过程SetFLineType。 procedure TMyQRShape.SetFLineType(value:TLines); begin if valueFLineType then begin FLineType:=value Invalidate end end 步骤5.重载Paint方法。 procedure TMyQRShape.Paint begin case LineType of BottomTop: begin Canvas.MoveTo(0,Height) Canvas.LineTo(width,0 ) end TopBottom: begin Canvas.MoveTo(0,0) Canvas.LineTo(width,Height ) end None: begin Height := Parent.Height Top:=0 Width:=4 Shape:=qrsVertLine Inherited Paint end end end 步骤6.重载Print方法。 procedure TMyQRShape.Print(OfsX,OfsY : Integer); begin with QRPrinter do begin case LineType of BottomTop: begin Canvas.MoveTo(XPos(OfsX + Size.Left), YPos(OfsY + Size.Top)+Height) Canvas.LineTo(XPos(OfsX + Size.Left)+width,YPos(OfsY + Size.Top) ) end TopBottom: begin Canvas.MoveTo(XPos(OfsX + Size.Left), YPos(OfsY + Size.Top)) Canvas.LineTo(XPos(OfsX + Size.Left)+Width,YPos(OfsY + Size.Top)+Height ) end None: Inherited Print(OfsX,OfsY ) end end end; 步骤7.保存并安装TMyQRShape控件, 本控件在Delphi40下调试、安装,并成功地应用于某数据库管理系统的开发中。该控件的完整代码如下: 源程序: unit MyQRShape; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, QuickRpt, Qrctrls; type TLines = ( None,TopBottom,BottomTop ) TMyQRShape = class(TQRShape) private FLineType:TLines procedure SetFLineType(value:TLines) protected procedure Print(OfsX, OfsY : integer); override; procedure Paint Override public published property LineType:TLines Read FLineType Write SetFLineType end; procedure Register; implementation procedure TMyQRShape.SetFLineType(value:TLines); begin if valueFLineType then begin FLineType:=value Invalidate end end procedure TMyQRShape.Paint begin case LineType of BottomTop: begin Canvas.MoveTo(0,Height) Canvas.LineTo(width,0 ) end TopBottom: begin Canvas.MoveTo(0,0) Canvas.LineTo(width,Height ) end None: begin Height := Parent.Height Top:=0 Width:=4 Shape:=qrsVertLine Inherited Paint end end end procedure TMyQRShape.Print(OfsX,OfsY : Integer); begin with QRPrinter do begin case LineType of BottomTop: begin Canvas.MoveTo(XPos(OfsX + Size.Left), YPos(OfsY + Size.Top)+Height) Canvas.LineTo(XPos(OfsX + Size.Left)+width,YPos(OfsY + Size.Top) ) end TopBottom: begin Canvas.MoveTo(XPos(OfsX + Size.Left), YPos(OfsY + Size.Top)) Canvas.LineTo(XPos(OfsX + Size.Left)+Width,YPos(OfsY + Size.Top)+Height ) end None: Inherited Print(OfsX,OfsY ) end end end; procedure Register; begin RegisterComponents(‘QReport', [TMyQRShape]); end; end. 原文转自:www.ltesting.net 教程贴士:灵活的报表功能是大多数业务应用程序的一个要求,这些报表功能在集成到 Web 应用程序中之后用途更加广泛 灵活的报表功能是大多数业务应用程序的一个要求,这些报表功能在集成到 Web 应用程序中之后用途更加广泛,利用 SQL Server Reporting Services 的最新版本,您可以轻松地具有来自各种数据源的报表生成功能。在本文中,我将介绍使用 Visual Studio 和 Reporting Services 来编写报表,并演示如何将报表集成到 Web 应用程序中。 Reporting Services 是基于服务器的报表生成平台,该平台构建在 .NET Framework 上并与 SQL Server 2000 集成在一起,因此您可以使用一个扩展的基于 Web 服务的 API 将丰富的报表生成功能集成到应用程序中。尽管报表服务器使用 SQL Server 作为报表的储存库,但利用 OLE DB、ODBC 或 ADO.NET 提供程序的任何数据源都可以用来为报表提供数据,这就使得 Reporting Services 成为在各种企业环境中生成报表的极佳工具。 Reporting Services 是作为 SQL Server 2000 的一部分而授权的,因此如果您有已授权的 SQL Server 的副本,则可以在同一服务器上运行 Reporting Services 而无需支付额外的许可证费用。如果您决定在独立的、尚未经 SQL Server 授权的计算机(例如,Web 服务器)上运行 Reporting Services,您将需要购买额外的 SQL Server 许可证。 要开始使用 Reporting Services,您可以下载位于 SQL Server 2000 Reporting Services 的 120 天试用版软件,它还包括有关如何获得该产品的安装媒体的说明。在安装该产品时,请确保选中包括示例报表的选项,因为我要将这些报表集成到本文的 Web 应用程序中。 Reporting Services 概述 Reporting Services 报表设计使用新的 Visual Studio .NET 报表设计器,在安装有 Visual Studio 的同一计算机上安装了 Reporting Services 后,该设计器就可以使用。设计器以新的基于 XML 报表定义语言 (RDL) 输出报表布局和数据访问的说明,而 RDL 文件会发布到报表服务器。如果您希望为用户提供创作功能,也可以使用第三方的报表设计器。 管理员可以使用基于 Web 的报表管理器来管理已发布的报表,并且可以执行一些任务,例如,保证某些用户组报表的安全或更改已部署报表的数据源连接字符串。用户也可以使用报表管理器来浏览和查看报表;但是很多公司倾向于使用 URL 请求或 Reporting Services Web 服务,将报表查看直接集成到它们现有的内部 Web 站点或应用程序中。 图 1 Reporting Services 体系结构 可以将报表参数化,这样用户可以在查看报表时从选择列表中进行挑选;它们还可以导出为多种格式,例如,MicrosoftExcel、PDF 和 XML。尽管实时报表提供最新的数据,也可以将报表缓存一段时间以提高性能并减少数据源上的负载。对于商务智能应用程序,报表可以访问 Analysis Services OLAP 多维数据集,而且 Reporting Services 甚至可以导入现有的 Microsoft Access 报表,尽管由于这两种技术间存在差异,它并不能支持所有的 Access 功能, 有关 Reporting Services 体系结构的详细情况,请参见图 1。 设计第一个报表 尽管我介绍的重点在于将报表集成到应用程序中而不是创作报表,但熟悉 Reporting Services 的最好办法就是立即着手创建一个新的报表项目。为此,请打开 Visual Studio 并使用 Report Project Wizard 创建一个新的项目,该向导位于 Business Intelligence Projects 部分。为您的项目指定一个名称,单击“OK”,然后将显示报表向导对话框。在您选择数据源的这一步骤中,单击“Edit”按钮,以便指定连接到您数据库服务器上的 AdventureWorks2000,单击“OK”,然后选中使其成为共享数据源的选项。 单击“Next”进入到“Design the Query”步骤,指定简单的 SQL 语句(例如,“SELECT * FROM Product”),然后单击“Next”。Reporting Services 支持显示一组固定列的标准表格式 (Tabular) 报表,也支持使用带有动态列的交叉表样式视图的矩阵式 (Matrix) 报表,因此为该报表选择 Tabular,然后单击“Next”。 将某些列(例如,ProductID 和 Name)拖到 Details 部分并单击“Next”。选择默认的 Bold 样式,单击“Next”,然后指定您的报表服务器的虚拟目录的 URL,例如,MyServer/ReportServer。现在,单击“Next”。最后一步,您可以为您的第一个报表指定名称,例如,Products Report;然后单击“Finish”。 该向导将会创建该项目,同时还创建一个可以由多个报表共享 AdventureWorks2000 数据源,以及一个在设计器中打开的有关 Products 数据的报表(请参见图 2)。默认情况下,显示使您可以修改报表设计的 Layout 选项卡。 图 2 Visual Studio 报表设计器 Data 选项卡用于指定报表的查询,包括设置参数以便在执行报表时提示用户提供值。单击“Preview”选项卡来测试报表显示给用户的方式。 现在,您可以将附加的报表添加到该项目,或者通过添加附加列、将数据分组、添加汇总、甚至是添加能够显示来自其他查询的数据的附加表来修改 Products 报表。与很多报表设计器不同,Reporting Services 使用带外设计,这使得它可以轻松地创建将各种源的数据集中在同一个位置的报表。 您刚刚创建的报表项目由当前驻留在您的开发计算机上的一组文件组成。为了将这些报表发布给用户,您需要将该项目部署到报表服务器。 部署和测试 在部署报表项目之前,需要指定将项目部署到哪一个服务器。如果您最初使用该向导创建了报表项目,那么您可能已经指定了目标服务器。 要检查该设置或指定一个新服务器,请选择“Project | Properties”来显示 Project Properties 对话框。进行该设置使您可以指定项目的文件夹名和 Reporting Services Web 服务的 URL。在菜单上选择“Build | Deploy Solution”将构建报表项目,然后将其部署到服务器。 在部署报表项目后,您就可以进行测试了。已部署到服务器的每个报表都具有唯一的路径,该路径可以用于在浏览器中显示报表。例如,要显示您创建的第一个报表,请打开浏览器并导航到 MyServer/ReportServer?/Report+Project1/Products+Report。这会以 HTML 格式呈现报表并在页面的顶端显示一个工具栏,以便使您可以对报表进行翻页、更改缩放比例,甚至以各种其他格式(例如 敢问“动态生成”路在何方篇3:用Delphi制作中国式报表.net
篇4:MSSQL Reporting Services生成报表
篇5:敢问“动态生成”路在何方
敢问“动态生成”路在何方
敢问“动态生成”路在何方浙江省瑞安市平阳坑镇学校 谢尚江 戴少霄 “动态生成”是新课程改革的核心理念之一,它要求教师从生命的高度,用动态生成的观点看待课堂教学。它要求教师在课堂教学中不是机械地执行预设方案,而是注重学生的发展,突出学生在课堂上的能动性、创造性和差异性,尊重学生在课堂上的独立人格,在课堂特定的生态环境中,根据师生、生生互动的情况,顺着学生的思路,因势利导地组织适合学生参与的、自主创新的教学活动。然而,动态生成该“生”在何方?我对此进行分析、总结,以飨读者。一、教学目标的动态生成 语文教学目标的设定必须体现语文课程标准的总体目标和阶段目标。但是,就具体落实每课时的教学而言,目标过于定量、精确,形成封闭,则会事倍功半。其一,程序化教学会束缚教师的思想,视课堂为执行教案过程,以致不敢“越雷池半步”,教学机械、沉闷、缺乏生气和乐趣,缺乏对智慧的挑战;其二,漠视学生的自主性和创造性,抑制学生思维,痛失众多无法预约的课堂资源。 袁振国教授说:“或许我们得到了大海里露出水面的冰山的一角,而失去的却是大海下的整座冰山的主体。”学生是教学目标设计的'出发点和归属点,精细的课时目标,往往会忽略最有价值的个性发展和塑造人格的功能。教学目标的设定中做到适度模糊、开放,有助于展示学生丰富、独特的内心世界,有助于教师重新组合和建构文本,为师生留有灵活操作和活动空间,这样才能使语文教育(www.35d1.com-上网第一站35d1教育网)成为学生心灵的一片绿洲,生命的一股源泉。二、课程资源的动态生成 语文教学资源包括静态语文教学资源(如文本、教具……)和动态语文教学资源(如教师教学时的灵感、学生的突发事件……)。布卢姆说:“人们无法预料教学所产生的成果的全部范围,没有预料不到的结果,教学也就不成为艺术了。”以往课程只强调课程知识静态一面,突出课程文本,忽视学生的情感和体验。新课程理念下的课程不仅是文本课程,更是体验课程,课程不再只是知识的载体,而是教师和学生共同探究新知识的过程。请看一老师是如何指教《丑小鸭》一课: (初读课文后) 生:老师,我觉得课文里的“他”字写错了,应该是“它”。 (话音刚落,立刻有些学生响应) 师:(很有兴趣地问)为什么呀? 生:因为课文里写的是鸭子呀! 师:老师觉得娟娟同学很勇敢,能清楚得讲出和课文不同的意见,而且有自己的道理!其他同学有不同看法吗? (稍等片刻,学生依然沉默) 师:同学们可以再默读课[1] [2] [3]
瑞安教师
【内容摘要】动态生成是当前课程改革的热点,给语文课堂带来生命的活力。本文着重论述了动态生成容易产生的三种现象及其对策。
【关 键 词】动态生成 谨慎看待 语言训练 文本解读 面向全体
“动态生成”是当前新课程改革热点问题,翻开主流的教学杂志便不难发现这一现象。从专家到广大一线教师,有的从理论高度上进行研究,有的结合实际从操作实践中提炼,大家各施其法一起来探究课堂的动态生成,这是非常好的现象。当我们看到动态生成给课堂带来生命活力的时候,也发现课堂动态生成存存在这样的现象:
现象一:淡化语言训练
如:在讲《月光曲》一课时,让学生抓住“盲姑娘睁的大大的眼睛,仿佛看到了从来没有看到过的景象”展开想象,盲姑娘还会看到什么呢?学生纷纷发表自己的意见:
一学生说:看到了明亮的月光照在大海上,天空白云朵朵;
一学生说:洁白的月亮在轻纱似的白云里飞开的穿过。
有个学生说:老师我认为他们的想象是不对,盲姑娘应该很小就瞎了,她没有看过这些东西她怎么进行想象呢?
有几个学生也附和着说有道理,有几个学生把手高高举起,嘴里念着:我知道,我来说。
看到这种情况教师就引导学生讨论:这个盲姑娘到底能不能联想到白云?
生:我认为不能,她是瞎子没有看见过白云,自然就不知道白云的样子,她就没有想象的基础,是想象不出来白云的。
生:我认为可以,她也许小时候没有瞎的,那就看见白云,所以是可以想象的。
生:就算她小时侯见过白云,但时间那样那样长了,也已经记不清楚了,再说那时候她很小。
……
半节课的时间就在学生生活的经验讨论中你一言我一语,学生的收获是什么呢?语文的能力提高了?感悟深刻了?显然不是不的。
措施:
新课程标准指出:工具性是语文课程的特点之一,能否很好地掌握好这个工具对学生今后的学习、工作有着重大的影响。培养学生识字写字能力、阅读能力、写作能力、口语交际能力是语文课堂教学的主要任务。这些语文能力的提高与发展都依托为语言,一旦脱离语言训练,语文能力与语文素质的形成就如无水之鱼无从谈起。
扎实有效的语言训练都有一个系统的过程,这个系统的过程事先必须有充分的预设,动态生成的不确定性增加了预设的难度。在预设课堂教学里只用设计一种教学过程就可以达到训练的目的,而在生成的课堂里事先需要设计好多种训练方式。为了把学生导入预设的训练目标,需要教师机智的引导,在瞬息万变的课堂里抓住稍纵即逝的训练点进行语言训练,让语文课堂真正的充满生命的活力。
现象二:异化文本解读
前段时间,我听一位老师在上《惊弓之鸟》,正当这位老师引导学生体会更羸仔细观察、善于分析的时候,有位学生站起来说:老师我认为更羸不爱护我们的动物,知道大雁受过伤,听到弦响心里会害怕,一害怕就会使劲往高处飞,伤口就会裂开掉下来,他还那样走。另位学生立刻站起来说:这个责任不在更羸,应该是第一个射伤大雁的人。这位老师本着尊重学生的独特体验,这样一拨:那这个责任是谁呢?学生纷纷举手。教师让学生先讨论,然后让学生说责任在谁,并说说理由。结果大部分学生都说责任在更羸,学生说了许多更羸的不是,课堂气氛显得相当活跃。一时间课堂成了批判更羸的大会,一节课下来,更羸成了学生心中的十恶不赦的人与杀死大雁的罪魁祸首。试问作者与编者的意图是想在学生的心目中树立起更羸这个恶人的现象吗?
有位老师在上狐狸和乌鸦的时候,让学生谈谈对狐狸和乌鸦的看法时候,出现了这样的情况:
生:乌鸦它是一只很好骗的鸟,很笨。
生:乌鸦这个人虚荣心太强了,一心只想听好话,所以才被别人骗了。
生:狐狸的计策真多,但老骗人不好。
生:狐狸真会动脑筋,真会想办法。
生:狐狸做事永不放弃,非做到成功不可,很值得我学习。
措施:
由于学生的知识能力与生活体验所限,对文本的理解往往是有偏差的。本着尊重学生独特体验和阅读是个性化的行为原则,以学生课堂表现为中心的动态生成对文本的解读容易出现异化现象。
每篇文章从作者角度看有他写作意图,从编写教材角度看有编写角度的意图。教师应该有一个清晰的认识,在预设教案的时候要把他们的意图融入自己的预设中,从而使课堂达到作者、编者、学生、教师四位一体。表面看起来动态生成的课堂是学生的表现决定课堂的走向,其实作为学生课堂学习的首席与合作者的教师,应该在关键的时刻起着引路人的作用。
现象三:弱化面向全体
有位老师在讲《草船借箭》一课的时候,在学生感知课文内容的情况下,教师引导:课文中一共写了几个人?你最喜欢谁呢?说说你的理由。
生:我最喜欢鲁肃,他很守信用,答应别人的事情就做到。
生:我不同意他的意见,鲁肃这个人不忠,他是周瑜的手下却不向周瑜汇报实情。
这个老师发现这个学生对文本的理解有差错,就见机引导:鲁肃这样做是不是不忠呢?结果学生进入了讨论鲁肃忠不忠的问题上。对这个问题感兴趣的五、六位学生就各自发表自己的意见,个个说的头头是道,一时间难以谁说服谁。这个教师看看情形不对,立即来个小结:看来大家都有自己的道理,我们下次开个辩论会吧,下面我们继续来汇报你喜欢谁?说说你的理由。这个时候课堂才停止了争论,但那几个学生还是在那里还心中不服对方,对接下去老师与同学的发言始终没有很好的听。
我们暂且不去说这几个讨论的学生,我们再看看在这几个学生讨论的时候其余的学生在做什么呢?他们纯是一群看客,这个生成仅仅是相对于那几个讨论学生而言的,不是面对全体学生的。有人会说,那教师不要去引导生成好了,但学生对文本理解有误的时候我们能无动于衷吗?那不是放弃了教师的主导地位吗?
措施:
语文课程必须面对全体,我们的课堂教学面对的是一个整体,全体的提高与发展才是我们语文课堂教学的目标。换句话说,我们语文课堂教学是提高全体学生的语文素养,面对少数与个别的不是我们语文课堂教学所提倡的方向。
动态生成导向应该立足于全体,引导的点应该是大部分学生所感兴趣的,能引起他们思考的问题。其次引导的出发点应该是立足于文本语言,以课文语言进行引导设计,再用课文语言中感悟出自己的体会,这样既有利于全体学生的参与思考,又助于学生的独特体验。
动态生成虽是我们新课程改革的核心,它带给课堂的活力与生命力都是前所未有的,在动态生成的过程中教师要树立起明确的目标,让看起来不确定的课堂“动态生成”沿着一定的轨迹运行。
参考文献:
[1]中华人民共和国教育部. 语文课程标准(实验搞),第1版,北京,北京师范大学出版社,20
[2]王慧琴.“课堂任意生成”的透视与反思,中国语文教学论坛,(05),P42-43
[3]付永飞. 『价值取向』『独特体验』孰先孰后,小学语文教师,2005(5),P24-26
作者邮箱: mxq609@163.com
[动态生成的三种现象(网友来稿)]
一堂动态生成的作文课
一堂动态生成的作文课福建省连江县教师进修校附属小学 张新兴
【设计理念】
《语文课程标准》指出:“在写作教学中,应注重培养观察、思考、表现、评价的能力。”“应抓住取材、构思、起草、加工等环节,让学生在写作实践中学会写作。”根据“动态作文教学”理论,语文教师要创造性地开展多种形式的作文实践活动,围绕学生的生活兴趣点在动态生成中展开习作教学指导,使学生在喜闻乐见的情境活动中动心、动情、动笔,提高学生观察、选材、构思、表达的能力。
【课前准备】
一枚一元硬币,一个衣服毛刷,一个洗鞋刷子。
【教学过程】
(课前热身,谈话激趣。)
1.学生喊出自己的口号:附小出神童,神童就是我!
2.告诉学生:今天课堂上,需要用心观察、敢于疑问、能说会道、下笔成文。
一、进入情境,观察口述
(一)猜想
1.教师向学生出示一元硬币、一把刷子。你们猜一猜:这是干什么的?
(学生兴趣盎然,私下议论:老师耍魔术?老师学刘谦吗?是不是要刷皮鞋?……)
2.激趣。
师:同学们,看得出你们来劲了。现在,我把这枚硬币平放在手心,用刷子放在硬币上刷,你猜硬币会被刷下来吗?
生:会。
生:不会。
师:说出理由来。
(板书:猜想)
生:……
师:请把刚才的情景说一说。
(生说,老师评价。)
【评析:动态作文教学在课堂上主要体现思维方式的“动”。在老师的激发下,学生兴趣盎然,课堂充满生气,为作文教学铺设了前提。】
(二)演示情境,观察体验
(教师用刷子在硬币上用力刷。)
师:看到了吗?结果怎样?
生:硬币还在手心。
师:也许老师力气太小,谁上来试―下?
(分别请两个男生、两个女生上来刷,结果硬币还在手心一动不动。)
师:你们有疑问吗?
生:手心有点凹下去,放在手背上吧,也许会被刷下来。
师:说实话,张老师还没有想到这点呢。你们猜猜结果会怎样?
(学生屏息凝视,结果硬币还是纹丝不动。)
生:硬币放在我的手背上,让我来试试。
(连续三个学生上来体验,用力刷,可是硬币寸步不移。于是学生议论纷纷。)
师:请同学们来说一说:你注意观察了吗?请把刷硬币时手的动作、人物的神情、自己的心理活动和同学们的表现说出来。
生:……
(板书:实验)
【评析:叶澜教授说,动态生成就是根据学生学习的情况,由教师灵活地调整,生成新的超出原计划的教学流程,使课堂处在动态和不断生成的过程中,以满足学生自主学习的要求。这个环节体现了教师开放作文过程,打破以教师为中心的藩篱,让学生参与活动,在活动中观察,在观察中思考,在实践中体验,并且指导学生选择、积累写作素材。】
(三)疑问生成,重新体验
1.换硬币。(语文教学论文 )正在大家议论得不可开交的时候,一个学生站起来说:“张老师,我这里有一枚一角的硬币,这枚硬币轻,也许能被刷子刷下来。”这可是我事先意料不到的情况!为了尊重学生,那就顺学而行吧。
师:同学们,刚才这个同学认为一元硬币太重,这回换一枚轻的硬币。我们请她来尝试。
(学生把硬币先放在手心后放在手背上刷,都没有刷下来。我悬着的心放下了。)
师:有疑问吗?
生:老师,不会是你的刷子太软了吧?换把硬的刷子来。
师:这个建议好!还好张老师留了一手,事先带了把洗布鞋的硬刷子。
2.换刷子。换洗鞋子的刷子刷,硬币仍然刷不下来。
(板书:疑问、再实验)
学生再也想不出其他法子来了。但是他们情绪高涨,大有“欲要看究竟”的渴望。
3.师(趁机激发思维):此时,你的心里想的是什么?
(采访几个学生。)
【评析:聂闻说,动态作文教学,就是在动态生成中围绕学生的生活兴趣点来展开习作教学,观照习作教学过程中的每一个环节和步骤,尊重“依生而变,顺情而导,动态推进”的原则进行习作教学。这个环节,教师是学生学习的伙伴,是组织者,也是促进者。从手心到手背,从重硬币到轻硬币,又从软刷子到硬刷子,顺学而教,顺学而导,师生共同推进作文教学过程,丰满活动的内容。】
(四)探究发现,自由表达
师:此时你们的心情怎么样?
生:我心里有一团疑云,这究竟是什么原因呢?
生:我在想这是不是个魔术?
生:我真想手中有一本《(十万个为什么》,从中找到答案。
师:你们想知道其中的原理吗?请认真观察――
老师再次演示,请学生仔细观察刷子的毛在硬币身上的作用。(学生表述不是很到位)老师一边慢动作刷,一边解说原理:当我刷硬币时,是往右刷的,但刷子的毛却是向左弯曲的.,毛的作用力和我刷硬币的作用力相抵消。学生恍然大悟,长舒了一口气。
(板书:揭示奥秘)
师:实验活动结束了,你有什么感想或者启示?
生:原来生活中还藏着科学的奥秘啊!
生:只有认真观察,善于思考,才能够发现事物的原理。
生:我们需要好奇心,更需要一双发现的眼睛。
(板书:感想、启示)
【评析:“动态”作文课堂是师生互动、心灵对话的舞台,是学生质疑问难、寻求真理的场所,是探究生成文化的地方。这时,教师发现学生在知识、情感和心理上不断生成的需求,引导学生探究,使学生思维动态开放,充分表现智慧。】
二、试写情境,拟定题目
1.师:同学们,今天的刷硬币活动,有了大家的参与,内容更加丰富了’你们把活动过程写下来有困难吗?
生:没有。
师:下面我们来回忆这次实验活动,分组写部分片段(或写感受深刻的部分)。
一组:写猜想;
二组:写初次实验;
三组:写疑问、再实验;
四组:写揭示奥秘、感想、启示。
那么赶快下笔吧,时间10分钟。
(学生面带微笑,轻松愉快地下笔成文,十分顺手。)
2.大家互相交流,共同评价,互相修改。
【评析:在观察中体验,在体验中思考,在探究中释疑,教师无需指导写作知识,动态的作文教学过程已经成就了学生的自由表达、乐于表达。】
3.拟定题目。
师:你们根据自己的感受,可以给作文拟一个什么题目?
生:《刷硬币》《刷硬币的启示》《一次有趣的实验》《手上魔术》《小实验,大道理》《顽皮的硬币》……
师:题目很好,我相信你们的作文会写得更好。
【评析:命题指导,放手让学,学生自拟题目不一,真正地关注了学生主体的情感动态,激活了作文课堂的流程,使学生“活”起来,让作文课堂“动”起来。唯有动态生成,才能使课堂教学充满生机和活力。】
三、修改补充,完成全文
附学生作文:
刷硬币的启示
五(4)班 程迪
今天,我来到作文培优班,看见的不是老师那张严肃的脸,而是老师神秘兮兮的笑脸,我想:张老师今天要我们写什么作文呢?
张老师好像看出了我的心思,他把左手伸出来,在手心里放上一枚一元硬币,右手拿起一把刷子。咦?这是要干什么呢?老师要学刘谦耍魔术?真新鲜!正在大家议论纷纷的时候,张老师说:“今天,我们来做一个实验,实验的名字叫――”“叫什么呀?”我们急切地问。这时,张老师说:“我们来做刷硬币的实验,你们猜一猜,我用这把毛刷去刷手心里的硬币,硬币会不会掉下来呀?”话音刚落,培优班里顿时炸开了锅:
“会掉下来的,如果不掉,我就是猪,如果掉下来,你便是猪,怎么样,敢不敢和我打赌,嘿嘿,不敢了吧!”同桌得意洋洋地看着我说。
“哼,有什么不敢的,赌就赌。”我不服气地回答道。
张老师急忙说:“那我们来试试看吧!”
只见张老师用毛刷在那枚硬币上使劲一刷,硬币不掉,再刷一次,还是不掉。我可不想落下猪的美名,便气冲冲地走上前去,拿过毛刷,使劲刷。可是这枚冥顽不化的硬币还是悠闲地趴在老师手心上,好像在说:“我不下来,我就不下来,看你能把我怎么样!”
我眼珠一转,对老师说:“哦,我知道了,老师手心有点凹,如果放在手背上,铁定能刷下来。”我信心十足。
“是啊!放在手背上刷刷看!”同学们也叫嚷着。
老师一听,赶紧把硬币放在手背上,又使劲一刷,还是刷不下来。我的心中打了一个大大的问号。
老师还想说什么,班里又沸腾了,同学们七嘴八舌地议论起来:
“咦,老师是不是在硬币上做了手脚?”“手上会不会有粘液?”“大概刷子太软了吧!”……
我把手放进裤兜里,摸到了一个硬邦邦的东西,掏出来一看,原来是一枚一角硬币。我的脑海里闪过一道光,似乎明白了什么,便走上前去,对老师说:“老师,一元硬币太重了,用这个一角硬币试试吧!”
老师清了清嗓子,对同学们说:“刚才有一个同学说,一元的硬币太重了,一角的硬币有可能刷下来,我们现在就来试一试。”
老师用刷子在硬币上反复刷,硬币还是不下来,我愣住了:“这里面一定有奥妙!”
张老师好像看透了我的心思,就说:“现在,就让我们揭晓这个谜底吧!”
只见张老师又把硬币放在手背上,我们都瞪大双眼观察着,老师边演示边对我们说:“你们看见没有,当我刷硬币时,是往左刷的,但刷子上的毛却是向右弯的,毛的作用力和我刷硬币的作用力相抵消,这样一来,硬币就寸步不移、纹丝不动啦!”
“哦,原来道理这么简单,我怎么没想到呢!”我恍然大悟。
看来生活中有许多科学原理,只要仔细观察,用心思考,一定会有新发现的。
★ 汇报表
★ 对联生成
★ 报表会计工作总结
★ 姓氏座右铭生成