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- ...
随机推荐
- Android如何获取屏幕的分辨
在实际的项目中,我们经常要得到当前屏幕的分辨率,进行机型适配,得到分辨率其实很简单,主要有两种方法. 方法一: Display mDisplay = getWindowManager().getDef ...
- Codeforces Round #343 (Div. 2) A. Far Relative’s Birthday Cake 水题
A. Far Relative's Birthday Cake 题目连接: http://www.codeforces.com/contest/629/problem/A Description Do ...
- HDU 3473 Minimum Sum(划分树)
Minimum Sum Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- 使用moment.js管理时间
如果在nodejs下 npm install moment 引用模块: var moment = require('moment'); 用法: 当前时间:2015-11-07 18:00:51 mom ...
- VUE -- 如何快速的写出一个Vue的icon组件?
伴随着Vue的诞生,它似乎就被人寄予厚望,不仅仅是因为其轻量级的MVVM设计方式,而且其实现了组件化开发模式,所以越来越多的人会拿Vue和AngularJS.React Native做比较.具体关于它 ...
- Unity-EasyTouch插件之One Finger
这节课,我们主要讲下单个手指的测试.比如单击啊,双击啊,拖动,单手滑动等. 单击: public class TouchTest : MonoBehaviour { // Subscribe to e ...
- C语言嵌入式系统编程修炼
C语言嵌入式系统编程修炼 2008-08-19 作者:宋宝华 来源:天极网 C语言嵌入式系统编程修炼之背景篇 本文的讨论主要围绕以通用处理器为中心的协议处理模块进行,因为它更多地牵涉到具体的C语言编程 ...
- android 开源项目集合
http://p.codekk.com/ http://www.apkbus.com/code.php http://androidxref.com/ https://www.androidos.ne ...
- mount命令汇总
(一)挂接命令(mount) 首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的. 命令格式: mount [-t vfstype] [-o op ...
- IT词汇表
本人采集到了数十万篇中文技术类博客,进行分词后根据出现的词频手工整理了一份IT词汇表,共计12000个,基本囊括了常见的中英文IT词汇,欢迎各位提出交流意见. 点此 下载