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

网上关于这方面资料很多都是提取图形形状图片的方式, 关于这方面资料实在查阅能力有限.
请问有相关经验的前辈提供下解决思路, 谢谢.
...全文
422 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 都是只读取出一个.
是应该以形状去判断是否是附件再导出?
Free Spire.XLS for .NET 是e-iceblue公司开发的一款支持对所有Excel格式类型文件进行操作的.NET 控件。它适用于任何类型的应用程序比如ASP.NET Web应用程序或者Windows桌面应用程序。Spire.XLS for .NET允许开发人员创建和管理Excel,而不需要安装Microsoft Excel或者Microsoft Office。相比Microsoft,Spire.XLS for .NET对于开发人员来说是一个更好的选择 - 自动化,安全,稳定,可扩展性延伸,速度快,价格便宜和功能强大。 通过使用Free Spire.XLS for .NET,开发人员可以快速方便的查看,生成,读写以及自定义编辑Excel文件。Spire.XLS for .NET支持Excel 97-2003, Excel 2007, Excel 2010 and Excel 2013。它还支持C#, VB.NET, ASP.NET和 ASP.NET MVC编程语言 作为一款专业,强大,方便易用的控件,Spire.XLS for .NET有一下主要功能: 新建Excel文件,编辑已有的Excel文件,多种保存Excel方式,设置Excel文件属性,文件打印设置,合并,拆分或者拷贝单元格,支持对Excel文件加锁或者加密保护。 Spire.XLS for .NET支持把数据从数据库导出到Excel工作表,或者把数据从Excel数据导入到数据库。 Spire.XLS for .NET 提供强大的功能为开发者设置单元格格式。这次格式化数字,文字缩进,定位调整,设置单元格边线,单元格填充以及保护等。 开发人员可以轻松的利用Spire.XLS for .NET向Excel文件里面写入内容,包括超过530多种的公式,70多种表格,支持插入图片,不同类型的文字,链接,注释甚至VBA等。 Spire.XLS for .NET 还允许开发人员将Excel文件转换成PDF, HTML, CSV, Text, XML以及图片格式。 注:下载包含有Spire.xls.dll文件以及部分Demo, 你可以调用DLL并参照Demo提供的代码处理Excel文档。
免费Spire.PDF for .NET 是一款由e-iceblue公司开发的专业性的PDF文档创建组件。它能够使用户在不用Adobe Acrobat和其他外部控件的情况下,运用.NET 应用程序阅读,编写和操纵PDF 文档。Spire.PDF for .NET不仅可以运用在服端比如:ASP.NET 或者其他环境,还可以应用在Windows Forms 应用程序中。Spire.PDF for .NET 适合应用于所有常见的坏境中,比如:创建好的PDF文档可以存到磁盘中, 还可以在Windows Forms应用程序,ASP.NET 应用程序客户端浏览器中保存为数据流。 Spire.PDF for .NET 功能丰富。 除了基本的功能比如:绘制多种图形,图片,创建窗体字段,插入页眉页脚,输入数据表,自动对大型表格进行分页外,Spire.PDF for .NET还支持PDF数字签名,将HTML转换成PDF格式,提取PDF文档中的文本信息和图片,存为文本格式和各种图片格式,甚至可以将PDF中的附件提取出来。 主要功能 支持嵌入式字体,Truetype 字体和CJK字体。 支持绘图。比如:矩形,环形,弧形,椭圆形,也可以自定笔刷将其填充。 可以将图片从数据流,磁盘文件中载入到PDF 文档中。 在PDF 文档中既可以绘制梯状图形和矢量图像,还支持掩模和水印图像。 可以在PDF 文档中载入数据表。可以设置表中的行和列的格式,还可以在表内加入图形元素。 自动对PDF 中的大型表格进行分页。 创建窗体字段。比如在PDF 文档中创建按钮,文本框,列表框,复选框等等。 在PDF 中插入页眉页脚。 通过设置所有者密码和用户密码来加密PDF文档。 通过作者的签名来保护PDF文档。 读取当前PDF文档的表格并且填充表格。 HTML网页在转换到PDF文档时会拆分为多个大型页面,这些页面可以原原本本的展现在PDF文档中,而且在PDF文档的分页处没有任何文字的截断。用户还可以将这些网页在不需要临时文件的情况下,直接转换为数据流来创建PDF文档。

111,112

社区成员

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

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

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