求助!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);
}
}

网上关于这方面资料很多都是提取图形形状图片的方式, 关于这方面资料实在查阅能力有限.
请问有相关经验的前辈提供下解决思路, 谢谢.
...全文
416 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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 都是只读取出一个.
是应该以形状去判断是否是附件再导出?

111,094

社区成员

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

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

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