众所周知,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文档图片插入失败的更多相关文章

  1. 【hibernate 执行方法未插入数据库】hibernate的save方法成功执行,但是未插入到数据库

    今天做项目,碰上这个问题: hibernate的save方法成功执行,但是未插入到数据库. Dao层代码: @Override public void save(T t) { this.getSess ...

  2. 使用Npoi向Excel中插入图片

    先把数据库中的数据都导入到Excel表格中,把图片地址的路径全部转成绝对路径. 使用Npoi读取刚导出的Excle表格,把图片那个单元格的图片路径读出来,然后用文件流读取图片,然后通过Npoi把图片放 ...

  3. 将图片插入到excel中

    static void Main(string[] args) { //说明:插入图片 //1.创建EXCEL中的Workbook IWorkbook myworkbook = new HSSFWor ...

  4. java POI实现向Excel中插入图片

          做Web开发免不了要与Excel打交道.今天老大给我一个任务-导出Excel.开始想的还是蛮简单的,无非就是查找,构建Excel,response下载即可.但是有一点不同,就是要加入图片, ...

  5. C#读取Excel的其中一种方式OleDb读取(100万条)--快速大量插入SQL中

    主要运用表类型 Create table BulkTestTable( Id nvarchar(), UserName nvarchar(), Pwd nvarchar() ) Go CREATE T ...

  6. c# 应用NPOI 获取Excel中的图片,保存至本地的算法

    要求:读取excel中的图片,保存到指定路径 思路:  利用NPOI中 GetAllPictures()方法获取图片信息 步骤: 1.新建一个Windows窗体应用程序 2.桌面新建一个excel,贴 ...

  7. 开发宏功能:excel中从sheet批量插入

    源数据如图: 宏操作: 生成数据后: 关键操作:在excel中启用开发工具,添加宏,然后添加模块即可,编辑完代码后,自定义功能按钮即可. Sub MakeDataSource() Dim isExis ...

  8. .net使用NPOI的XSSFWorkbook进行web开发中导出Excel

    之前也使用过NPOI导出excel,这次是因为在导出的excel里新增了几个列,正好超出了255的限制,所以又要改了. 今天主要出了4个问题: 1. Invalid column index (256 ...

  9. java 在Excel中插入图片 POI实现

    一.POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象.它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97- ...

随机推荐

  1. 装载 | Eclipse中搭建最新版本的Android开发环境

    文章目录 准备工作 下载文件 下载JDK并配置系统变量环境 下载安装Eclipse 下载Android SDK 下载ADT插件 使用下载好的软件搭建Android开发环境 安装Android的SDK ...

  2. [转]Java中fina以及static的意义

    一.final        根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效 ...

  3. Ubuntu 16.04搭建原始Git服务器

    说明:不要把有限的生命浪费到权限斗争中! 1.安装SSH sudo apt-get install openssh-server sudo service ssh start 2.安装Git sudo ...

  4. VS2010 C++ 创建COM组件

    1.项目中要使用到com组件,于是了解了一下com,并根据<C#高级编程>中关于com的介绍用vs创建了一下com,用于实验.以下均根据书中的demo做一遍,熟悉一下而已. 2.创建CoM ...

  5. [Java]在窗口界面上画出硬盘中图片文件

    利用类javax.swing.JPanel来在窗口界面上画图.图片文件通过javax.imageio.ImageIO类来获取. import java.awt.Graphics; import jav ...

  6. [转]SSIS ProtectionLevel 对包中敏感数据的访问控制

    本文转自:http://technet.microsoft.com/zh-cn/library/ms141747.aspx 为了保护 Integration Services 包中的数据,可以设置保护 ...

  7. 【转载】C/C++语言分析 & 每年学一种编程语言 & git历史

    http://blog.csdn.net/turingbook/article/details/1778867 <程序员修炼之路>英文注释版 作者提出的经营之道是:——Invest Reg ...

  8. 快速实现一个生产者-消费者模型demo

    package jesse.test1; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Blo ...

  9. 使用MapReduce实现二度人脉搜索算法

    一,背景介绍 在新浪微博.人人网等社交网站上,为了使用户在网络上认识更多的朋友,社交网站往往提供类似“你可能感兴趣的人”.“间接关注推荐”等好友推荐的功能,其中就包含了二度人脉算法. 二,算法实现 原 ...

  10. [Angular] Improve Server Communication in Ngrx Effects with NX Data Persistence in Angular

    Communicating with a remote server via HTTP presents an extra level of complexity as there is an inc ...