求助!c#利用spire.xls提取excel的附件对象

alice0615 2020-05-09 09:57:01
首先, 不知是不是用免费版,所以功能有局限性.
但是利用和spire.doc同样方式提取出的.pdf附件,文件大小是基本准确的
但是打开了却是提示损坏?
本想直接遍历所有的附件的. 但是无论怎样都只识别了一个附件
IOleObjects ss = worksheet.OleObjects;
int i=0;
foreach (IOleObject obj in ss)
{
i++;
if (obj.DisplayAsIcon == true)
{
IXLSRange rs = obj.Location;
int row = rs.Row;
int col = rs.Column;
IPictureShape ip = obj.Shape;
string filename = ip.FileName;
////这好像没办法像doc那样直接判断对象IOleObject 的类型.所以采取直接写数据做实验了
File.WriteAllBytes(@"D:\...\App_Data\Oledb\test"+i+".pdf", obj.OleData);
}
}

网上关于这方面资料很多都是提取图形形状图片的方式, 关于这方面资料实在查阅能力有限.
请问有相关经验的前辈提供下解决思路, 谢谢.
...全文
475 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
alice0615 2020-05-12
  • 打赏
  • 举报
回复
引用 6 楼 yhznb 的回复:
[quote=引用 2 楼 alice0615 的回复:]
[quote=引用 1 楼 yhznb 的回复:]
IOleObject应该有一个属性ObjectType,可以像这样判断if(obj.ObjectType == OleObjectType.WordDocument)


谢谢. 帮忙解决了其中一个问题.
但是.仍存在2个问题.
文件类型可以判断导出了,但是导出的文件却打不开怎么解决?


而且明明同一列有多个附件对象.
存放在IOleObjects ss = worksheet.OleObjects 都是只读取出一个.
是应该以形状去判断是否是附件再导出?[/quote]
版本问题,你的版本可能有点老了,我测最新的10.1版本导出的pdf可以正常打开,你升级下版本[/quote]

本想着对比测试doc和xls的. 所以直接下载了个office版. 因为各下载不同的版本好像涉及到 license 的报错.
谢谢. 试过了的确可以. 版本这些真多坑啊.
换个独立的版本一并解决了附件个数错误和文件打不开的问题了.
alice0615 2020-05-11
  • 打赏
  • 举报
回复
引用 4 楼 wanghui0380 的回复:
Ole.NativeData

问题恐怕在这里,据我所知。现在的office才用xml方式进行保存,所以他现在实际保存的是文档的Base64字符串。

这个Native 估计才是原始二进制


这个是spire.doc的提取方式
byte[] NativeData { get; } 这个是在 DocOleObject 公共类里的 , 试过了的确可行.
但是xls使用的是公共接口里的 byte[] OleData { get; set; } . 看起来存储的不都是字节.难道spire方通过oledata和NativeData来区分实际数据的不同?
受限开发经验,我对接口的使用和概念上不是特别熟, 所以也不明白是不是找错方法了.
wanghui0380 2020-05-10
  • 打赏
  • 举报
回复
Ole.NativeData 问题恐怕在这里,据我所知。现在的office才用xml方式进行保存,所以他现在实际保存的是文档的Base64字符串。 这个Native 估计才是原始二进制
wanghui0380 2020-05-10
  • 打赏
  • 举报
回复
 string s = Ole.ObjectType;

                                //"AcroExch.Document.11"是指PDF对象对应的ProgID

                                if (s == "AcroExch.Document.11")

                                {

                                    File.WriteAllBytes("Result.pdf", Ole.NativeData);

                                }
我不研究这个,只是看问题挂着,帮你的忙百度一个看看能不能解决问题
alice0615 2020-05-09
  • 打赏
  • 举报
回复
引用 1 楼 yhznb 的回复:
IOleObject应该有一个属性ObjectType,可以像这样判断if(obj.ObjectType == OleObjectType.WordDocument)


谢谢. 帮忙解决了其中一个问题.
但是.仍存在2个问题.
文件类型可以判断导出了,但是导出的文件却打不开怎么解决?


而且明明同一列有多个附件对象.
存放在IOleObjects ss = worksheet.OleObjects 都是只读取出一个.
是应该以形状去判断是否是附件再导出?
内容概要:本文围绕“基于交流潮流的电力系统多元件N-k故障模型研究”展开,深入探讨了利用Matlab代码实现电力系统在发生多个关键元件同时故障(即N-k故障)情况下的交流潮流计算与故障分析方法。该模型不仅考虑了传统潮流方程的非线性特性,还引入了故障约束条件,能够精确模拟复杂多样的故障场景,如短路、断线等,进而评估电网在极端运行条件下的稳态与动态行为。研究通过构建典型电力系统算例,验证了所提模型在故障筛选、脆弱性识别及系统恢复策略制定方面的有效性,为电力系统安全评估、风险预警和防御体系构建提供了坚实的理论依据和技术支撑。此外,模型具备良好的扩展性,可进一步应用于连锁故障传播分析、恶意攻击模拟等高级安全分析领域。; 适合人群:具备电力系统分析基础理论知识和Matlab编程能力的高校研究生、科研院所研究人员以及电力公司从事电网规划、运行与安全管理的技术人员,特别适用于开展电力系统安全稳定、可靠性评估与应急响应机制研究的专业人士。; 使用场景及目标:①开展电力系统在多重故障条件下的交流潮流仿真,评估系统电压稳定性、线路过载风险及负荷损失程度;②识别电网中的关键薄弱环节与脆弱元件,支撑电网加固改造与防御资源配置;③用于科研项目中的故障场景建模与算法验证,或作为教学案例帮助学生理解复杂故障下的系统响应机制。; 阅读建议:此资源以Matlab代码为核心实现手段,建议读者结合理论推导与代码实现进行对照学习,重点关注故障建模过程中雅可比矩阵的修正方法、故障注入方式及收敛性处理策略,建议在仿真中逐步增加故障数量与复杂度,深入理解N-k故障对系统潮流分布的影响规律,并尝试将其拓展至含新能源接入的现代电力系统场景中进行验证与优化。

111,130

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