




免费预览已结束,剩余74页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
索引水晶报表程序控制上有两种模式,也就是传说中的PULL模式和PUSH模式。口语化点就是拉模式和推模式。 把这个放在最开始讲,是因为模式的选择,会影响到后续的开发。 特别是看到一些使用者,把两种模式的代码里捏在一个过程里,出了错误,都不知道怎么去调试。 本文将讲解两种模式的基本原理,区别,以及各自的优缺点,还有部分开发报表的基本原则。 同样,本文是没有代码的,代码将从下一篇文章开始。 1.1 拉(PULL)模式: 由水晶报表模板(引擎)直接连接数据库(源),从数据库(源)里拉取数据 就是我们在水晶报表里设置好数据库信息,以及相关的表。 当我们在程序中调用水晶报表引擎,挂载模板后,水晶报表引擎会根据模板里的数据库信息,及表信息主动连接数据库, 返回数据给报表模板,模板根据设计样式进行呈现。 基本流程如下图所示 (图1-1-1) 1.2 推(PUSH)模式: 由应用程序从数据库(源)获取数据,然后把数据推送给水晶报表引擎。水晶报表本身不不跟数据库进行交互。 其基本流程图如下 (图1-1-2) 对比两个图,黑色的箭头表示我们要自己进行编码,蓝色的箭头表示是水晶报表与数据源的自动交互过程,不需编码。 这样我们很容易看到,使用PUSH模式将会比PULL模式多了不少代码。 而且因为PULL模式是直连数据库,比PUSH模式的先获取数据结果,然后推送给水晶报表少了一个过程。而中间结果集本身就占用系统资源。 所以PULL模式比PUSH执行效率高。 那么两者的差异就出来了 1:PULL模式代码量少 2:PULL模式执行效率高 3:实际开发过的朋友也有体会,使用PULL模式,模板开发的速度也比PUSH模式模板简单一些 这几点上,似乎PULL模式已经完全把PUSH模式打败了,呵呵。 那么为什么 PUSH模式还存在,且被大量使用呢? 我们再返回去看上面两个示意图, 大家注意到图1-1-1中,是由水晶报表连接的数据库,也就是说,水晶报表引擎单独占用了一个数据库连接。 而只有在水晶报表对象释放后,数据库连接才会释放(这个时段对系统时间来说,是比较长的,特别是如果要翻页等需要长时间连接数据库的情况)。 而在图1-1-2中,数据库是由应用程序去连接的,水晶报表本身不连接数据库。这样,系统就能使用公用的数据库连接。 这样一来,就节约了数据库的连接消耗。 这一点,在多用户的系统环境内,少一次数据库连接对系统性能的影响对系统的影响是比较关键的。 当然,我们也应该注意到,PUSH因为存在一个Dataset,所以会占用系统资源。 这两个方面大家需要综合考量。 这是个基本的,下面我在列一下PUSH的优势。 1:可以公用系统数据库连接,减少数据库连接损耗 2:可自由组合多数据源(如多数据库等),这一点PULL模式也可以实现,但是不如这个方便 3: 灵活多变 灵活多变的说法,是因为由于我们是把数据获取后,再PUSH给水晶报表的,那么在这个中间,就有很多数据再加工的可能性。 大家可以看一下我之前写的 动态(万能)水晶报表:任意表,任意列,动态格线调整 水晶报表动态表扩展 之 任意无关联表,任意列,任意数据源 水晶报表动态表扩展 之 任意SQL及任意有关联表,任意列 及其他 好了,总结一下: 1:CS模式或小型系统,建议用PULL模式,大型BS系统,建议用PUSH模式。 但这不是绝对的,可以根据实际情况混用。如果是大数据量的清单类的报表,建议用PULL。 2:无论什么模式,返回尽可能少的数据给报表。 3:通常情况下,无论是PULL还是PUSH模式,数据源处理部分只负责把数据传给报表,至于怎么呈现是报表里去做的 有的人问到:做交叉表怎么传数据,做图表怎么传数据,做列表怎么传数据,实质上,做法都是一样的。 当然,特殊情况除外。如:SQL交叉表,自定义图表等等。PULL模式样板招式以 Web应用为例 首先,新建一个A CrystalReports站点 稍等一会后会出来一个默认的水晶报表向导 确定后,选择“创建新连接” 这里我用的是Oracle数据库,填写数据库参数 连接成功会,会显示数据库中的表,选需要的表,点到右边的框中 进入下一界面,把要显示的字段点到右边的框中 直接点“完成”(后面还有一些步骤,暂时用不着)进入模板界面 因为是直连数据库的,所以我们能马上看到实际的效果,点模板下面的“主报表预览” 至此,我们没有编写任何代码。 运行一下看看,呀!有这个提示,而且输入框不让输入 代码上场(实质上代码也有好几种写法,不过原理基本一样,此处可直接照搬,等以后大家熟悉了再自行尝试吧) C# code using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using CrystalDecisions.Shared;using CrystalDecisions.CrystalReports.Engine;using CrystalDecisions.Web;public partial class _Default : System.Web.UI.Page /水晶报表对象 private ReportDocument myReport; private void ConfigureCrystalReports() / 定义ReportDocument对象,装载Crystalreport1.rpt myReport = new ReportDocument(); string reportPath = Server.MapPath(Crystalreport1.rpt); myReport.Load(reportPath); /定义水晶报表的数据库连接信息 ConnectionInfo connectionInfo = new ConnectionInfo(); connectionInfo.DatabaseName = user; connectionInfo.UserID = pwd; connectionInfo.Password = *; connectionInfo.ServerName = myoraServer; /将数据库信息传递给报表 SetDBLogonForReport(connectionInfo, myReport); /把模板对象赋给报表前端呈现控件CrystalReportViewer1 CrystalReportViewer1.ReportSource = myReport; private void SetDBLogonForReport(ConnectionInfo connectionInfo, ReportDocument reportDocument) Tables tables = reportDocument.Database.Tables; foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables) TableLogOnInfo tableLogonInfo = table.LogOnInfo; tableLogonInfo.ConnectionInfo = connectionInfo; table.ApplyLogOnInfo(tableLogonInfo); / 注意:将代码防到Page_Init或Page_Load 中/VS2008必须放到Page_Init中 private void Page_Init(object sender, EventArgs e) ConfigureCrystalReports(); 再运行一下,好了。 很简单吧,呵呵。 通过更改代码里的数据库连接,可以切换到不同的数据库上去 前提是,目标库中用到的表名及结构要是一样的。 常见问题: 出现 这个图中的提示 一般是因为数据库信息输入错误或数据库停机导致的。PUSH模式样板招式新建一个 Asp.Net CrystalReports的网站 弹出下面这个界面后,选第2项-作为空白报表,然后点确认,进入一个空白界面。 新建一个数据集合 出现此提示时,点“是” 然后还会出来连接数据库的提示,一律点否,直至界面上什么提示也没有 在这个界面上,点右键,添加一个datatable,命名为myTable。 然后在myTable里增加相应的列,我这里有3个列,注意要设置好类型。 特别说明: 因为水晶报表里不认datatime型,对于2009-06-26 9:23:15 会自动截断为2009-06-26 所以datatime型数据在xsd文件中,可设置为string型 而代码中的SQL中可把字段转换为String传入。 xsd设计完毕后,开始进入报表模板设计阶段。 在“数据库字段”上点右键,选“数据库专家” 再弹出的界面上,点“项目数据”,依次点开,找到我们刚才自己做的mytable 确定后,在“数据库专家”下面会出现表名mytable,点开后会看到字段, 把字段拖到模板上的详细资料节即完成基础模板的制作了 点一下预览,会看到虽然我们还没有任何实际的数据操作,但是界面上已经有数据了 这是水晶报表的一个虚拟数据,可以看到一个最终显示的效果。 好了,上代码 C# code using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using CrystalDecisions.Shared;using CrystalDecisions.CrystalReports.Engine;using CrystalDecisions.Web;using System.Data.OleDb;public partial class _Default : System.Web.UI.Page protected void Page_Load(object sender, EventArgs e) ConfigureCrystalReports(); private void ConfigureCrystalReports() /连接字串 String connstr = Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:CrZentestall.mdb; OleDbDataAdapter da = new OleDbDataAdapter(); OleDbConnection cn = new OleDbConnection(connstr); / da = new OleDbDataAdapter(SELECT * From RPT_CR_TEST1, cn); /创建我们的DataSet1实例 DataSet1 dt1 = new DataSet1(); /填充dt1 /注意:表名mytable必须与我们在xsd设计的表名称一致。 /本例中数据库的表实际名称为RPT_CR_TEST1,而最终是以mytable为准的 /使用 PUSH模式的优点就在此,可以自由组合SQL /前提是表名称和字段名(需要在SQL中使用as别名的方式跟xsd中设计的字段名一致)都要一致 da.Fill(dt1, mytable); ReportDocument myReport = new ReportDocument(); string reportPath = Server.MapPath(crystalreport1.rpt); myReport.Load(reportPath); /绑定数据集,注意,一个报表用一个数据集。 myReport.SetDataSource(dt1); CrystalReportViewer1.ReportSource = myReport; 然后运行就可以了。 这里做一下说明,在【推拉之间】没有说这个xsd,是因为当时没讲到细节操作。 说了很难理解。 这个xsd,是我们自己构造的,做个比喻吧: 就是xsd比作个一个架子,它负责把水晶报表撑起来,但是是空的,没有内容 我们用 PUSH模式,把数据塞给它,把架子塞满,这样水晶报表也就能呈现出效果来 常见问题: 1:报表可以显示出来,但是没数据, 一般有以下几种情况 a:表中确实没数据 b:da.Fill(dt1, mytable);表名称与xsd中设计的表不一致 c: 如果你用了多个表,可能是因为表默认的关联关系导致无数据 2:出现下面这个图的提示,特别是翻页、打印、导出的时候,因为这些动作都需要重新连接数据库源。 a:如果是多表的话,可能是部分表没有赋值。 水晶报表需要对用到的每个表进行验证,即使没数据。没有的话,传个空的记录集也行。 b:代码没有放到Page_Load或Page_init里,或者是放到了,但是控制了 postback。 因为http是无状态的,如果控制了postback,水晶报表就丢失了前面的设置,会导致出现此情况的信手拈来,掌控对象1.对象的操作 开始之前 先说一下,操作对象,是依靠ReportDocument, 基础代码如下: C# code ReportDocument myReport = new ReportDocument();string reportPath = Server.MapPath(crystalreport1.rpt);myReport.Load(reportPath);/PULL或PUSH方式的数据处理/. CrystalReportViewer1.ReportSource = myReport;/然后,才是下文中的代码关于水晶报表里的对象,我们直观的来看一下。 在模板空白处点邮件,选“插入”,鼠标放到“特殊字段”上,不要点,会出现如下菜单。 上面这些,都是报表对象或说是报表部件。恩,这些我们都可以进行控制。 操作的基本语法是: C# code myReport.ReportDefinition.ReportObjects对象序号.方法或属性;/或myReport.ReportDefinition.ReportObjects对象名称.方法或属性;对象序号在 .Net的水晶报表版本里很难直观的看出来,一般他是按加入报表的顺序来排的 这个很难去记住。有时候为了一些需要,在遍历的时候会用的到。 一般我们会用名称。 在对象上点右键,设置对象格式, 在出来的界面上就可以看到对象的名称 ReportObjects就是我们前面所指的报表对象集合,单一对象就是一个ReportObject 对于ReportObject来说,通用的属性有这样一些 一般我们可以控制对象的位置,通过控制左上角的坐标,也就是top和left属性。 这里说一下水晶报表的坐标系和计量单位。 水晶报表的坐标系,以每个节的左上角为原点,往下往右两个方向递增延展。 计量单位是缇,与厘米的换算关系是:1厘米=567缇 所以在后面的代码中,你会看到我有这样的写法: 567*N 其实也就是N厘米。 另外还有ObjectFormat下面的属性,可以控制对象的隐藏与显示,这个很实用吧,呵呵。 如抑制显示可以这样操作: C# code myReport.ReportDefinition.ReportObjects(text4).ObjectFormat.EnableSuppress = true;ReportObject是个通用对象,而其实际上又是一个具体的对象。他有各自的特殊属性。 以文本框为例,他就会多出一些特性,比如Text属性,这样我们可以修改到文本框的内容。 具体操作如下: C# code /更改一个文本框的内容TextObject x;x = (TextObject)myReport.ReportDefinition.ReportObjectstext4;x.Text = 我们的世界;另外说一下,前面没提到的数据字段,也可以这样操作。 C# code /调整字段的位置FieldObject fo;fo = (FieldObject)myReport.ReportDefinition.ReportObjectsNAME1;fo.Height = 567 * 3;fo.Width = 567 * 4;fo.Left = 567 * 1;每个对象都有各自不同的属性,至于具体有多少对象,你可以按一下F2, 在CrystalDecisions.CrystalReports.Engine这个命名空间下,以 Object结尾的,基本都是。 2:子报表里对象的操作 子报表里的对象操作跟主报表是一样的,主要是要先找到这个子报表对象。 下面这个方法是不对的 C# code SubreportObject subObj;subObj = (SubreportObject)myReport.ReportDefinition.ReportObjectssubreport1;这个只会定义子报表在主报表内的特性,不能设置到子报表内的部件 要这样 C# code myReport.Subreports子报表序号.ReportDefinition.ReportObjectsxx;/序号从0开始计数,单纯子报表的一个序号/或myReport.Subreports子报表名称.ReportDefinition.ReportObjectsxx;注意这个名称不是我们在子报表上点右键看到的名称,而是我们在设计子报表时指定的子报表名称 C# code TextObject subtext;subtext = (TextObject)myReport.Subreportsxyz.ReportDefinition.ReportObjectstext3;subtext.Text = 我是子报表里的内容哦; 3:参数的基本操作 参数是程序与报表交互的一个重要媒介,本节只做一个基础说明,后续的章节中会进一步介绍。 新建一个参数p1 拖到模板上,会自动显示为 ?pa1 代码中传递参数给报表的代码为: SetParameterValue 后面的几个参数依次为:参数名称,参数值,子报表名称(如果是子报表参数的话)。 C# code myReport.SetParameterValue(pa1, 我是一个参数);在子报表中建立一个新的参数spa1,注意xyz是子报表名称 C# code myReport.SetParameterValue(spa1, 我是一个参数,xyz);当然,参数也可以传递给CrystalreportViewer,这里就不展开说了,用到的时候再说。 单纯从这个代码上来看,textbox和参数似乎可以等价 但是textbox一般只能用于显示一个字符串,但是参数则可以参与公式,过滤数据,控制对象的一些特性等等,用途更广泛一些。 好了,就到这里。这个基本上没有什么需要特别注意的。 修正记录: 20090707: 坐标系原点应该是每个节的左上角,而不是整个模板的左上角数据过滤下一阶段,则主要讲解报表在拿到数据后的进一步处理。 大致会分为以下几个章节: 参数、函数与公式、运行时总计 分组 子报表 交叉表 图表 仍然是讲解基本概念和应用技巧以及应用场景,这些讲完,也基本完成了整个报表功能的基本介绍了。这些预计在7月份完成。 有时间的话,我会零散讲一下水晶易表(水晶报表的兄弟产品)的应用,看一下这个工具的酷炫效果。 1:PULL模式和PUSH模式的选择 PULL执行效率高,开发简单,适用于WinForm程序,用户不是很多的系统。 但是多了一个数据库连接,而且这个链接的占用时间还比较长,所以不适合用户多的系统。 有一种特例,就是数据量特别大的情况,我推荐用PULL。 PUSH则很灵活,可以承接任何数据源。比如不是从数据库里直接出来的数据,或者是来自于WebService等其他应用的数据接口。 2:WebForm开发的一个重要技巧:小代码,大作用 在前面的文章中,我一直是用WebForm演示的,主要是因为 HTTP是无状态的,在此链接的操作,不会带到下一连接中。 所以我们经常会遇到这样的情况,当前显示好的,在翻页、导出、打印等动作的时候,出出现无数据,或者需要重新登陆数据库的提示。 这是因为这些动作都重新触发了页面,导致我们前一次的操作丢失了。 所以之前的代码,我一直是写在Page_load里的,但是这样一是不能解决所有的问题,特别是涉及到有参数传递等情况。 二是可能会多次请求数据库,导致资源的消耗。 前面说到既然是状态丢失,那么我们可以用.Net里的session,cache或viewstate来进行保持状态。 这里我用session做一个范例,场景是这样的: 一个PUSH模式的报表,带一个参数p1. 界面上有一个Button,点击后展现报表。然后报表可以进行翻页、打印和导出(这些是工具条实现的,不进行编码实现)而不会出现错误提示。 其实只要改造两处地方即可,注意红色的部分。 public partial class _Default : System.Web.UI.Page protected void Page_Load(object sender, EventArgs e) /使用Session保持ReportDocument对像 /每次页面更新时,不再需要重新走数据库 /注意:如果是VS2008,这段代码要放到Page_Init事件中 If (SessionmyRpt!=null) then CrystalReportViewer1.ReportSource = (ReportDocument)SessionmyRpt; /点击按钮后,报表进行第一次呈现 protected void Button1_Click(object sender, EventArgs e) /连接字串 String connstr = Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:CrZentestall.mdb; OleDbDataAdapter da = new OleDbDataAdapter(); OleDbConnection cn = new OleDbConnection(connstr); da = new OleDbDataAdapter(SELECT * From RPT_CR_TEST1, cn); DataSet2 dt1 = new DataSet2(); da.Fill(dt1, RPT_CR_TEST1); ReportDocument myReport = new ReportDocument(); string reportPath = Server.MapPath(crystalreport1.rpt); myReport.Load(reportPath); /绑定数据集,注意,一个报表用一个数据集。 myReport.SetDataSource(dt1.Tables0); myReport.SetParameterValue(p1,参数测试); CrystalReportViewer1.ReportSource = myReport; /保存到Session SessionmyRpt=myReport; 完美Excel(上)本来这一篇要放到很后面去写,不过论坛里有人问到,就提前了。 很多人说水晶报表导出的Excel太难看,或者导出的Excel根本没法用,其实水晶报表是可以完整导出到Excel的 当然,水晶报表与其他基于CELL的报表工具相比,对Excel的支持是很弱的。而所谓的完美,是相对的。 我抓了大量的操作图来进行解说,或许大家会体会到为什么我会说水晶报表是一个操作性很强的工具的原因了。 一般我们画格线的时候,导出的Excel要么是乱的,要么是没格线。 有的朋友说我导出的时候选“显示网格线”就可以啊。 但是: 1: Web项目导出时没这个项目,只在Winform下有 2:用户是不会愿意去做这个事情的 下面的方法,是基于字段的边框来实现的,不是线条和框。本篇的目标是实现将报表导出到Excel后,显示成这样一个效果 第一步:基本操作方法 准备一个空的报表 把几个字段拖上去 为了便于精细操作,我们把模板放大一点。 视图-缩放,选一个150% 这样我们的模板就放大了,注意字段和字段之间是有间隙的(当然,不用放大也看得到,呵呵) 大家注意点这个图上有很多小点,这个就是报表的操作精度。 为了精细操作,设置这个精度小一点 进入如下菜单项目, 设置最小单位为0.1,当然还能再小,不过太小了反而操作起来更困难 然后我们再看,那个小点之间的间距明显变小了 保持第1个字段不动,点第2个,平行左移,不要太用力,很容易就拉到前一个字段的右边沿了。 做多了,就会有手感。一拉就行了。表头上的文本也会跟着动 依次操作完后,效果是这样的,注意,两个字段之间的间隙已经没有了 下面简单讲解一下一些简单的操作机器 横线字段的对齐,选中要对齐的字段(可以划拉一下选中,或者是Ctrl选),在其中一个上点右键,可以设置对齐方式和大小比例 纵向字段操作也是类似 好了完成了第一步。 第二步:加格线 选中表头上的所有字段,在其中一个上点右键,格式化多个对象 在出来的界面上,切换到模板标签页,设置边框线。为了方便描述,我就简称为:上下右 也就是上边下边和右边框有边线。 出来的效果如下,左边第一个字段有个小缺口 ,补一下。 在第一个字段上点右键,格式化对象,在边框标签页上,设置左边框为单线,其余不要动. 然后选中详细资料节上的字段,设置边线为:下右(下边沿和右边沿单线), 再把第一个字段补一个左边沿单线,出来如下效果。 大功告成,预览一下 导出来看看,注意选第一个XLS格式 如果出来这个界面,不要管,点确定然后继续 看一下效果吧 看这效果我来具体说一下原理。 竖线的部分我就不讲了,单独讲讲横线的为什么这么设。 我们知道页眉是每页固定的,每页只出现一次因为我们设置了上下边框都是横线。那么他的下边沿就是显示为一条横线,仅贴在页眉的下边沿。 而我们在设置详细资料节的时候,设置了下边沿。因为详细资料节是循环的,于是每行的下边沿又刚好是下一行的上边沿。 只有第一条记录上边沿是没有的,而刚好页眉下边沿的线就成为这条记录的上边沿。 所以整个数据就闭合起来了。 第三步:稍微完善一下 左边空出来一列?再改进一下吧。 进入模板,把所有的字段全选中,然后平行往左拖,拖到最左边为止。 实际上不是绝对的左边,还是有个小缝隙的,不过没关系,只要不能再拖了就行 继续向着我们的目标(第一个图迈进) 选中表头上的所有字段,点右键,格式化多个对象,进入边框标签页 下面的颜色处,勾选“背景”,我们选个银色,然后确定 界面是这样的,线条没了。这样操作,从第2个字段开始,在字段上点右键,移动,移动到底层 设置好了就是这个模板效果 然后再预览一下(为了便于显示,我稍微改了下一些字段的样式) 导出来,效果就是我们要的 补充说明: 1:不适用于“自动换行”需求的报表 2:在Web项目中可能会出现边框不显示的情况,这是VS2005里版本的BUG,这样修正 HTML模式下,删除aspx页面内的 HTML code 3:如果发现详细资料节上有隐藏的空行,那应该是你的字段没有顶到详细资料节的上下边沿 把字段往上拖,顶到详细资料节上边沿。鼠标滑到详细资料节的下边沿,会出现红色形状的那个标记 实际上不是红的,这个是我画上去的。按下去,往上拖,然后下边沿就往上走了。顶到字段的下边沿即可 4:特别说明一下数据如果分页的话,要把表头放在页眉上。不然导出的文件里页眉会重复。实际上放到页眉上也可以(某些情况可能确实需要放到页眉上),这个时候导出的时候用代码控制一下 基本原理如下: 报表页眉上方一个同样的表头,抑制显示掉。页眉上放一个表头,正常显示。页面展示和打印时,按原样打印。 而导出时,控制模板的报表页眉显示,页眉抑制显示,然后用代码导出,从而实现导出效果。 5:NULL值的处理 如果数据中存在NULL值,那么导出和显示的时候,边线都就没有了。 报表中户多了很多不规则的“窟窿”。 这个时候有两种解决方法,一是传入报表之前,把数据处理成非NULL值,二是在报表端处理 针对有NULL的字段,做一个公式,如xx,把报表里的原始字段删掉,把这个xx拖到原来的位置,设置大小位置边线,跟原始字段的设置一样 公式xx这样写: C# code /如果是字符型的字段if 字段= or isnull(字段) then else字段C# code 如果是数值型字段if (not isnumeric(字段) or isnull(字段) then0else字段其他数据类型以此类推。 就是要在字段等于null的的情况下,给一个空格(而不是空)进行占位,如果非NULL就显示原来的值。 有时候会出现无效的情况,就把isnull判定放到前面 如 if 字段= or isnull(字段) then 改为 if isnull(字段) or 字段= then 【非常感谢llsen的提醒,另外
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 劳务派遣合同管理规范与范本
- 2025年甘肃省兰州市红古区人民医院招聘专业技术人员考试参考题库及答案解析
- 农民专业合作社经营合作合同
- 2025年蚌埠市龙子湖区公办幼儿园公开招聘学前教育教师6名考试参考题库及答案解析
- 2025年福建省泉州技师学院公开招聘编外学生辅导员备考考试题库附答案解析
- 小区畜牧养殖合作合同
- 2025年南平市延平区延拓文旅集团幼儿园教职工招聘备考考试题库附答案解析
- 2025年烟台市福山区事业单位公开招聘高层次人才剩余招聘计划附岗位备考考试题库附答案解析
- 2026创维集团全球校园招聘备考考试题库附答案解析
- 房屋买卖交易及过户手续协议
- 2025年彩票技术管理员招聘笔试模拟题
- 员工思想培训课件内容
- 迷彩九月+启航青春+课件-2025-2026学年高一上学期开学军训动员主题班会
- 2025年暑期教师研修心得-研修蓄力笃行致远
- 2025秋人教版初中数学九年级上册教学计划及进度表
- 2025年中国烟花爆竹协会烟花工艺师认证考试专项练习含答案
- 2026年高考政治一轮复习:必修+选必修共7册主观题背诵考点汇编
- TCCEAS001-2022建设项目工程总承包计价规范
- 人教版小学三年级数学(上册)全册教案
- 2024-2025学年人教版(2024)七年级英语上册 教学计划
- 三年级上册信息技术全册课件ppt
评论
0/150
提交评论