众所周知,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. 【插头dp】CDOJ1690 这是一道比CCCC简单题难的简单题

    最裸的插头dp,可参见大白书. #include<cstdio> #include<cstring> using namespace std; #define MOD 1000 ...

  2. Problem D: 零起点学算法83——数组中删数

    #include<stdio.h> int main(void) { int n,i,t,x,flag; while(scanf("%d",&n)!=EOF) ...

  3. 使用idea搭建Spring boot开发初始环境

    准备工作 将以下代码加入idea的live template,命名为springbootStartup <parent> <groupId>org.springframewor ...

  4. iOS 带箭头菜单选项弹窗LFPopupMenu

    一.效果图 由于是模拟器缩得比较小,一些细线可能显示不出来,不是bug哈. 二.用法 LFPopupMenuItem *item1 = [LFPopupMenuItem createWithTitle ...

  5. 域名做CDN来通过隐藏服务器真实IP的方法来防止DDoS攻击(转)

    隐藏服务器真实IP是解决问题最好和最快的方法,但只针对小流量,大流量同样会扛不住. 服务器前端加CDN中转,比如阿里云.百度云加速.360网站卫士.加速乐.安全宝等,如果资金充裕的话,可以购买高防的盾 ...

  6. Visual Studio Code 安装 RUST

    1.下载RUST源码 https://static.rust-lang.org/dist/rustc-1.18.0-src.tar.gz ,解压到C盘   C:\rustc-1.18.0-src 2. ...

  7. VirtualBox Host-Only 连接设置

    1.VirtualBox连接方式选择:Host-Only.在宿主机windows上会自动新建连接:VirtualBox Host-Only Network. 2.启用宿主机windows的连接共享,此 ...

  8. Java RSA加密算法生成公钥和私钥

    原文:http://jingyan.baidu.com/article/6dad5075f33466a123e36ecb.html?qq-pf-to=pcqq.c2c 目前为止,RSA是应用最多的公钥 ...

  9. 实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性、网格、瀑布流效果演示

    实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性.网格.瀑布流效果演示 效果预览 实例APP 小米应用商店 使用方法 build.gradle文件 dependenc ...

  10. appium+python自动化48-长按(long_press)

    前言 长按操作是经常会遇到的场景,通过driver可以直接调出long_press_keycode方法,但是这个方法是长按手机上某个按钮,比如长按电源键,长按home键. 长按某个元素或者长按屏幕上某 ...