




已阅读5页,还剩47页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
初识VSTO Addin开发这篇博客将简单介绍一些VSTO Addin开发的知识。1. VSTO是什么?我们可以用VSTO做什么?VSTO全称Visual Studio Toolfor Office,是可以让我们针对现有的Office程序进行功能扩展。在工作或生活中其实我们或多或少用到过VSTO插件,例如安装有道词典/Adobe Pro会在Office程序中嵌入插件程序。2. VSTO开发环境的准备:(1). 我们的PC上需要安装有Office(Office 2007及以上版本);(2). 以Visual Studio 2015为例,在安装时需要勾选Office Development模块。如果初始安装没有安装也没关系,可以在控制面板中通过更改Visual Studio的方式进行安装。成功安装后,打开Visual Studio 2015-新建工程-选择Office Development模块:3. Office 开发的模板,我们主要看(Application-Level/Template-Level)的模板,这两者的加载方式请看下面的图示:打开Office解决方案的文档后,Microsoft Office 应用程序检查自定义文档属性,以确定是否有与文档关联的托管代码扩展。PS: 这两者在开发上的区别就是模板不一样,别的基本没有。另外一个Application-Level是针对整个Office Word/Excel/.的定制,而Template-Level是正对Word/Excel/.模板的定制。4. 我们以VSTO Word Addin为例,讲一下VSTO Word Addin Development中的核心对象。Application: 代表了Word程序Document: 代表了一个Word文档,一个Word Application可以有1个或者多个DocumentBookmark:代表了在Word文档中一个连续的区域,它有一个起始位置和结束位置,可以用一个标识来标记这段连续的区域,这个就是BookmarkRange: 代表了在Word文档中一个连续的区域,它有一个起始位置和结束位置Selection: 代表了当前选中的区域;更多内容,请参考:/en-us/library/kw65a0we(v=vs.90).aspx我们通过新建一个Word Addin的工程来初步认识下这几个对象。Code: private void ThisAddIn_Startup(object sender, System.EventArgs e) Application.WindowSelectionChange += Application_WindowSelectionChange; Word.Document doc = Globals.ThisAddIn.Application.Documents.Open(D:demo.docx, AddToRecentFiles: false); / / WindowsSelectionChange事件 / / 选中文本 private void Application_WindowSelectionChange(Word.Selection Sel) if (Sel.Range.End - Sel.Range.Start 10) Word.Range range = Sel.Range; System.Diagnostics.Debug.WriteLine(Range Start Position: 0 Range End Position: 1, range.Start, range.End); range.Bookmarks.Add(MyBookmark); 运行效果: 向Word的Bookmark中插入一个Bookmark:当我们编译Word Addin工程时,会向注册表中写入插件的一些信息,例如Description, FriendlyName, LoadBehavior, Mantifest等,此时当我们单独打开Word时,插件还是会运行的。清理一下Visual Studio Word Addin工程即可。5. 如何部署VSTO插件(以Word为例),从Visual Studio编译Word插件时,向注册表中写入的信息,我们可以利用这些注册表信息来部署Word插件,需要注意的两个值:LoadBehavior:3 代表了启动时自动加载。具体请参考:/en-us/library/bb386106.aspx中Load BehaviorManifest:指定VSTO插件的具体位置:PS: 也可以将插件的信息写入到注册表Machine节点下:HKEY_LOCAL_MACHINE-SOFTWARE-Microsoft-Office-Word-Addins. 这样登录这台PC的所有用户都可以使用到这个插件。在部署时,我们只需要将这些注册表信息写入正确的位置即可。当然最简单的部署方式可以通过ClickOnce来进行部署。另外也可以选择其他部署方式,例如Windows Installer: 可以参考:/office/VSTO-Deploy-an-Office-fbcc09adVSTO的学习资源/en-us/library/d2tx7z6d(v=vs.90).aspx/office/感谢您的阅读!我的VSTO之路:序VSTO是微软提供给.Net开发人员的一个接口,通过他我们可以对Office程序做一些处理。但是这个接口并不尽善尽美,相比微软的很多其他产品,VSTO的稳定性并不好,相关的文档也很少。这种情况下,很多问题需要我们程序员自己去克服。我自己从08年进了现在这家公司,断断续续做VSTO开发已经快2年半了,不敢说对VSTO精通,但至少已经有了深入的解,尤其对开发中的一些Trick和一些Bug。准备写点东西记录一下这两年来的心路历程。同时也感慨于国内的VSTO文档资料实在匮乏,我自己在开发过程中走了不少弯路,希望我写的这些文档能对后来的开发者们有所帮助。我喜欢在写文档之前先准备一个提纲,然后再往里面填充,所以在序里面,我先列一下我准备写的主要内容1. VSTO基本知识1. 创建项目2. 添加Ribbon3. 添加Task Panel2. Word基本知识1. Word Object Model 介绍 (Application、Document、Range、Selection和Bookmark)1. Application对象2. Document对象3. Range对象4. Selection对象5. Bookmark对象2. 插件:自定义Search面板3. Word深入开发1. 修改右键菜单2. 往文档中插入内容3. 添加超链接、书签4. 基于选中内容,显示悬浮框5. 遗留问题4. Outlook相关知识1. Outlook的基本结构2. 获得Outlook的目录树3. 捕获新邮件和邮件移动4. 修改Outlook右键菜单5. 通过VSTO新建邮件或联系人6. Outlook Form Region的使用,以及扩展Outlook联系人的内容7. 遗留问题5. Excel相关知识1. 修改Excel中,Cell的内容和样式2. 获得Excel中所有内容,即有输入的Cell3. 修改Excel右键菜单4. 遗留问题6. Smart Tag1. VSTO Smart Tag的开发2. COM Smart Tag的开发7. 发布VSTO程序1. Click once方式2. 安装包方式8. VSTO之外1. 对于C#中对于Excel数据的导入与导出*这些文档除了Smar Tag是针对Office 2007的之外,其他的内容基本适用于Office 2007Office 2010。另外,抗议一下微软,居然在Office 2010中废除了Smart Tag大部分的功能。我的VSTO之路(二):VSTO程序基本知识开始之前,首先我介绍一下我的开发环境:VS2010 + Office 2010,是基于.Net framework 4.0和VSTO 4.0。以下的范例代码都基于这个,如果你使用的是VS2008,那么问题也不大,基本可以移植过去。需要注意的是.Net framework 4.0中增加了dynamic类型和可选参数,而这两点新的特性在VSTO 4.0中被广泛使用,新特性的详细内容我就不介绍了,(其实介绍的地方很多,Google一下就可以了),移植的时候需要稍微调整一下代码。创建VSTO项目环境搭建要开发VSTO项目,环境搭建比较简单,微软这方面做得都做不错。只要安装了VS2010(需要勾选VSTO 4.0)和Office2010即可。VS2008配合Office2007也可以轻松搭建开发环境。创建项目选择创建新项目-C#-Office,然后选择Word 2010 Add-in,如下图:可以看到图中除了Word 2010 Add-in,还有Word 2010 Document和Word 2010 Template这两种项目类型。它们的区别在于,Add-in属于Application level,即是一个插件,每次Word启动的时候都会加载这个插件。而Document和Template属于Document Level,这种项目会生成一个Word文件(Document项目会生成.docx文件,而Template会生成.dotx),你写的代码只有在运行这个特定的Word文件的时候才会起作用。添加自定义的Ribbon右击项目-添加新的Item-Office-Ribbon (Visual Designer),如下图:往Ribbon上,添加一个按钮,并取名为Hello双击Hello按钮,在OnClick中,添加如下代码: 1: private void btHello_Click(object sender, RibbonControlEventArgs e) 2: 3: System.Windows.Forms.MessageBox.Show(Hello World!); 4: 按F5运行当前程序,VS会帮你自动开始一个新的Word实例,然后在Word中选择Add-ins标签页,点击Hello按钮。如果你顺利看到Hello Word!对话框,就说明你的第一个VSTO程序,顺利完成了。对于我们的一个VSTO程序,我们做一些小的优化。从前一张图我们可以看到,我们的Ribbon和其他插件的Ribbon都挤在了Add-ins,这个Tabs中。我们现在要把我们的Ribbon独立出来。在VS中,打开Ribbon的设计界面,并选择Ribbon Tab,如下图,把ControlIdType改为Custom,然后把ControlID改为MyFirstAddin,这样我们的Ribbon会独占一个Ribbon Tab。* 这里有个小Trick,如果你的客户希望你把自己建的Ribbon插入到Office自己的Ribbon里面去,我们也可以实现。把ControlIdType设定为Office,并把OfficeID设定为TabHome,如下图:运行界面其他的OfficeID可以到这里查看:Office 2010 IDs,Office 2007 IDs添加Task Pane创建Task PaneTask Pane是一个很有用的控件,它可以驻留在Office程序的窗口上,让开发者更具自己的需求创建界面。首先我们先创建一个User Control,之后这个User Control将嵌入在Task Pane中。而我们所添加的代码,主要也加在这个User Control中。在UserControl上放一个Label,我们暂时不在这里写进一步的代码:在ThisAddIn.cs文件中,进行如下修改,这样在这样Addin被加载时,就会显示Task Pane: 1: public partial class ThisAddIn 2: 3: public CustomTaskPane _MyCustomTaskPane = null; 4: 5: private void ThisAddIn_Startup(object sender, System.EventArgs e) 6: 7: UCForTaskPane taskPane = new UCForTaskPane(); 8: _MyCustomTaskPane = this.CustomTaskPanes.Add(taskPane, My Task Pane); 9: _MyCustomTaskPane.Width = 200; 10: _MyCustomTaskPane.Visible = true; 11: 12: 13: private void ThisAddIn_Shutdown(object sender, System.EventArgs e) 14: 15: 16: 17: #region VSTO generated code 18: / 内容被省略 19: #endregion 20: 运行结果:将Task Pane与Ribbon关联我们已经完成了一个Task Pane,接下去要用之前创建的Ribbon控制Task Pane的显示。先对之前的Ribbon做一些修改,增加两个按钮,同时我们对界面做一些美化,具体步骤我这里不详述了,界面如下图:为Open Task Pane和Close Task Pane添加Onclick事件,代码如下: 1: private void btnOpen_Click(object sender, RibbonControlEventArgs e) 2: 3: if (Globals.ThisAddIn._MyCustomTaskPane != null) 4: 5: Globals.ThisAddIn._MyCustomTaskPane.Visible = true; 6: 7: 8: 9: private void btnClose_Click(object sender, RibbonControlEventArgs e) 10: 11: if (Globals.ThisAddIn._MyCustomTaskPane != null) 12: 13: Globals.ThisAddIn._MyCustomTaskPane.Visible = false; 14: 15: 运行你的程序,便可以看到结果了。本文总结到这里,我介绍了VSTO的开发方法,以及Ribbon和Task Pane的基本知识,本文中的范例程序可以在这里下载:MyFirstAddin.zip。在之后的文章中,我会深入介绍Word、Excel和Outlook的具体开发实例以及开发的细节。详细请看,我之前写的序,/izualx/archive/2011/04/30/2033289.html。本文欢迎转载,但请保留出处,大家如果有问题,可以联系我我的VSTO之路(三):Word基本知识在前一篇文章中,我初步介绍了如何如何开发一个VSTO程序,在本文中,我将进一步深入介绍Word的插件开发。Word是一个大家在日常工作中一直接触的文档工具,也是微软最赚钱的产品之一。从最初的Word 1.0到现在的Word 2010历经了13代的演化,已经成为了一个比较复杂的系统。(这里稍微跑题一下,Office 2010的版本代号是version 14,但是我为什么说Word一共演化了13代呢?因为Office并没有Version 13,上一代的Office 2007是Version 12,微软觉得13这个死数字不吉利,所以直接跳过了Oh my god)。言归正传,我录制了一段视频来演示本文所要介绍的内容。这段视频,描述了一个简单的Word搜索插件,包含了以下几个功能点1. 自定义Ribbon 2. 自定义Task Pane 3. VSTO插件中获取Word内容全文 4. 修改Word内容和样式 其中关于如何创建Ribbon和Task Pane的内容,我已经在前一篇文章中介绍了,如果你还不熟悉,可以看这里。Word Object Model 介绍 首先,要开发出良好的程序,我们需要了解我们的开发平台,而Word本身是一个很复查的平台,我在这里先从Word的对象模型开始介绍。Word Object Model中一共包含有数百个不同类型的对象,其中最关键的也是最常用的是Application、Document、Range、Selection和Bookmark,他们的关系如下图:我来依次介绍这几个对象:Application 对象Application代表Word程序,而一个Word程序内可以包含多个Word文档。用通俗的话来说,无论你开几个Word文档,都是在一个Word进程里面管理。这我们以后会讲到的Excel不一样。同时Application又是所有Word对象根,你可以通过Application对象,获得其他对象。在Addin开发过程中,我们可以通过以下方式来获得Application对象: Globals.ThisAddIn.ApplicationDocument 对象Document对象代表着一个Word文档,即便你刚打开你的Word,是一个空的新文档,也会有一个Document。在开发过程中,以下这个属性从Application中获得当前的Document对象: Globals.ThisAddIn.Application.ActiveDocument此外Application对象也维护着一个集合,即Application.Documents,里面包含着现在所有打开的Word文档。Range 对象Range是一个比较特殊的对象(我其实都不知道如何用中文翻译贴切地翻译这个单词),在你日常使用Word的过程中,你甚至可能不会知道有这样一个对象存在,但如果你想通过程序方式修改Word正文的内容,Range是一个很关键的对象。用微软官方的表述,Range代表着文档中一片连续的区域,微软为它列出了一下几个特性:1. Range的组成成分可以是单独的插入点,也可以是一个文本范围或整个文档。 2. Range包含非打印字符,例如空格、制表符和段落标记。 3. Range可以是当前所选内容所表示的区域,也可以表示当前所选内容之外的区域。 4. Range与始终可见的所选内容不同,它在文档中是不可见的。 5. Range不随文档保存,仅存在于代码运行期间。 我再为它加2条1. Range有明确的开始和结束,但不同的Range之间是可以有交集的 2. Range的长度是在变化的,如果你往一个Range里面插入的一个单词,它的长度会自动变长。 获得Range对象的方式很多,我们可以通过Document对象的Range(ref object Start = Type.Missing, ref object End = Type.Missing)方法,创建一个自定义的Range。通过Word中文档相关的对象都有一个Range属性,比如Paragraph.Range、Selection.Range。Selection 对象Selection代表着当前光标所选中的对象,我们在开发过程中这个对象会和Application.WindowSelectionChange一起使用。 1: / 2: / Summary: 3: / Occurs when the selection changes in the active document window. 4: event ApplicationEvents4_WindowSelectionChangeEventHandler WindowSelectionChange;Delegate接口 1: TypeLibType(16) 2: ComVisible(false) 3: public delegate void ApplicationEvents4_WindowSelectionChangeEventHandler(Selection Sel);Bookmark 与 Content ControlBookmark即书签,在Word文档中做一个标记,方便查阅。开发过程中,我们可以基于Range来创建Bookmark。如: 1: / 将第一段文档标记为一个BookMark 2: Word.Range range = Globals.ThisAddIn.Application.ActiveDocument.Paragraphs0.Range; 3: range.Bookmarks.Add(JustinTest);至此我们已经介绍完毕了Word中的主要5个对象,现在我们运用我们学到的东西,来实开头视频中的那个插件插件:自定义Search面板我先定义一下我们要实现的功能点,获得Word文档的内容,取得与检索关键字相关的上下文并显示在ListView中,当用户点中ListView中的项目时,高亮显示Word文档中对应的内容。以下是如何实现这几个功能的介绍。获得Word的全文 要取得当前Word的全文,我们主要要解决两个问题。1. 如何获得当前的Document对象? 2. 如何通过Document对象获得文档内容? 对于第一个问题,因为搜索功能主要是写在Task Pane中的UserControl中(这一点在上一篇文章中已经有过介绍),所以取得Document对象的主要方法,是通过Application对象获得ActiveDocument的对象,即当前编辑的文档: Globals.ThisAddIn.Application.ActiveDocument对于第二个问题,我们有两个方法:首先,Document对象有Paragraphs集合,这个集合里面包含了每个段落的对象,而每个段落对象,都有Range属性,我们可以通过Paragraph.Range.Text,来获得每个段落的正文。其次Document对象有一个Range方法,通过它我们可以把整个Document作为一个Range。Search按钮代码 1: private void btnSearch_Click(object sender, EventArgs e) 2: 3: / 清楚文档中的高亮显示 4: ClearMark(); 5: 6: lvSearchResult.Items.Clear(); 7: if (string.IsNullOrWhiteSpace(tbSearchText.Text) 8: 9: return; 10: 11: 12: / 按段落检索 13: Word.Document currentDocument = Globals.ThisAddIn.Application.ActiveDocument; 14: if (currentDocument.Paragraphs != null & 15: currentDocument.Paragraphs.Count != 0) 16: 17: foreach (Word.Paragraph paragraph in currentDocument.Paragraphs) 18: 19: MatchCollection mc = Regex.Matches(paragraph.Range.Text, tbSearchText.Text.Trim(), RegexOptions.IgnoreCase); 20: if (mc.Count 0) 21: 22: foreach (Match m in mc) 23: 24: try 25: 26: int startIndex = paragraph.Range.Start + m.Index; 27: int endIndex = paragraph.Range.Start + m.Index + m.Length; 28: 29: Word.Range keywordRange = currentDocument.Range(startIndex, endIndex); 30: 31: / 获取上下文信息 32: / 获取前两个单词的位置(如果有) 33: startIndex = GetStartPositionForView(paragraph, m, startIndex); 34: 35: / 获取后两个单词的位置(如果有) 36: endIndex = GetEndPositionForView(paragraph, m, endIndex); 37: 38: / 在ListView中展示检索的关键字以及其上下文 39: Word.Range range = currentDocument.Range(startIndex, endIndex); 40: ListViewItem item = new ListViewItem(range.Text); 41: item.Tag = keywordRange; 42: lvSearchResult.Items.Add(item); 43: 44: catch (Exception ex) 45: 46: MessageBox.Show(ex.Message); 47: 48: 49: 50: 51: 52: 介绍一下这段代码的几个功能点:1. 在Search功能开始时,先清除文档中的高亮显示(ClearMark方法稍后会介绍)。 2. 分段落,依次查找关键字。 3. 获得关键字的上下文,并放入ListView中显示。需要注意的时候,我在ListViewItem的tag对象里面,存入了Keyword在文档中的Range,为了ListView点击事件。 ListView点击事件 1: private void lvSearchResult_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) 2: 3: ClearMark(); 4: if (lvSearchResult.SelectedItems.Count 0) 5: 6: Word.Range range = lvSearchResult.SelectedItems0.Tag as Word.Range; 7: 8: / 为了可以恢复被修改的Range,我先将该Range和原本的Color放入Class的成员 9: _LastRange = range; 10: _LastRangeBackColor = range.HighlightColorIndex; 11: range.HighlightColorIndex = Word.WdColorIndex.wdYellow; 12: 13: 总体来说这段代码很简单,我稍微介绍一下Range对象的使用,这里我修改了HighlightColorIndex属性,来修改文字的背景色,如果你修改字体相关的样式,可以通过Range.Font属性。(此外,我会在下一篇文中,介绍如何通过Range加超链接、书签或者Content Control)。其他方法 1: private void ClearMark() 2: 3: if (_LastRange != null) 4: 5: _LastRange.HighlightColorIndex = _LastRangeBackColor; 6: 7: 我在Search事件和ListView点击方法中都会先调用这个方法,它会使用在lvSearchResult_ItemSelectionChanged中保存的Range和Color,来恢复之前的样式。总结本文中,我介绍了Word对象模型的基本内容和我写的一个Word插件,包含对Application、Document和Range对象的操作。Word程序包含的内容是很多的,本来想把自己了解的Word知识一次写完,但写到这里发现已经写了很多了,怕大家会看得累,所以先发出来,再下一篇文章,我会进一步深入介绍Word插件开发。下次内容预告:1. 修改右键菜单 2. 往文档中插入内容 3. 添加超链接、书签 4. 基于选中内容,显示悬浮框 最后,本文范例的代码可以在这里下载。此外,本文欢迎转载,但请保留出处,大家如果有问题,可以联系我 。我的VSTO之路(四):深入介绍Word开发在上一篇文章中,我介绍了Word的对象模型和一些基本开发技巧。为了更好的介绍Word插件开发,我为本文制作了一个Word书签的增强版,具体功能是让用户在Word中选择一段文本,为它添加书签并其标志为高亮,同时用户可以为这段书签写注释,以后当用户点击这个书签时,我就会显示注释。以下是我录制的视频介绍:这个插件将包括以下几个技术点:1. 添加右键菜单 添加右键菜单、控制右键菜单显示 WindowBeforeRightClick 事件 删除右键菜单 2. 修改正文内容、样式 1. 修改选定的内容 2. 修改选定的样式 3. 添加控件 1. 添加书签 2. 添加超链接 3. 添加内容控件(Content Control) 4. 基于用户选中内容,执行程序 1. WindowSelectionChange 事件 2. 根据当前光标的位置,显示悬浮框 以下是我对这些功能点的具体介绍右键菜单添加右键菜单右键菜单是Word中相当常用的一个功能,我们在大部分的VSTO开发中也会通过修改这个菜单来扩展Word的功能。最通常地添加右键菜单的方法如下: 1: / 添加右键按钮 2: Office.CommandBarButton addBtn = (Office.CommandBarButton)Application.CommandBarsText.Controls.Add(Office.MsoControlType.msoControlButton, missing, missing, missing, false); 3: 4: / 开始一个新Group,即在我们添加的Menu前加一条分割线 5: addBtn.BeginGroup = true; 6: 7: / 为按钮设置Tag 8: addBtn.Tag = BookMarkAddin; 9: 10: / 添加按钮上的文字 11: addBtn.Caption = Add Bookmark; 12: 13: / 将按钮初始设为不激活状态 14: addBtn.Enabled = false;显示的效果为控制右键菜单显示在很多情况下,我们希望根据用户选择内容来控制右键菜单的显示,那么我们就需要用到WindowBeforeRightClick事件。以下是我在范例中写的代码,只有当用户选择两个以上字符的时候,我才会把我刚才添加的右键菜单激活。请注意代码里面的一些注释,VSTO与Office的COM交互时,并不是很稳定,有很多需要注意的地方。 1: void Application_WindowBeforeRightClick(Word.Selection Sel, ref bool Cancel) 2: 3: / 根据之前添加的Tag来找到我们添加的右键菜单 4: / 注意:我这里没有通过全局变量来控制右键菜单,而是通过findcontrol来取得按钮,因为这里的VSTO和COM对象处理有问题,使用全局变量来控制右键按钮不稳定 5: Office.CommandBarButton addBtn = (Office.CommandBarButton)Application.CommandBars.FindControl(Office.MsoControlType.msoControlButton, missing, BookMarkAddin, false); 6: addBtn.Enabled = false; 7: addBtn.Click -= new Office._CommandBarButtonEvents_ClickEventHandler(_RightBtn_Click); 8: 9: if (!string.IsNullOrWhiteSpace(Sel.Range.Text) & Sel.Range.Text.Length 2) 10: 11: addBtn.Enabled = true; 12: 13: / 这里是另外一个注意点,每次Click事件都需要重新绑定,你需要在之前先取消绑定。 14: addBtn.Click += new Office._CommandBarButtonEvents_ClickEventHandler(_RightBtn_Click); 15: 16: 删除右键菜单我建议在Addin启动和关闭时候(ThisAddIn_Startup与ThisAddIn_Shutdown中),每次都清除由我们添加的右键菜单,虽然按照微软的提示,如果在创建的时候把Temporary属性设为true,系统会在程序退出时自动帮你删除,但是根据我的经验,微软这个许诺没有兑现。 1: private void RemoveRightBtns() 2: 3: Office.CommandBarControls siteBtns = Application.CommandBars.FindControls(Office.MsoControlType.msoControlButton, missing, BookMarkAddin, false); 4: / 这里我写了一个循环,目标是清理所有由我创建的右键按钮,尤其是由于Addin Crash时所遗留的按钮 5: if (siteBtns != null) 6: 7: foreach (Office.CommandBarControl btn in site
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 纪委监委舆情管理办法
- 企业安全知识培训讲师课件
- 2025年深入贯彻中央八项规定精神学习教育应知应会试题及答案
- 出租屋灭火安全培训课件
- 企业安全工作培训会课件
- 出海安全培训课件
- 无人机信号安全管控技术-洞察及研究
- 2025国家能源集团内蒙古上海庙发电有限公司煤炭买卖合同
- 企业安全培训资料模板课件
- 出口退税课件介绍
- 2023广东惠州市惠城区桥西街道办事处招聘治安队员、党建联络员、社区“两委”班子储备人选笔试通告笔试备考题库及答案解析
- 《现代汉语》(增订6版)笔记和课后习题(含考研真题)详解
- 碳水化合物计算2
- 2022年贵州省贵阳市中考语文试卷及答案
- 开学第一课课件-外研版七年级英语上册
- GB/T 13912-2020金属覆盖层钢铁制件热浸镀锌层技术要求及试验方法
- “探究”测定某种食物中的能量实验报告单
- 羊奶的营养价值(课堂PPT)
- 最新海关AEO高级认证培训课件
- 食品工艺学夏文水课件
- 选矿厂安全风险分级管控表
评论
0/150
提交评论