【Openxml】如何为OpenXml元素创建超链接
已知在OpenXml有以下几种超链接
| 功能 | 说明 | 
|---|---|
| 跳转页面 | 跳转某一页:ppaction://hlinksldjump 跳转第一页:ppaction://hlinkshowjump?jump=firstslide 跳转最后一页:ppaction://hlinkshowjump?jump=lastslide 跳转下一页:ppaction://hlinkshowjump?jump=nextslide 跳转上一页:ppaction://hlinkshowjump?jump=previousslide  | 
| 跳转文件 | 跳转打开本地文件:ppaction://hlinkfile 跳转打开Office支持的主流文档类文件(office系文档、pdf、txt...):ppaction://hlinkpres?slideindex=1&slidetitle=  | 
| 跳转网页 | 
例子
我们先准备好这样一份pptx文件,如图:

我们分别为四个形状插入超链接,代码如下:
    internal class Program
    {
        static void Main(string[] args)
        {
            var mainExecuteDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            var pptFilePath = Path.Combine(mainExecuteDirectory!, "YourPresentation.pptx");
            // 打开一个PPTX文档
            using PresentationDocument presentationDocument = PresentationDocument.Open(pptFilePath, true);
            var slideIdList = presentationDocument.PresentationPart!.Presentation.SlideIdList;
            if (slideIdList is null || !slideIdList.Any())
            {
                return;
            }
            var firstSlideId =(SlideId) slideIdList.First();
            // 获取页面内容
            var firstSlidePart = (SlidePart) presentationDocument.PresentationPart.GetPartById(firstSlideId.RelationshipId!.Value!);
            //设置跳转到第三页
            var targetSlideId = (SlideId) slideIdList.ChildElements[2];
            var targetSlidePart = (SlidePart) presentationDocument.PresentationPart.GetPartById(targetSlideId.RelationshipId!.Value!);
            var relationshipId = firstSlidePart.CreateRelationshipToPart(targetSlidePart);
            var shapeElements = firstSlidePart.Slide.CommonSlideData!.ShapeTree!.Elements<Shape>().ToList();
            //第一个形状设置跳转第三页
            shapeElements[0]!.NonVisualShapeProperties!.NonVisualDrawingProperties!.HyperlinkOnClick = new HyperlinkOnClick()
            {
                Action = PptAction.SlideJump,
                Id = relationshipId
            };
            //第二个形状设置跳转下一页
            var shapeElement = shapeElements[1];
            shapeElement.NonVisualShapeProperties!.NonVisualDrawingProperties!.HyperlinkOnClick = new HyperlinkOnClick()
            {
                Action = PptAction.JumpNextSlide,
            };
            var filePath = Path.Combine(mainExecuteDirectory!, "两只老虎-原声.mp3");
            var fileHyperlinkRelationship = firstSlidePart.AddHyperlinkRelationship(new Uri(filePath, UriKind.Absolute), true);
            //第三个形状设置打开文件
            shapeElements[2]!.NonVisualShapeProperties!.NonVisualDrawingProperties!.HyperlinkOnClick = new HyperlinkOnClick()
            {
                Action = PptAction.OpenFile,
                Id = fileHyperlinkRelationship.Id
            };
            //第四个形状设置打开网页链接
            var httpHyperlinkRelationship = firstSlidePart.AddHyperlinkRelationship(new Uri($"http://www.baidu.com", UriKind.Absolute), true);
            shapeElements[3]!.NonVisualShapeProperties!.NonVisualDrawingProperties!.HyperlinkOnClick = new HyperlinkOnClick()
            {
                Id = httpHyperlinkRelationship.Id
            };
            // 保存并关闭文档
            presentationDocument.Save();
        }
    }
    public static class PptAction
    {
        /// <summary>
        /// 跳转页面
        /// </summary>
        public const string SlideJump = "ppaction://hlinksldjump";
        /// <summary>
        /// 跳转下一页
        /// </summary>
        public const string JumpNextSlide = "ppaction://hlinkshowjump?jump=nextslide";
        /// <summary>
        /// 打开文件
        /// </summary>
        public const string OpenFile = "ppaction://hlinkfile";
    }
效果如下:

源码
【Openxml】如何为OpenXml元素创建超链接的更多相关文章
- 如何在TextView类中创建超链接 Linkify
		
Linkify是一个辅助类,通过RegEx样式匹配,自动地在TextView类(和继承的类)中创建超链接.符合特定的RegEx样式的文本会被转变成可点击的超链接,这些超链接隐式的调用startActi ...
 - JQ DOM元素 创建 添加 删除
		
