NPOI(2.1.3)向excel中插入图片,xls文档图片插入成功,xlsx文档图片插入失败
众所周知,NPOI对xls和xlsx两个版本的excel文档的操作并没有一个统一的支持,
程序若想兼容这两个版本的操作,必须根据excel版本分别去调用HSSF和XSSF这两套操作库,
之前一直不明白NPOI为什么不能提供一个统一的操作接口,现在我还是不明白,
也正是因为存在这个区别才导致了现在的问题!
插入图片,代码非常简单,
IDrawing patriarch = sheet.CreateDrawingPatriarch(); //将图片文件读入一个字符串
byte[] bytes = System.IO.File.ReadAllBytes(setVal); int pictureIdx = sheet.Workbook.AddPicture(bytes, PictureType.JPEG); IClientAnchor anchor = null;
IPicture pict = null; int dx1 = , dy1 = , dx2 = , dy2 = ;
int col1 = colIndex, row1 = rowIndex, col2 = colIndex, row2 = rowIndex;
//图片可能会合并多个单元格,需要计算合并的跨度
if (sheet.GetRow(row1).GetCell(col1)!=null&&sheet.GetRow(row1).GetCell(col1).IsMergedCell)
{
int rowSpan = ;
int colSpan = ;
int regionsCount = sheet.NumMergedRegions;
for (int i = ; i < regionsCount; i++)
{
CellRangeAddress range = sheet.GetMergedRegion(i);
sheet.IsMergedRegion(range);
if (range.FirstRow == row1 && range.FirstColumn == col1)
{
rowSpan = range.LastRow - range.FirstRow + ;
colSpan = range.LastColumn - range.FirstColumn + ;
break;
}
} col2 = col1 + colSpan - ;
row2 = row1 + rowSpan - ;
} //anchor = patriarch.CreateAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2);
////把图片插到相应的位置
//pict = patriarch.CreatePicture(anchor, pictureIdx);
if (fileExt == ".xls")
{
// 插图片的位置 HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2)
anchor = new HSSFClientAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2);
//把图片插到相应的位置
pict = (HSSFPicture)patriarch.CreatePicture(anchor, pictureIdx);
}
else if (fileExt == ".xlsx")
{
anchor = new XSSFClientAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2);
//把图片插到相应的位置
pict = (XSSFPicture)patriarch.CreatePicture(anchor, pictureIdx);
}
最开始的测试模板文件是一个.xls文档,图片插入的目的完美实现,
直到几天之后,来了另外一个.xlsx文档,我代码里面如此明显的支持了它的做法,想当然的以为妥妥的了吧
一测试,瞬间傻眼了懵逼了,导出的文档中怎么都找不到图片!!!
各种修改代码写法(主要是关注类型的转换),调试,没有任何错误和异常,网上搜索了大半天问题,更新最新的NPOI库,甚至到处发帖求教
最后,在网上找了一个简单的XSSF的示例,看上去代码逻辑和我的没什么区别,翻来覆去不就是那么几行代码吗
唯一的不同,示例中的行列参数(col1, row1, col2, row2)是几个明明白白的整数值
单手机械的点了运行,打开文档,嘿~图片居然出现了!只不过由于给的几个参数值很随便,所以图片的位置也很随便
这是个从无到有实现0突破的伟大时刻啊!
瞬间来劲儿了,关注点转向了行列参数值,
经过几轮不同参数值的调试之后,终于在参数和导出的图片位置之间看出了端倪,
代码的修改如下:
// 插图片的位置 HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2)
//后面四个参数定位行列的时候,参数(,,,,0,14,11,14)在xls文档中可以正确定位插入图片,
//但是在xlsx文档中图片找不到了,参数改成(,,,,0,14,12,15)才能正确定位画图
//MMP,定位标准都不统一,严重怀疑NPOI的1.x和2.x版本是两拨人完成,并且没有很好的工作交接......
anchor = new XSSFClientAnchor(dx1, dy1, dx2, dy2, col1, row1, col2+, row2+);
一行代码我给了四行注释,多余的话也不想再说了,心累。。。。
-------------------------------------
现在慢慢缓过来了,
作为一个给予了广大程序员相当的方便的一个开源库,还是得感谢NPOI作者,
只能怪自己对它的理解不够啊。。。
NPOI(2.1.3)向excel中插入图片,xls文档图片插入成功,xlsx文档图片插入失败的更多相关文章
- 【hibernate 执行方法未插入数据库】hibernate的save方法成功执行,但是未插入到数据库
今天做项目,碰上这个问题: hibernate的save方法成功执行,但是未插入到数据库. Dao层代码: @Override public void save(T t) { this.getSess ...
- 使用Npoi向Excel中插入图片
先把数据库中的数据都导入到Excel表格中,把图片地址的路径全部转成绝对路径. 使用Npoi读取刚导出的Excle表格,把图片那个单元格的图片路径读出来,然后用文件流读取图片,然后通过Npoi把图片放 ...
- 将图片插入到excel中
static void Main(string[] args) { //说明:插入图片 //1.创建EXCEL中的Workbook IWorkbook myworkbook = new HSSFWor ...
- java POI实现向Excel中插入图片
做Web开发免不了要与Excel打交道.今天老大给我一个任务-导出Excel.开始想的还是蛮简单的,无非就是查找,构建Excel,response下载即可.但是有一点不同,就是要加入图片, ...
- C#读取Excel的其中一种方式OleDb读取(100万条)--快速大量插入SQL中
主要运用表类型 Create table BulkTestTable( Id nvarchar(), UserName nvarchar(), Pwd nvarchar() ) Go CREATE T ...
- c# 应用NPOI 获取Excel中的图片,保存至本地的算法
要求:读取excel中的图片,保存到指定路径 思路: 利用NPOI中 GetAllPictures()方法获取图片信息 步骤: 1.新建一个Windows窗体应用程序 2.桌面新建一个excel,贴 ...
- 开发宏功能:excel中从sheet批量插入
源数据如图: 宏操作: 生成数据后: 关键操作:在excel中启用开发工具,添加宏,然后添加模块即可,编辑完代码后,自定义功能按钮即可. Sub MakeDataSource() Dim isExis ...
- .net使用NPOI的XSSFWorkbook进行web开发中导出Excel
之前也使用过NPOI导出excel,这次是因为在导出的excel里新增了几个列,正好超出了255的限制,所以又要改了. 今天主要出了4个问题: 1. Invalid column index (256 ...
- java 在Excel中插入图片 POI实现
一.POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象.它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97- ...
随机推荐
- Objective-c nil, Nil, NULL和NSNull的区别
在OC中可能经常会遇到 nil,Nil,NULL和NSNull,下面分析一下之间的区别: Symbol Value Meaning NULL (void *)0 literal null value ...
- [NOIP2011]聪明的质检员
[问题描述] 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有$n$个矿石,从 1 到$n$逐一编号,每个矿石都有自己的重量$w_i$以及价值$v_i$.检验矿产的流程是: 1. 给 ...
- [转][Navicat for MySQL系列]Navicat如何使用(二)
上一篇经验已经建立了数据连接,这篇我介绍一下Navicat for MySQL的“增删改查”功能是如何操作的. 工具/原料 Navicat for MySQL 10.1.7 数据库操作(基本) 1 远 ...
- Java反射机制的简单学习
今天看了一下Java的反射机制,就此记录一下. 首先,我们要先了解一下什么是反射? 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力. JAV ...
- JavaScript 开发的45个技巧
JavaScript是一个绝冠全球的编程语言,可用于Web开发.移动应用开发(PhoneGap.Appcelerator).服务器端开发(Node.js和Wakanda)等等.JavaScript还是 ...
- Mac DBeaver Client home is not specified for connection解决办法
问题: 一般出现这个问题是由于DBeaver 程序无法自动找到数据库的安装目录,在进行数据的导入导出时无法执行,这是因为执行指令需要数据库相关命令的支持. 解决办法: 我用的是mysql,这里拿mys ...
- PHP常用库函数介绍+常见疑难问题解答
来源:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/19/3086858.html 虽然PHP在整体功能上不如Java强大,但相比PHP而言 ...
- asp.net membership 修改密码
aspnet_Applications 存储数据库所涉及应用程序有关信息. aspnet_Membership 存储与用户相关信息例如:用户登陆密码,创建时间. aspnet_Paths 存储应用程序 ...
- Android应用程序访问linux驱动第一步:实现并测试Linux驱动
一直都想亲自做一次使用android应用程序访问Linux内核驱动的尝试,但总是没能做到.最近抽出时间,下决心重新尝试一次.尝试的开始当然是先写一个Linux内核驱动了. 我希望写一个简单测驱动程序, ...
- python开发者常犯的10个错误(转)
常见错误1:错误地将表达式作为函数的默认参数 在Python中,我们可以为函数的某个参数设置默认值,使该参数成为可选参数.虽然这是一个很好的语言特性,但是当默认值是可变类型时,也会导致一些令人困惑的情 ...