




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
我已经很久没有亲自使用IReport开发报表了,记得当时用时还是零点几版本,转眼这么久过去了(估计2年了吧),今天公司要开发报表,而新同事们都不会,只好亲自上手做一个,也算是Demo吧。再次到JasperF的官网下了一个IReport3.7.2的最新版,惊奇发现现在这东西好用多了,完全是Netbeans框架实现的(本人可以Netbeans的忠实粉丝,一直用Netbeans开发)操作方便、人性化。好了下面我就逐步来介绍IReport的使用,以后还打算写一个在项目中使用报表的例子。 1、下载IReport(既是废话,又套路,呵呵,就从这里开始吧) 官网下载地址是:/plugins/project/project_home.php?projectname=ireport 2、安装IReport IReport安装十分简单,这里就略了,否则真要被人拍砖了。 3、运行IReport 直接在桌面上双击IReport图标就可以了,IReport3.7.2的闪屏还是蛮好看的,大家看看吧,如下图: 进入IReport主界面后,大家会发现其和Netbeans真的是很像,毕竟一个遗传基因的,呵呵。还是中文版的哦。 4、使用报表向导 我将以一个简单报表的制作来讲解IReport制作报表时的一些常用项。 选择菜单中”文件“”New“(如图所示): 进入报表设计的向导程序(如下图所示),在向导程序中可以选择报表模板,其它的(如风格、图表等)目前都不能用,我就选择”Blank A4“: 选择”Launch Report Wizard“,系统引导你下一步(如下图所示)。在这一步中在”Report Name“中输入报表的文件名,”Location“中指定报表文件存储目录。 选择”下一步“按钮,系统引导你配置数据源模式(如下图所示),在这里系统默认提供两种数据源模式”Empty DataSource“和”Sample Database(HSQLDB test)“,我在这里新建一个自己的数据源模式”Javabean DataSource“。 新建新的数据源很简单,可以点击”New“按钮,在下图中可以选择适合的数据源模式。 可以支持的数据源类型很多,如通过JDBC直接连接数据库的“Database JDBC connection”、通过XML作为数据源的“XML file datasource”、通过Javabean作为数据源的“Javabeans set database”等等,我这里使用“Javabeans set database”数据源,因此需要在上面界面中选中“Javabeans set database”选项。采用“Javabeans set database”作为数据源就是可以将普通的Javabean作为数据来源,通过程序构建Javabean,将其赋给报表,然后报表取出Javabean中的数据进行显示。这里的Javabean只要支持set和get方法就可以了。选择“Next”按钮,界面如下: 在Name中输入的是一个自定义的名称,如输入”Javabean Datasource“,这个名称可以任意,是方便日后自己看到名称就能迅速理解数据源的类型。Factory Class中输入的是一个用于在IReport中预览数据的类。在”The static method to call to retrive the array or the the collection“中输入的是在”Factory Class“中定义的类中的一个静态方法的方法名。IReport运行预览报表时会使用在”Factory Class“处定义的类,并调用其在”The static method to call to retrive the array or the the collection“中定义的静态方法。然后选择”Save“按钮进行保存。 现在我们重新回到了报表向导界面,在”Connections / Data Source“的下列选择项中选择我们刚刚建立的”Javabean Datasource“,直接选择”下一步“按钮,出现如下界面: 在这个界面中我们不做任何操作,直接选择”下一步“按钮,出现如下界面。如果是选中了使用“Database JDBC connection”的数据源模式,此时会出现可以选择的字段列表,只要将需要加入报表的字段选择到右边框中即可。 在这个页面上直接选择”下一步“按钮,出现如下界面。即使你的报表中需要对某些字段进行分组,也可以在日后进行设置,这里可以忽略。 选择”完成“按钮,到此报表生成向导完成。并呈现如下界面: 5、IReport的几个基本知识 报表由许多栏(Band)组成,它们各自有自己的独特作用。 5.1、Title Band Title Band只在报表页面第一页的最上面显示。不够报表有多少页面,Title Band中的信息只出现在报表的第一页,因此我们也称其为报表标题栏。 5.2、Page Header Band Page Header Band中的内容将出现在报表中每一页的头部。除第一页外,Page Header Band中的内容都是每一页的最顶部。第一页的Page Header Band中的内容紧接着出现在Title Band中内容的下面。我们称其为报表页眉。 5.3、Column Header Band Column Header Band中的内容是用于Detail Band中内容的头,即如果在Detail Band中是一个循环显示的数据,那么可以在Column Header Band中设置这些数据的共同头信息,最常用的就是表格了,在Column Header Band中定义表格的表头,而在Detail Band中定义实际的数据。因此我们也称其为表头。 5.4、Detail Band Detail Band中是需要循环的显示数据放置处。Detail Band中的内容每页都会出现。 5.5、Column Footer Band Column Footer Band中的内容是用于Detail Band中内容的脚,其出现位置在紧挨Detail Band的下面。 5.6、Page Footer Band Page Footer Band中的内容将出现在报表中每页的脚部。除最后一页外,Page Footer Band中的内容都是最后一页的最尾部。我们也称其为页脚。 5.7、Summary Band Summary Band中放置的对表格的统计数据,出现在整个报表最后一页Detail Band的后面,一般用来统计报表中某个或者某几个字段的合计。 5.8、引用Field 要在Expression中引用定义在Fields中的字段,使用$F变量名即可。 5.9、引用Parameter 要在Expression中引用定义在Parameters中的字段,使用$P变量名即可。 5.10、引用Variables 要在Expression中引用定义在Variables中的字段,使用$V变量名即可。 下面做一个案例,详细请看下篇用IReport3.7.2开发Web报表(二)IReport使用 6、手工编写一个例子 6.1、需求 前面我们已经介绍了IReport的开始,现在我们做一个例子。假设我们要做一个会议通讯录的报表,要求按照参会人的单位分组显示,即同一个单位的参会人员显示在一起,而且每个人占用一行,相邻两个人之间用不同的背景进行间隔。要求在标题下面打印会议名称,会议名称通过参数传入。 6.2、绘制 首先你需要获得Javabean中的属性。通过在主界面中选择如下图所示图标,图中用红圈圈住,并用红色箭头指向。 此时弹出Report Query窗口(如下图所示)。 选择”JavaBean Datasource“标签,在”Class name“中输入作为数据源的Java类,要求输入完整的类名,要包含包名。因为我建了一个叫做report.CAddressList的Java类(建立方法请看后篇),并且此类里面定义了id、name、nationality、phone、post、sex、unit属性,因此输入完类名后直接点击”Read attributes“按钮就可以获得类里面的这些属性了,选择需要加入报表的字段,然后点击”Add selected field(s)“按钮,将它们加入到窗口最下面列表中,最后选择”OK“按钮,这些Javabean中的属性就加入到”Report Inspector“中的”Fields“节点下,如下图所示: 要使在”Report Query“窗口中能够读取你自己定义的Javabean的属性,必须将你定义的Javabean放置在IReport的Classpath路径可以寻找的目录中。 下面来讲一下如何让IReport支持自己定义的类。 选择主菜单“工具”下面的“选项”子菜单,如下图所示: 出现“选项”对话窗口,如下图所示: 在“选项”窗口中选择“Classpath”标签,将要添加的自己的类所在的目录添加进来即可。然后选择“确定”按钮。 配置好数据源字段后,我们就来开始绘制报表,先要调出组件面板,在组件面板上有很多用来绘制报表的控件,默认情况下组件面板是显示的,如果你的组件面板没有显示,可以通过如下方法调出: 在主菜单”窗口“下选择”组件面板“(如下图所示),或者使用快捷键”ctrl+shift+8“。 这时在屏幕右边(一般在这边)会出现如下图的面板区域。 在组件面板中可以选择绘制报表时需要的任何控件,例如线条、矩形框、静态文本标题、图片等等。 下面我们首先绘制一个报表标题,在组件面板中选择”Static Text“,然后拖拽它到报表设计器的Page Header Band,并双击它编辑文字为”会 议 通 讯 录“,每个汉字自己使用空格做了一点间隔,好看而已,不是必须的。这样在报表的每一页都将出现报表名称。如果你只是想在报表第一页显示报表名称,其它页面上不显示,想想看如何处理?对了,将其放置在Title Band中就可以了。 我们将一个控件拖入报表设计器后,就可以在其中拖动位置来布局将来的显示位置,IReport是即看即所得的设计器,因此设计时你如何放置,显示时就是如何显示的。 仅仅将控件拖入报表设计器还不能完全达到我们的目的,我们还需要设置其属性,特别是对于显示的内容是中文的,而且将来要生成PDF文件的,设置相关的属性就更加重要了。我们选中拖入的控件“Static Text”,这是打开其属性面板。属性面板如果没有出现在主窗口中,可以同样在主菜单”窗口“中选择”属性“菜单来打开,属性面板的界面如图: 这里对于一个”Static Text“控件关键要设置如下几个属性: 1)Font name:在其中选中”宋体“,为了保证报表将来在任何计算机上都可以正常显示,最好使用统一的”宋体“,否则将来客户机器上没有这个特殊字体就会很难看了。 2)Size:设置字体大小。因为此处是报表标题,因此我选用了大字体,选择24。 3)Bold:设置字体为粗体。 4)Pdf Font name is now deprecated:在此选择”STSong-Light“。为了将来导出成PDF可以正常显示汉字。 5)Pdf Embedded:选中它。为了将来导出成PDF可以正常显示汉字。 6)Pdf Encoding:选择”UniGB-UCS2-H (Chinese Simplified)“。为了将来导出成PDF可以正常显示汉字。 7)Horizontal Alignment:选择”Center“。因为我将此Static Text的大小拖拽成合页面一样宽。 8)Vertical Aligment:选择”Middle“。 最好效果如下图所示: 再选择四个”Static Text“控件放置在Page Header Band中,分别设置其文本内容为”会议名称“、”第 “、”页 总“、”页“。并参考上面一样设置相关属性(这里略)。 打开”Report Inspector“面板。如果主窗口中没有此面板,还是到主菜单”窗口“下选择”Report Inspector“菜单即可。“Report Inspector“面板如下图所示: 在这个面板中会分类列出”Style“、”Parameters“、”Fields“、”Variables“、”Scriptlets“、”Table Dataset“、”Title“、”Page Header“、”Column Header“、”XXX Group Header“(如果建立了分组就会出现它)、”Detail“、”XXXX Group Footer“(如果建立了分组就会出现它)、”Column Footer“、”Page Footer“、”Last Page Footer“、”Summary“、”No Data“、”Background“等节点。 因为按照需要,会议名称是通过参数传入的,因此我们需要在”Parameters“节点下面建立一个名为”meeting_name“的参数。建立方法如下: 1)选中”Parameters“节点,鼠标右键,选择”添加 Parameter“菜单,系统将建立一个”Parameter1“的参数。如下图: 2)选中”Parameter1“(默认情况下自动选中的),查看其属性面板。修改”name“属性为”meeting_name。修改“Parameter Class”属性为“java.lang.String”,“Parameter Class”属性就是用来指定参数的数据类型,在IReport中,属性的类型都是Java的类。通过下列选择你需要的类型,也可以点击后面的“.”按钮直接输入java类。可以输入的java类是任意的,可以是Java JDK中包含的任何类,也可以是你定义的类。要使用自己定义的类,就必须将这些类所在的路径配置在Classpath中,配置方法参考前面描述。 现在我们回到“Parameters”的属性面板,在“Default Value Expression”属性中可以填入此参数默认的初始值,因为此参数的数据类型都是Java的类,因此此处要求如下这样写“new java.lang.String(江西省XXX公司年度大会),就是说要new一个对象出来,不管是String类型还是Interger类型或者其它什么类型。 在”Description“属性中填入的是对参数的描述,如填写成”会议名称“,这样下次看到此参数时就可以指定此参数的用途了。 填写好的”meeting_name“的属性面板如下图所示: 3)添加页码和总页数。 页码和总页数通过展开”Report Inspector“面板中的“Variables”节点,并从中拖拽就可以了。页码对应的变量是“PAGE_NUMBER”,其”Expression Class“是”java.lang.Integer“,”Evaluation Time“的值是”now“。总页数对应的变量是“PAGE_NUMBER”,其”Expression Class“是”java.lang.Integer“,”Evaluation Time“的值是”report“。“PAGE_NUMBER”是系统默认提供的,不需要我们手工建立。 到此我们的报表头已经绘制结束了,其布局如下图所示: 接下来我们来绘制报表体,因为需求中要求按照参会人所在单位进行分组,将同一单位的参会人放在一起,因此我们先来建立一个分组。建立分组的方法如下: 1)选中”会议通讯录“,鼠标右键,选择”Add Report Group“菜单。如下图所示: 2)出现”New Group Wizard“向导窗口(如下图所示),在”Group name“中输入一个用于表示本分组的名字,没有限制,我们这里输入”Unit Group“。选择”Group by the following report object“,并在下面的下列选择框中选择”unit“字段。”unit“字段就是Fields中的。 建立好分组后在”Report Inspector“面板中就会多出”unit group Group Header 1“和”Unit Group Group Footer 1“两个节点。其中”unit group Group Header 1“是分组的头,而”Unit Group Group Footer 1“分组的脚。它们中间就是”Detail Band“。 我们在”unit group Group Header 1“中放入矩形控件,放置方法是从组件面板中选择矩形控件,然后拖入放置在适当的位置。放置矩形控件是为了制做报表的边框、网格等。并放置一些静态文本”Static Text“控件和字段unit。字段unit从”Report Inspector“面板中的Fields中拖入。具体布局界面如下: 还为矩形控件设置了背景颜色。矩形控件设置背景颜色的方法是,选中矩形控件,在其属性面板中修改”Backcolor“属性值。在字段unit外面也放置了一个矩形控件,但没有设置它的背景颜色,因为默认的背景颜色是白色。 另外,为了当数据在换页后不重新显示本表头,因此我们需要做个设置,在”Report Inspector“面板中选中”unit group Group Header 1“,在其属性面板中找到”Reprint Header“,并设置其值为选中,这样当分组数据跨页时,在第二页会重新打印表头。 下面将需要显示的字段如id、name、post、sex、nationality、phone,依次从”Report Inspector“面板中的Fields中拖入并对应放置在相应的表头下面。同时也为每个字段都配置一个矩形用于描绘网格线。其配置效果如下图所示: 其中姓名对应的是$Fname,职务对应的是$Fpost,性别对应的是$Fsex,民族对应的是$Fnationality,联系电话对应的是$Fphone,签名下面对应的只有一个矩形框。 序号的设想是每组的序号都会从1开始,因此我通过定义一个变量来实现。选中”Report Inspector“面板中的”Variables“节点,鼠标右键,选择“添加 Variables”菜单,如下图所示: 系统将在”Variables“节点新增一个“Variable1”,选中它,在属性面板中修改相应属性。 修改Name属性值为“group inner number”; 修改Variable Class属性值为“java.lang.Integer”,此处的内容也必须是Java类,可以是系统的类,也可以是自己定义的类; 修改Calculation属性值为“Nothing”,就是表明此字段不会自己增加。其可选的值有“Count”、“Distinct Count”、“Sum”、“Average”、“Lowest”、“Highest”、”Standard Deviation“、”Variance“、”System“、”First“;其中每种值的含义如下:值含义Nothing不做任何计算Count对记录集数进行循环累加,计算有多少条记录。Distinct Count对记录集数进行循环累加,计算有多少条记录。但忽略重复记录,即某个值已经统计过此处就不再统计Sum累加某字段(必须是数字类型)的总和Average计算某字段(必须是数字类型)总和的平均值Lowest返回某字段的最小值Highest返回某字段的最大值Standard Deviation返回表达式的所有值的标准方差Variance返回表达式收到值的变化System不做任何计算也没有任何价值First 修改Reset type属性值为”Group“。Reset type属性可选的值有如下几种:值说明none任何时候不做重置操作report在报表创建时才进行变量初始化page在报表每页对变量进行初始化column在报表处理每个Column时就对变量进行初始化group报表每个分组对变量进行初始化 修改Reset Group属性值为”Unit Group。 修改Increment type属性值为“Group”。其值可选同Reset type属性。 修改Increment Group属性值为“Unit Group”。 修改Variable Expression属性值为“$Vgroup inner number。 修改Initial Value Expression属性值为”new Integer(0)。 最终效果如下图所示: 接下来来建立一个Scriptlets。选中”Report Inspector“面板中的”Scriptlets“节点,鼠标右键,选择“添加 Scriptlet”菜单,如下图所示: 系统自动建立“scriptlet1”,通过其属性面板修改相关的属性值。 修改name属性值为“group inner number”。 修改Scriptlet Class属性值为“report.CIntegerIncrement。report.CIntegerIncrement是我自己定义的一个Java类,具体定义请参考后续文档。 在unit Group Group Footer Band中放入二个静态文本,并从”Report Inspector“面板中的Variables”节点中拖入一个“Unit Group_Count”的字段。这个字段是建立分组后由系统自动建立的,用于统计各个分组中记录数。其界面布局如下图所示: 到此,报表的设计工作结束,我们来预览一下,点击设计界面中的”Preview“,如图中红色圈中的部分: 就可以预览报表效果了。 报表设计完毕,通过点击编译图标来生产可分发的jasper文件,其操作如图红色圈中部分: 好,本篇开始讲解如何利用设计好的jasper报表来付诸应用,即在Web应用中如何调用jasper报表文件。 首先运行Netbean IDE 6.8,并创建一个Web应用的工程。如何在Netbean IDE创建Web应用工程,包括如何使用Netbean IDE可以参考我写的NetBeanIDE 6如何安装和使用文章,这篇文章在我博客日志的”NetbeanIDE“分类中,时间是2007-12-04,如果需要可以去参考。 其次,打开index.jsp文件,在其中填写如下代码: 接下来,建立report.servlet的包,在此包下面建立SReport类,此类是一个Servlet类。修改其中processRequest方法。processRequest方法里的实现思路: 1)获取前台传入的参数,这些参数包括“export_type”(导出文件格式)、“report”(报表文件名)、“meeting_name”(会议名称)。 2)填充报表。通过JasperFillManager类的fillReport方法来填充。 3)依据导出文件格式要求不同产生不同的字节对象,可以支持的导出文件格式包括“pdf”、“excel”、“html”、“xml”。 4)通过response对象向前台输出。 其具体代码如下:protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException /设置字符集 request.setCharacterEncoding(GBK); /获取导出文件类型 String export_type=request.getParameter(export_type)=null?pdf:(String)request.getParameter(export_type); /获取报表名 String report_file=request.getParameter(report)=null?:(String)request.getParameter(report); Hashtable ht=new Hashtable(); java.util.Collection collection=null; /针对不同报表进行不同处理 if(report_file.equals(meeting_phone_list) System.out.println(当前报表名:+report_file); String meeting_name=request.getParameter(meeting_name)=null?:(String)request.getParameter(meeting_name); /将报表名取出,放入Map类对象中,方便之后传入报表 ht.put(meeting_name, meeting_name); /CMeetingPhoneListDS为自定义的活动数据的类。 CMeetingPhoneListDS mpl_ds=new CMeetingPhoneListDS(); /获得数据,数据为java.util.Collection类型 collection=mpl_ds.getCollection(); /因为是基于JavaBean数据源的,因此采用JRBeanCollectionDataSource类 JRBeanCollectionDataSource ds=new JRBeanCollectionDataSource(collection); ServletOutputStream ouputStream =null; byte bReport=null; String err=null; try StringBuffer sb=new StringBuffer(/WEB-INF/report/); sb.append(report_file); sb.append(.jasper); ServletContext application=this.getServletContext(); String cd=application.getRealPath(sb.toString(); System.out.println(当前路径:+cd); JasperPrint jasperPrint = null; /将参数置入报表,参数包括报表文件路径、报表接收的传入参数(以Map类提供)、报表数据源 jasperPrint = JasperFillManager.fillReport(cd, ht, ds); System.out.println(填充报表.); /依据导出文件格式不同,配置不同参数 if(export_type.toLowerCase().equals(pdf) bReport = JasperExportManager.exportReportToPdf(jasperPrint); else if(export_type.toLowerCase().equals(excel) JRXlsExporter exporter = new JRXlsExporter(); ByteArrayOutputStream oStream = new ByteArrayOutputStream(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, oStream); exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE); exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE); exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE); exporter.exportReport(); bReport= oStream.toByteArray(); oStream.close(); else if(export_type.toLowerCase().equals(html) JRHtmlExporter exporter = new JRHtmlExporter(); ByteArrayOutputStream oStream = new ByteArrayOutputStream(); exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN,Boolean.FALSE); exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, GBK); exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, oStream); exporter.exportReport(); bReport= oStream.toByteArray(); oStream.close(); else bReport = JasperExportManager.exportReportToXml(jasperPrint).getBytes(); catch(Exception e) err=e.getMessage(); System.out.println(制作报表失败!原因:+err); bReport=null; try if(bReport!=null) /response.setContentType(application/octet-stream;charset=UTF-8); /将数据输出到客户端 response.setContentType(application/pdf;charset=GBK); response.setCharacterEncoding(GBK); /设置客户端接收到的文件的文件名。 String filename=222222.pdf; response.addHeader(Content-Disposition, inline; filename=+filename); ouputStream = response.getOutputStream(); response.setContentLength(bReport.length); ObjectOutputStream oos = new ObjectOutputStream(ouputStream); /oos.writeObject(jasperPrint); ouputStream.write(bReport, 0, bReport.length); oos.flush(); oos.close(); else PrintWriter pw=response.getWriter(); pw.print(err); pw.close(); catch(Exception e) System.out.println(输出报表失败!原因:+e.getMessage(); finally try if(ouputStream!=null) ouputStream.close(); ouputStream=null; catch(Exception e) 上面我们实现了Servlet,但此次Servlet只是接受前端参数,并调用JasperReport的类实现产生报表文件,而数据的源部分需要我们自己编写完成。 下面附上Servlet在Web.xml文件中的配置信息。 SReport report.servlet.SReport SReport /SReport 由上面的Servlet代码可以看到,在调用JasperFillManager.fillReport方法时,除了第一、二个参数外,我们的数据源需要转换成JRBeanCollectionDataSource类的对象,而JRBeanCollectionDataSource类又是由Collection构造而来。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第六单元说课课件下载
- 出口委托代理协议书范本
- 出轨家暴协议书范本
- 抽签互换协议书范本
- 定制戒指协议书范本大全
- 房产委托拍卖协议书范本
- 民宿房东分成协议书范本
- 心理健康课件网站
- 空分装置安全管理课件
- 二零二五年度新型城镇化施工合同编号
- 怀特海《教育的目的》读书分享
- 普通货物道路运输安全生产管理制度
- 2025年校长职级考试题及答案
- 2025年广西继续教育公需科目考试试题和答案
- 健康体检服务投标方案投标文件(技术方案)
- 医院行风建设培训
- 私募基金员工管理制度
- 建设项目主要污染物排放总量指标核定办法
- 2025-2030中国音圈电机(VCM)行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国良性前列腺增生(BPH)药物行业市场发展趋势与前景展望战略研究报告
- 预防呆滞库存管理制度
评论
0/150
提交评论