首页 > 编程语言 >使用C#创建WPS EXCEL单元格内联图片的一些个人纪录

使用C#创建WPS EXCEL单元格内联图片的一些个人纪录

时间:2023-04-09 17:25:48浏览次数:647  
标签:xml 文件 xl C# 单元格 EXCEL rels ID

在WPS中单元格内插入图片会生成一个公式,该公式MS Excel中没有,通过录制宏的方式也无法得知具体的生成API,只会录制出硬编码的设置单元格的公式的代码

例如

 

 通过解压缩单元格内嵌图片保存的xlsx文件,可以大概得知如下关系(重新压缩回去并且将扩展名改回xlsx是行不通的,我试了(╯‵□′)╯︵┻━┻)

图片保存在"/xl/media/"下面

"/xl/_rels/cellimages.xml.rels" 文件里面保存着图片路径与对应映射的"短ID"(我自己起的名字.(*^_^*))

"/xl/cellimages.xml" 文件里面保存着"短ID"与"长ID"的映射关系,"长ID"就是单元格公式内的字符串像这样"ID_8E1D29414F5E421B8B73BDF52F471863"

"/xl/_rels/workbook.xml.rels" 文件里面保存有一条"/xl/cellimages.xml"文件的记录,假如没有这一条WPS貌似认为不存在"/xl/cellimages.xml"文件导致公式计算为错误值

添加完这些地方就可以在单元格中使用公式引用"长ID"内联图片了 例如 "=DISPIMG("ID_472f7988ddc44502965c36a386f5202f",1)"

 

 

 

 

 

 

 

 

 

 

 

 因为无法通过简单的解压缩-修改-压缩的方式自己重新编辑xlsx文件,所以需要借助一些库

例如可以借助"System.IO.Packaging"库来获取xlsx文件中的内容,这个库在dotnet 7中属于扩展库,需要通过NUGET安装

下面的代码会打印XLSX文件中所有的PART名字(或者路径)与类型

根据我个人理解xlsx中的xml,jpeg,rels文件都被视为PART,只不过类型不一样,可以创建,更改,删除PART,然后存储更改

但是我发现_rels路径下面的资源文件会与对应名称的xml文件关联,手动删除对应的xml文件貌似会导致资源文件也被删除,因为不了解打包的这个特性导致我浪费了好长的时间

var pack = System.IO.Packaging.Package.Open("test.xlsx");
        
        foreach (var item in pack.GetParts())
        {
            Console.WriteLine($"{item.Uri} {item.ContentType}");
        }

 

使用C#的XmlDocument类编辑xml,假如需要创建带有命名空间前缀的元素,那么需要调用对应的重载,否则前缀会被去掉,但是,仅仅调用重载的话,会遇到这么一个问题,就是每一个子元素可能都会把命名空间在元素的特性里写一遍,解决办法是手动把所有的命名空间添加到父元素身上,这样类就会自动识别父元素已存在命名空间声明,而不会在每一个子元素上重复声明

假如需要添加带有命名空间前缀的元素特性则需要这样,例如如下

XmlDocument doc = new XmlDocument();
XmlElement element = doc.CreateElement("example");
XmlAttribute attr = doc.CreateAttribute("prefix", "localName", "namespaceURI");
attr.Value = "value";
element.Attributes.Append(attr);
doc.AppendChild(element);

 

标签:xml,文件,xl,C#,单元格,EXCEL,rels,ID
From: https://www.cnblogs.com/siwang/p/17290781.html

相关文章

  • 【Spring专题】「技术原理」从源码角度去深入分析关于Spring的异常处理ExceptionHandl
    ExceptionHandler的作用ExceptionHandler是Spring框架提供的一个注解,用于处理应用程序中的异常。当应用程序中发生异常时,ExceptionHandler将优先地拦截异常并处理它,然后将处理结果返回到前端。该注解可用于类级别和方法级别,以捕获不同级别的异常。在Spring中使用ExceptionHandle......
  • Content type 'application/json' not supported] (已解决)
    今天在用postman发请求时,以Json的形式发送一个POJO参数,结果一直报错:WARNING]Resolved[org.springframework.web.HttpMediaTypeNotSupportedException:Contenttype'application/json'notsupported],如下图所示:经过检查各方面都没有问题,最发现是在SpringMVC配置类中没有加 ......
  • 练习记录-cf-div2-856(A-C)
    vp的写出4道C感觉目前不是能力范围以后有机会留下来打比赛的话再说A-PrefixandSuffixArray给出字符串的前缀和后缀问是不是回文 我采用枚举长度为n-1和1的拼凑但是这并不奏效一直wa3后来改用拼两个n/2的就过了如果有大佬看到了希望能解答一下qwq#include<b......
  • chrome对页面重绘和回流以及优化进行优化
    页面的绘制时间(painttime)是每一个前端开发都需要关注的的重要指标,它决定了你的页面流畅程度。而如何去观察页面的绘制时间,找到性能瓶颈,可以借助Chrome的开发者工具。  回流与重绘1.当rendertree中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建。这就......
  • post-css/less/sass样式嵌套与命令之"&"符号—BEM
    看了《 less的&详解 https://www.jianshu.com/p/127b0974cfc3》,对于此文再做一别补充常见用法:直接嵌套写法.a{  color:red;  .b{      color:blue;  }}这一类是最常见的 这个一类是我们日常所常见的&的高级用法作为内层选择器表示对父选择器的引用......
  • Leetcode(剑指offer专项训练)——DFS/BFS专项(2)
    课程顺序题目现在总共有numCourses 门课需要选,记为 0 到 numCourses-1。给定一个数组 prerequisites,它的每一个元素 prerequisites[i] 表示两门课程之间的先修顺序。 例如 prerequisites[i]=[ai,bi] 表示想要学习课程ai ,需要先完成课程bi 。请根据给出的......
  • 练习记录- AtCoder Beginner Contest 295(D)
    vp的觉得我的D很聪明所以来写一下(乐D-ThreeDaysAgo题意就是求所有字符出现次数均为偶数的字串数量太笨了所以想了很久我把存在奇数个1当作第2位是2那么当经过了两次1 2^2这个2就变成了02就是第二位就是4...以此类推 所以我遍历一遍字符串求出当前的异或......
  • hack the box responder
    使用IP地址访问Web服务时,我们要重定向到的域是什么?服务器上使用哪种脚本语言来生成网页?抓取返回包判断用于加载网页不同语言版本的URL参数的名称是什么?根据提示,切换语言,可以发现答案是page“page”参数的以下哪一个值是利用本地文件包含(LFI)漏洞的示例:“法......
  • Python DeprecationWarning: executable_path has been deprecated, please pass in a
    借鉴https://blog.csdn.net/lly1122334/article/details/106217320https://blog.csdn.net/qq_57377057/article/details/128463296https://blog.csdn.net/tangya3158613488/article/details/106902110 将之前谷歌浏览器的105版本替换为110版本解决Python:DeprecationWar......
  • spring security自动配置的源码简单分析
    本文基于的springboot版本是2.1.3.RELEASE,用springboot来自动配置springsecurity,一、综述在springboot中使用springsecurity只需要引入如下依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId&......