创建元素 // 创建元素节点 $('<p></p>'); // 创建属性节点 $('<p class="wow"></p>'); / ...
 - js,javascript,删除元素,创建元素,插入子元素
		
删除元素示例代码 <html> <head> </head> <body> <div> <div id="delId&quo ...
 - 【Openxml】将Openxml的椭圆弧线arcTo转为Svg的椭圆弧线
		
本文将介绍如何将OpenXml的actTo转为Svg的弧线(a) OpenXml的artTo 首先下面是一段OpenXml的arcTo弧线 <arcTo wR="152403" ...
 - 如何为RD网关创建自建签名的证书
		
创建安全的RD网关是一件非常好的事情,这样可以在公网环境下直接远程接入内部的已开启远程访问的主机服务器. 建立这个安全的RD网关需要的材料有RD网关本身,以及一个证书.由于一般情况下这些在RD网关后面 ...
 - a标签创建超链接,利用a标签创建锚点
		
#Html今日学习内容 <!DOCTYPE html> <html> <head lang="en"> <meta charset ...
 - Angular2 直接给元素指定超链接打开会带有 `unsafe` 字样导致数据不能加载
		
解决方法: 在 component 中引入 import { DomSanitizer } from "@angular/platform-browser";然后在构造函数中注入 ...
 - poi操作Word创建超链接
		
项目引入poi: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ ...
 - Ubuntu中如何为wine程序创建快捷方式
		
1.安装一个gnome组件及其应用 sudo apt-get install gnome-panel 2.运行以下命令弹出创建快捷方式的窗口 sudo gnome-desktop-item-edit ...
 - 使用<bind>元素创建变量
		
在使用模糊查询sql时,如果使用${}进行字符拼接,无法防止sql诸如问题,如果使用concat函数则只对mysql有效果,用Oracle则需要用连接符||,这样在数据库变的时候需要修改,不利于移植. ...
 
随机推荐
- ST 表并查集小记🐤
			
ST 表维护并查集,在 $O(n \log n)$ 时间内处理 $[l_1,r_1]$ 内每个点依次向 $[l_2,r_2]$ 中的点连边(共连 $r_1-l_1+1$ 条边) 首先变成对于 $l_1 ...
 - 【JS 逆向百例】某音 X-Bogus 逆向分析,JSVMP 纯算法还原
			
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容.敏感网址.数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未经许 ...
 - win10安装wget,从此可以更快的下载文件 and windows10 下 zip命令行参数详解
			
1.win10安装wget 1.1安装下载 GNU Wget 1.21.3 for Windows 依次如下: 2.将下载好的wget.exe放到 C:/windows/system32文件夹下 也可 ...
 - Redis主从配置、数据持久化、集群
			
发布订阅 ## subscribe 订阅一个或者多个频道 ## publish 给指定的频道发送消息 ## psubscribe 订阅指定模式的频道,*代表所有 ## pubsub channels ...
 - 记录开发中element树形控件数据应用在页面上的相关问题
			
业务场景 根据后台返回数据生成角色权限的树形结构.获取节点数据后,当父节点被勾选时,所有的子节点全部被勾选,而实际上后台并没有返回当前父节点的所有子节点的ID,所以应该只有部分子节点被勾选. 下面第一 ...
 - CF1916E Happy Life in University 题解
			
题目: CF1916E Happy Life in University 链接: 洛谷 或者 CF 前置知识点: 线段树与HH的项链 先简单回顾下HH的项链这题怎么做的吧.先去掉莫队算法,因为这个不是 ...
 - 交换变量a,b的值(java)
			
方法1:引入中间变量 int a = 10; int b = 20; int temp = a; a = b; b = temp; System.out.println("a = " ...
 - python实现百度贴吧页面爬取
			
import requests class TiebaSpider: """百度贴吧爬虫类""" def __init__(self, ti ...
 - B3610 [图论与代数结构 801] 无向图的块 题解
			
题目传送门 前言 本题解内容均摘自我的 Tarjan 学习笔记 . 解法 Tarjan 与无向图 无向图与割点(割顶) 在一个无向图中,不存在横叉边(因为边是双向的). 一个无向图中,可能不止存在一个 ...
 - react中的setState是同步还是异步?react为什么要将其设计成异步?
			
壹 ❀ 引 了解react的同学都知道,react遵守渲染公式UI=Render(state),状态决定了组件UI最终渲染的样子(props也可以理解为外部传入的状态),由此可见state对于reac ...