已知在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元素创建超链接的更多相关文章

  1. 如何在TextView类中创建超链接 Linkify

    Linkify是一个辅助类,通过RegEx样式匹配,自动地在TextView类(和继承的类)中创建超链接.符合特定的RegEx样式的文本会被转变成可点击的超链接,这些超链接隐式的调用startActi ...

  2. JQ DOM元素 创建 添加 删除

    创建元素 // 创建元素节点 $('<p></p>'); // 创建属性节点 $('<p class="wow"></p>'); / ...

  3. js,javascript,删除元素,创建元素,插入子元素

    删除元素示例代码 <html> <head> </head> <body> <div> <div id="delId&quo ...

  4. 【Openxml】将Openxml的椭圆弧线arcTo转为Svg的椭圆弧线

    本文将介绍如何将OpenXml的actTo转为Svg的弧线(a) OpenXml的artTo 首先下面是一段OpenXml的arcTo弧线 <arcTo wR="152403" ...

  5. 如何为RD网关创建自建签名的证书

    创建安全的RD网关是一件非常好的事情,这样可以在公网环境下直接远程接入内部的已开启远程访问的主机服务器. 建立这个安全的RD网关需要的材料有RD网关本身,以及一个证书.由于一般情况下这些在RD网关后面 ...

  6. a标签创建超链接,利用a标签创建锚点

    #Html今日学习内容 <!DOCTYPE html> <html> <head lang="en">     <meta charset ...

  7. Angular2 直接给元素指定超链接打开会带有 `unsafe` 字样导致数据不能加载

    解决方法: 在 component 中引入 import { DomSanitizer } from "@angular/platform-browser";然后在构造函数中注入  ...

  8. poi操作Word创建超链接

    项目引入poi: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ ...

  9. Ubuntu中如何为wine程序创建快捷方式

    1.安装一个gnome组件及其应用 sudo apt-get install gnome-panel 2.运行以下命令弹出创建快捷方式的窗口 sudo gnome-desktop-item-edit ...

  10. 使用<bind>元素创建变量

    在使用模糊查询sql时,如果使用${}进行字符拼接,无法防止sql诸如问题,如果使用concat函数则只对mysql有效果,用Oracle则需要用连接符||,这样在数据库变的时候需要修改,不利于移植. ...

随机推荐

  1. 手写模拟Spring底层原理-Bean的创建与获取

    作者:京东物流 张鼎元 1 引言 大家好,相信大家对Spring的底层原理都有一定的了解,这里我们会针对Spring底层原理,在海量的Spring源代码中进行抽丝剥茧手动实现一个Spring简易版本, ...

  2. es6数组方法find()、findIndex() filter()的总结

    find()查找符合条件数组的元素(只能够找出第一个符合条件的) // 查找出大33的元素. // find查找第一个符合条件的数组元素(只查找出第一个 找不到返回undefined) // 它的参数 ...

  3. kettle(docker版)系列文章02---hello world

    目标:将mysql库中表的数据定时转到另外一个表中 1.在mysql中新建目标表test_kettle,有字段id,productName,createtime 2.连接mysql数据库 DB连接-- ...

  4. 安装Visual Studio的详细流程

      本文介绍Visual Studio 2022软件Community(社区版)的下载.安装.运行与使用方法.   首先需要提一句,本文介绍的是Visual Studio 2022软件的下载:而其它版 ...

  5. 【druid切换hikari连接池】通过源码分析遇到的问题

    一.前言说明 如果不会配置druid连接池的话,可以参考我这篇博文:springboot整合druid: springboot整合所有的starter方法基本都差不多,添加依赖,开启注解,编写配置,增 ...

  6. python编程中,各种随机种子seed设置总结

    python随机种子seed的作用(强化学习常用到)_汀.的博客-CSDN博客先上代码import mathimport gymfrom gym import spaces, loggerfrom g ...

  7. 9.2 Windows驱动开发:内核解析PE结构导出表

    在笔者的上一篇文章<内核特征码扫描PE代码段>中LyShark带大家通过封装好的LySharkToolsUtilKernelBase函数实现了动态获取内核模块基址,并通过ntimage.h ...

  8. python使用selenium控制已打开的Chrome浏览器

    环境 Python3.11 selenium 4.9.0 Chrome 112.0.5615.138 步骤 为了便于和平常用的Chrome浏览区分,可以先创建一个专门用于开发的Chrome浏览器, 添 ...

  9. 【C语言深度解剖】复数运算问题--【好题系列】学会这题,结构体没问题

    复数问题 今天博主给大家带来一道博主自己在学校做到的一个题目.这个题目可以很好的加深我们对C语言结构体的理解,在这里分享给大家.学懂这题,我们的C语言结构体,没问题了! 本篇建议收藏后食用!以免退出找 ...

  10. ssh原理及使用场景

    用过linux系统的朋友,基本肯定会用过ssh.因为大部分的linux登录都是通过ssh将进行登录,除非你用的是类似windows的桌面版. 一.什么是SSH SSH 为 Secure Shell 的 ...