




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 用Delphi开发Wps Office 插件(一)一、开发前的准备工作本文的开发环境是基于delphi 7.0 和WPS OFFICE 2009个人版。开发前要先做好以下准备工作。先导入相关的COM库。打开delphi ,点击菜单"Project"-"Import Type Library.",在弹出的对话框中选择相应的类型库(如下图)。以上五个类型库都要导入,由于每次只能导入一个,所以要分五次导入。“Kingsoft Add-In Designer”是Add-In插件COM接口对象。“Kingsoft Office 1.0 Object Librar
2、y”是Wps Office 公用对象库COM接口。“Kingsoft WPS 2.0 Object Library”是WPS文字的COM接口。“Kingsoft ET 2.0 Object Library”是WPS表格的COM接口。“Kingsoft WPP 2.0 Object Library”是WPS演示的COM接口。二、创建插件框架创建插件COM 对象WPS Office的插件由一个实现了特定接口的DLL、一个XML配置文件以及插件本身需要的其他文件组成。WPS Office 插件DLL实际上是一个实现了_IDTExtensibility2接口的COM组件,这个接口就在我们刚才导入的“K
3、ingsoft Add-In Designer”对象中。我们只用创建一个COM对象来实现这个接口,就可以继续我们的开发了。打开delphi 7.0 ,新建一个“ActiveX Library”,保存为“SimpleLib.dpr”。再新建一个“Automation Object”,CoClass Name输入我们要创建的类名“SimpleAddin”,然后点击OK按钮。把弹出的类型库编辑器关闭,将unit1保存为“untSimple.pas”,此时单元代码如下:unit untSimple; $WARN SYMBOL_PLATFORM OFF interface uses ComObj, Ac
4、tiveX, SimpleLib_TLB, StdVcl; type TSimpleAddin = class(TAutoObject, ISimpleAddin) protected end; implementation uses ComServ; initialization TAutoObjectFactory.Create(ComServer,TSimpleAddin, Class_SimpleAddin, ciMultiInstance, tmApartment); end. 这是我们创建的com对象源码,它目前还没有实现相关的接口。下面我们要添加要使用的单元和要实现我接口。将光标
5、定位到uses区段,在后面添加三个单元的引用,分别是“AddInDesignerObjects_TLB”、“KSO_TLB”、“WPS_TLB”,然后添加接口的实现。 TSimpleAddin = class(TAutoObject, ISimpleAddin, _IDTExtensibility, ICommandBarButtonEvents) protected 实现_IDTExtensibility2 procedure OnAddInsUpdate(var custom: PSafeArray); safecall; procedure OnBeginShutdown(var cus
6、tom: PSafeArray); safecall; procedure OnConnection(const app: IDispatch; ConnectMode: ext_ConnectMode; const AddInInst: IDispatch; var custom: PSafeArray); safecall; procedure OnDisconnection(RemoveMode: ext_DisconnectMode; var custom: PSafeArray); safecall; procedure OnStartupComplete(var custom: P
7、SafeArray); safecall; 实现ICommandBarButtonEvents procedure Click(const Ctrl: CommandBarButton; var CancelDefault:WordBool); stdcall; end; 由于我们要响应工具栏按钮的单击事件,所以同时添加了ICommandBarButtonEvents接口的实现。现在应该说一个插件的框架已经完成了,具体实现怎样的功能,就看我们自己的实现了。3、 实现我们的功能 由于是一个示例插件,所以我们要实现的功能很简单,就是在标准工具栏上添加两个按钮,点击不同的按钮弹出不同的信息。在具体实
8、现之前,我们先了解一下插件接口_IDTExtensibility2,它的声明如下: _IDTExtensibility2 = interface(IDispatch) 'B65AD801-ABAF-11D0-BB8B-00A0C90F2744' procedure OnConnection(const Application: IDispatch; ConnectMode:ext_ConnectMode; const AddInInst: IDispatch; var custom: PSafeArray); safecall; procedure OnDisconnectio
9、n(RemoveMode: ext_DisconnectMode; var custom: PSafeArray); safecall; procedure OnAddInsUpdate(var custom: PSafeArray); safecall; procedure OnStartupComplete(var custom: PSafeArray); safecall; procedure OnBeginShutdown(var custom: PSafeArray); safecall; end; 插件安装时,WPS Office会将插件DLL注册(DllRegisterServe
10、r)到系统中。WPS Office启动时,将通过插件平台(管理插件的模块)加载插件。插件平台通过COM方式创建一个_IDTExtensibility2对象,然后调用_IDTExtensibility2.OnConnection。插件可以在OnConnection中做一些初始化操作,如添加菜单项、工具栏按钮等。OnConnection之后,OnStartupComplete将被调用,至此插件加载完成。WPS关闭时,插件平台先后调用OnBeginShutdown和OnDisconnection。目前,WPS Office插件平台不会调用插件的_IDTExtensibility2.OnAddInsU
11、pdate方法。插件实现一个空的OnAddInsUpdate就可以了,即直接返回S_OK,应避免在其中编写其他代码,以免将来引起兼容问题。下面是对五个方法的详述(来自KingSoft官方文档,翻译成了delphi版):1.1. _IDTExtensibility2.OnConnection procedure OnConnection(const Application: IDispatch; ConnectMode:ext_ConnectMode; const AddInInst: IDispatch; var custom: PSafeArray); safecall;OnConnecti
12、on方法一共带有4个参数。第一个参数Application是宿主程序对象;第二个参数是ext_ConnectMode类型的枚举值;第三个和第四个参数目前没有使用,插件实现OnConnection时必须忽略这两个参数。ext_ConnectMode定义了4个常量值,如下所示。 type ext_ConnectMode = TOleEnum; const ext_cm_AfterStartup = $00000000; ext_cm_Startup = $00000001; ext_cm_External = $00000002; ext_cm_CommandLine = $00000003; 其
13、中,ext_cm_Startup和ext_cm_AfterStartup是插件平台加载COM插件时传入OnConnection的。ext_cm_External和ext_cm_CommandLine目前没有用到。a. ext_cm_StartupWPS启动时,插件平台会立即加载COM插件,调用OnConnection(Application, ext_cm_Startup)。b. ext_cm_AfterStartup用于安装插件过程。安装插件时,WPS Office插件平台会加载插件,并调用OnConnection(Application, ext_cm_AfterStartup),此时插件
14、要做两件事情,即安装后的初始化以及加载初始化。如果插件安装以后不需要进一步的配置等初始化工作,那么对这个插件而言,不需要区分ext_cm_AfterStartup和ext_cm_Startup。一般情况下,插件会在OnConnection中添加菜单项或者工具栏按钮等功能入口。在WPS Office添加的菜单项或者工具栏按钮,分为“临时”和“持久”两种类型。顾名思义,带有“临时”属性的菜单项或工具栏按钮,在WPS Office重新启动以后就不存在了;带有“持久”属性的菜单项或工具栏按钮,在WPS Office重新启动以后,仍然存在。插件添加菜单项和工具栏按钮时,推荐使用“临时”的菜单项和工具栏按
15、钮,在宿主程序关闭时,插件也不要调用API删除菜单或工具栏按钮。插件添加菜单项或工具栏按钮时,建议先检查这些菜单或按钮是否已经存在,以免重复添加。1.2. _IDTExtensibility2.OnStartupComplete插件平台加载插件过程中,会先后调用OnConnection和OnStartupComplete。如果插件需要在插件启动以后(OnConnection执行完之后)做一些事情,可以将这些工作放到OnStartupComplete中执行。大多数情况下,插件可以实现一个空的OnStartupComplete即可。1.3. _IDTExtensibility2.OnBeginSh
16、utdownWPS Office关闭过程中,插件平台会调用OnBeginShutdown,通知插件做清理工作,如保存配置、终止未完成的工作、释放系统资源等。OnBeginShutdown在OnDisconnection之前被调用。1.4. _IDTExtensibility2.OnDisconnectionOnDisconnection和OnConnection相对应,插件在OnConnection中添加菜单或工具栏命令、注册事件通知,OnDisconnection则注销事件通知。 procedure OnDisconnection(RemoveMode: ext_DisconnectMode
17、; var custom: PSafeArray); safecall; OnDisconnection带RemoveMode和custom两个参数。其中custom参数目前没有用到,插件忽略这个参数即可;第一个参数RemoveMode是ext_DisconnectMode类型的枚举值,如下所示: type ext_DisconnectMode = TOleEnum; const ext_dm_HostShutdown = $00000000; ext_dm_UserClosed = $00000001; 目前只用到了ext_dm_HostShutdown。WPS Office关闭时,插件平台
18、会调用插件的_IDTExtensibility2.OnDisconnection(ext_dm_HostShutdown, custum) 方法。前面推荐插件使用“临时”的菜单和工具栏按钮。使用“临时”菜单和按钮时,插件在处理ext_dm_HostShutdown过程中不需要删除菜单、按钮等项目。 了解了以上内容,下面开始我们的实现,先创建以下类成员变量: FApp : _Application; /我们的WPS文字接口对象 FBtnTest1, FBtnTest2 : _CommandBarButton; /工具栏按钮对象FConnection1, FConnection2 : Intege
19、r;再添加两个全局常量const Btn1TagId = 'Btn1' Btn2TagId = 'Btn2'我们要靠它们来辨别是哪个按钮被点击了。我们要关心的具体实现在以下三个函数中,其它函数我们可以不管:procedure TSimpleAddin.Click(const Ctrl: CommandBarButton; var CancelDefault: WordBool); var TagId: WideString; 调用messagebox函数要引用Windows单元。begin TagId := Ctrl.Tag; if TagId = Btn1Ta
20、gId then MessageBox(0, '您点击了按钮一。', '提示', MB_OK + MB_ICONINFORMATION) else if TagId = Btn2TagId then MessageBox(0, '您点击了按钮一。', '提示', MB_OK + MB_ICONINFORMATION) else Assert(false, '错误的参数'); end; procedure TSimpleAddin.OnConnection(const app: IDispatch; ConnectM
21、ode: ext_ConnectMode; const AddInInst: IDispatch; var custom: PSafeArray); var ToolBar: CommandBar; begin 获取WPS接口引用 FApp := app as _Application; 获取标准工具栏接口 ToolBar := FApp.CommandBars.Item'Standard' as CommandBar; 向标准工具栏对象添加按钮一 FBtnTest1 := Toolbar.Controls.Add(ksoControlButton, 0, 0, ToolBar
22、.Controls.Count+1, True) as _CommandBarButton; 设置按钮一属性 with FBtnTest1 do begin Style := ksoButtonCaption; ToolTipText := '我的测试一' Caption := '测试一' Tag := Btn1TagId; 这个标记是区别不同按钮的 end; 将按钮事件连接到我们实现的ICommandBarButtonEvents接口上 InterfaceConnect( FBtnTest1, IID_ICommandBarButtonEvents, self
23、, FConnection1); 向插件工具栏对象添加按钮二 FBtnTest2 := Toolbar.Controls.Add(ksoControlButton, 0, 0, ToolBar.Controls.Count+1, True) as _CommandBarButton; 设置按钮一属性 with FBtnTest2 do begin Style := ksoButtonCaption; ToolTipText := '我的测试二' Caption := '测试二' Tag := Btn2TagId; 这个标记是区别不同按钮的 end; 将按钮事件连
24、接到我们实现的ICommandBarButtonEvents接口上 InterfaceConnect( FBtnTest2, IID_ICommandBarButtonEvents, self, FConnection2); end; Procedure TSimpleAddin.OnDisconnection(RemoveMode:ext_DisconnectMode;var custom: PSafeArray); begin 先断开事件连接。 InterfaceDisconnect( FBtnTest1, DIID_CommandBarButtonEvents, FConnection1
25、); InterfaceDisconnect( FBtnTest2, DIID_CommandBarButtonEvents, FConnection2); 释放FApp接口引用。 FApp := nil; end; 代码编写至此,我们的DLL文件算是完成了,编译后就生成了“SimpleLib.dll”,它只实现了简单的功能,就是在标准工具栏上添加两个按钮,点击不同按钮会弹出不同的信息框。要把它安装到我们的WPS Office 2009中,还要编写一个配置文件,下面我们进行插件配置文件的编写。四、编写插件配置文件并安装WPS Office插件的配置文件是一个符合一定命名规则的XML文件。插件配
26、置文件必须和插件DLL放在相同的文件夹中。插件配置文件的文件名必须遵循“addon-name.app-name.lang.xml”这样的格式。a. addon-name插件模块的名称,必须和插件模块的文件名完全一致。如WpsAddonDemo.dll插件,addon-name为“WpsAddonDemo”。b. app-name插件支持的WPS模块,包括:wps、et、wpp、kso,其中kso表示支持WPS Office的所有模块。c. lang插件支持的语言版本,如1033、2052等。“0”表示支持所有语言。假如WpsAddonDemo.dll插件支持WPS Office的所有模块,支持
27、简体中文,那么它的配置文件名称为“WpsAddonDemo”。如果插件需要针对WPS Office的不同模块编写不同的配置文件,那么可以按照以上规则编写多个配置文件。插件平台优先使用精确匹配的插件配置文件,以WpsAddonDemo插件为例,WPS文字启动时,插件平台先查找名为“WpsAddonDemo”的配置文件,若找不到则继续查找名为“WpsAddonDemo”的配置文件,如果都找不到,则说明该插件不支持WPS文字。<?xml version="1.0" encoding="utf-8"?><!- id:插件DLL的CLSID。 v
28、ersion:插件的版本号,形式的版本号。将显示在插件平台对话框中。 type:必须是comaddin。 author:作者名字。将显示在插件平台对话框中。 name:插件名称。将显示在插件平台对话框中。 desc:插件简介。将显示在插件平台对话框中。 image:插件图标文件(32 X 32),将显示在WPS插件平台对话框中。 homepage:插件主页网址。将在插件平台对话框中显示一个主页按钮。 help:帮助页面的网址。将在插件平台对话框中显示一个问号按钮。 loadimm:必须是“1”。 updateitv:检查更新的时间间隔,默认为7天。-><ksoplug
29、in version="1"><propertyid="70D748C8-974D-44C0-8115-9072478A6009" version="234" type="comaddin" name="插件示例" author="WPS"desc="WPS Office 插件简介" image="icon.jpg" homepage="help=""loadimm="1
30、"updateitv="7" /></ksoplugin>图(1) 插件属性示例插件配置文件中至少要包含id、version、type、name四项数据。a. id插件id是插件COM组件的CLSID,WPS Office插件平台将根据id加载插件,获取_IDTExtensibility2接口。b. verion插件版本号使用Windows风格的命名方式,即主版本号子版本号修正版本号构建,如“”。插件版本号会显示在插件平台对话框中。c. typetype必须为comaddin,说明插件DLL是一个COM组件。d. name在插件平台对话框中看到的
31、插件名称。e. loadimm WPS启动时是否立即加载插件,必须为“1”,表示立即加载插件。我们的插件配置文件名为“”,内容如下:<?xml version="1.0" encoding="UTF-8"?><ksoplugin version="1"> <property id="31257FD7-797F-4D21-A919-6A8F333A077F" version="" type="comaddin" author=&quo
32、t;yulinsoft" name="测试插件" desc="这是一个示例插件,用于演示delphi开发的WPS插件。" homepage=" help=" loadimm="1" updateitv="2" /></ksoplugin>将XML文件保存到与DLL文件相同的目录中,打开WPS,点击插件平台,选择“安装本地插件”,定位到我们的插件目录,选定“”文件打开就可以了,成功安装后,我们会在插件平台和标准工具栏上看到如下变化:点击不同的按钮会弹出不同的信息框,这说
33、明我们的插件开发成功了。(本系列文章在百度空间首发,转载请注明出处。)用Delphi开发Wps Office 插件(二)在上文中,我们已经开发了一个简单的WPS插件,它只是在标准工具栏中添加了两个按钮,而且这两个按钮似乎与其它的标准按钮不一样,它没有按钮图标,只显示了按钮标题,那我们能不能也让这个按钮也和其它按钮一样呢?答案是肯定的,这一节我们就来研究一下怎样让按钮显示图标。1、 相关接口及声明我们添加的按钮实际上是一个_CommandBarButton接口,它的声明如下: _CommandBarButton = interface(CommandBarControl) '00023C
34、90-FFFE-0000-C000-000000111146' property Style: KsoButtonStyle read Get_Style write Set_Style; property FaceId: SYSINT read Get_FaceId write Set_FaceId; property Picture: IDispatch read Get_Picture write Set_Picture; end; 省略了其它内容,只留下了我们需要的这三个属性是我们本节的关键,让按钮显示图标就要看它们了,Style是一个KsoButtonStyle类型,它的声明
35、如下:type KsoButtonStyle = TOleEnum; const ksoButtonAutomatic = $00000000; ksoButtonIcon = $00000001; /只显示图标 ksoButtonCaption = $00000002; /只显示标题 ksoButtonIconAndCaption = $00000003; /显示图标和标题 ksoButtonIconAndWrapCaption = $00000007; ksoButtonIconAndCaptionBelow = $0000000B; ksoButtonWrapCaption = $000
36、0000E; ksoButtonIconAndWrapCaptionBelow = $0000000F; 我们只关心我们注释的三个,其它的不用关注,因为我在测试时发现设为其它值并没有什么特殊的效果。要想让按钮显示按钮,要先把按钮的Style设置为ksoButtonIcon或ksoButtonIconAndCaption,然后再将FaceID设为一个整数,它对应的是WPS公共图标库的图标索引,具体每个数字对应哪个图标,我们随后会具体介绍。继续打开上文中的示例代码,我们设置添加的两个按钮属性如下: with FBtnTest1 do begin Style := ksoButtonIconAndC
37、aption; FaceId:=2; Caption := '测试一' ToolTipText := '我的测试一' Tag := Btn1TagId; /这个标记是区别不同按钮的 end; with FBtnTest2 do begin Style := ksoButtonIcon; FaceId:=3; Caption := '测试二' ToolTipText := '我的测试二' Tag := Btn2TagId; /这个标记是区别不同按钮的 end; 然后重新编译我们插件,再打开WPS文字,我们看到了效果如下:一个按钮带有
38、标题,一个按钮没有标题,它们都显示了一个图标,那我们怎样才能知道每个FaceId对应的是什么图标呢?下面我们就来了解这个内容。2、 制作FaceId对照表关于WPS二次开发讲到这里,我们似乎还没有涉及到WPS文档操作的相关内容,下面我们就制作一个FaceId 与图标的对照表,以方便我们以后的开发。继续打开上文例子,我们要实现的功能是点击“测试一”按钮,WPS将自动新建一个文档,生成一个对照表。我们新建一个过程“CreateFaceIconTable”,当点击“测试一”按钮时会调用这个过程并生成列表。过程具体实现如下:procedure TSimpleAddin.CreateFaceIconTa
39、ble; var i:integer; doc:_Document; rng:Range; tmpBtn:_CommandBarButton; begin Doc:=FApp.Documents.Add(EmptyParam,False,0,true); /新建一个文档 doc.Activate; rng:=doc.Paragraphs.First.Range; rng.Text:='FaceID与图标对照表' doc.Paragraphs.First.Alignment:=wpsAlignRowCenter; rng.Font.Size:=16; rng.Font.Bold:
40、=1; doc.Paragraphs.Add(rng); rng:=doc.Paragraphs.Last.Range; rng.Font.Size:=10; rng.Font.Bold:=0; rng.Tables.Add(rng,256,2,EmptyParam ,EmptyParam); rng.Tables.Item(1).Cell(1,1).Range.Text:='FaceID' rng.Tables.Item(1).Cell(1,2).Range.Text:='图标' rng.Tables.Item(1).Rows.Item(1).Range.Fo
41、nt.Bold:=1; /创建一个临时按钮,它不会显示在工具栏上 tmpBtn:=FApp.CommandBars.Item1.Controls.Add(ksoControlButton, 0, 0,1, True) as CommandBarButton; tmpBtn.Style:=ksoButtonIcon; tmpBtn.FaceId:=1; tmpBtn.Visible:=False; for i:=1 to 255 do begin tmpBtn.FaceId:=i; tmpBtn.CopyFace; rng.Tables.Item(1).Cell(I+1,1).Range.Tex
42、t:=inttostr(i); rng.Tables.Item(1).Cell(I+1,2).Range.Paste; end; doc.Save; /保存文档,会弹出保存对话框 tmpBtn:=nil; end; 由于WPS的图标库是很大的,所以我们只显示前255个图标,你如果要显示更多,可以修改相关数值。另外要说明的一点是,这个FaceId只针对WPS文字,WPS表格和WPS演示中显示的是不同的图标,也就是说它们使用的不是同一个图标库。重新编译我们的插件,打开WPS,点击“测试一”按钮,稍等片刻就会看到如下表格,你可以把它保存以方便以后查询。3、 怎样使用自定义图标 既然可以显示图标,那我
43、们能不能使用我们自己的图标呢?答案是肯定的,要使用自定义图标,我们就要使用按钮的Picture属性,它是一个IDispatch接口,看来我们不能直接将我们的图片赋值给它。要实现自定义图标,我们还需要借助一个函数和一个接口,这个函数就是GetOlePicture,这个接口是IPictureDisp,它们存在于AxCtrls单元,要使用需要先在Uses部分添加它的引用,由于还要使用TPicture类,所以也要引用Graphics单元,它们的声明如下:procedure GetOlePicture(Picture: TPicture; var OlePicture: IPictureDisp);IP
44、ictureDisp = interface(IDispatch) '7BF80981-BF32-101A-8BBB-00AA00300CAB'end;在创建按钮的过程中,我们要声明一个TPicture类型的变量和一个IPictrueDisp类型的接口变量,先用TPicture来载入图片,再用GetOlePicture将它转换成IPictureDisp接口,然后就可以直接赋值给按钮的Picture属性了。为些我们编写了如下函数,它可以方便我们直接操作:function GetPicture(const FileName: WideString): IPictureDisp; v
45、ar pic: TPicture; Ipic: IPictureDisp; begin try pic := TPicture.Create; pic.Bitmap.LoadFromFile(Filename); GetOlePicture(pic, Ipic); Result := Ipic; except Result := nil; end; end; Filename是一个全路径的bmp位图文件名,我们可以将图片放在插件目录中,然后动态获取插件路径并载入图片。我们随便找一个16*16的图片并命名为“stop.bmp”将它保存到插件目录中,然后我们用如下语句给按钮“测试二”设定图标为我们
46、的位图文件。 FbtnTest2.Picture:=GetPicture(ExtractFilePath(GetModuleName(HInstance)+'stop.bmp');重新编译后我们看到按钮“测试二”已经变为我们图片了,如下图: 将图片保存到我们的插件目录虽然很好,但不利于插件的发布,最好的方式是将图片做为资源直接放入我们Dll中,一方面可以防止图片丢失出错,另一方面还可以提高载入速度,下面我们将讲解如何打包资源到Dll中并调用。四、打包图片资源到dll并调用打开我们的示例插件,点击“File”“new”,新建一个“Text”文本文件,输入如下内容:STOP Bit
47、Map stop.bmp然后保存为bmpRes.rc,将它保存到我们的插件目录,同时保证stop.bmp也在我们的插件目录。点击“Projcet”“Add to project.”,在弹出的打开文件对话框中选择我们创建的“bmpRes.rc”,将它添加到我们的工程中,这时SimpleLib.dpr中会添加一行资源标记,如下图,这说明我们添加成功了。以上步骤,我们只是创建了一个资源脚本,这个资源脚本添加一个名为“STOP”的位图资源到DLL中(注意名称为大写),在工程编译时,编译器会编译“bmpRes.rc”为标准资源文件“bmpRes.res”,然后将它链接到我们的dll文件中,我们在插件中就可以调用了,发布插件时也不用再发布图片文件了,因为它已经存在于我们的dll中了。(有关资源脚本的相关文档,请参阅MSDN)关于调用资源中的图片,我们新建了一个函数,内容如下:function GetPictureFromRes(const Name: WideString): IPictureDisp; var pic: TPicture; Ipic: IPictureDisp; b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025质量管理体系注册审核员题库(附含参考答案)
- 国有企业干部岗位选拔面试题库
- 检维修安全培训考试及答案
- 逻辑学考题及答案
- 高级编程技能必 备面试题与答案解析
- 面试经验分享:新兴事务面试题与解答
- 校园职场成长路:职业领域新面试题解答
- 职场竞争力提升之路:解读面试题目的精神内涵与实践方法
- 银行慰问发言稿
- 第二章第一节第1课时活泼的金属单质-钠测试题上学期高一化学人教版2019必修第一册含答案
- 2024年新人教PEP版三年级上册英语课件unit1 B 第1课时
- 房屋安全鉴定理论考试复习题及答案
- 彩钢瓦检验批
- 2024-2030年中国大米行业市场深度调研及发展趋势与投资前景研究报告
- 中国近现代史纲要-第七章
- 营销中心岗位职责及流程样本
- 送货单完整模板
- 如何成为一名好的医生
- 消防员考试:消防监控上岗证试题及答案
- 雅安市雨城区2024年重点中学小升初数学入学考试卷含解析
- 土地出租合同书电子版
评论
0/150
提交评论