c# NPOI 如何在指定单元格导入导出图片
Intro
我维护了一个NPOI的扩展(WeihanLi.Npoi),主要用来导入导出Excel数据,最近有网友提出了导入Excel的时候解析图片的需求,于是就有了本文的探索
导入Excel时解析图片
xls和xlsx的API稍有不同,详细可以直接参考以下代码,实现代码如下:
publicstaticDictionaryGetPicturesAndPosition(thisISheetsheet) { vardictionary=newDictionary (); if(sheet.WorkbookisHSSFWorkbook) { foreach(varshapein((HSSFPatriarch)sheet.DrawingPatriarch).Children) { if(shapeisHSSFPicturepicture) { varposition=newCellPosition(picture.ClientAnchor.Row1,picture.ClientAnchor.Col1); dictionary[position]=picture.PictureData; } } } elseif(sheet.WorkbookisXSSFWorkbook) { foreach(varshapein((XSSFDrawing)sheet.DrawingPatriarch).GetShapes()) { if(shapeisXSSFPicturepicture) { varposition=newCellPosition(picture.ClientAnchor.Row1,picture.ClientAnchor.Col1); dictionary[position]=picture.PictureData; } } } returndictionary; }
CellPosition是一个自定义的结构体,表示当前单元格的位置,源码如下:
publicreadonlystructCellPosition:IEquatable{ publicCellPosition(introw,intcol) { Row=row; Column=col; } publicintRow{get;} publicintColumn{get;} publicboolEquals(CellPositionother) { returnRow==other.Row&&Column==other.Column; } publicoverrideboolEquals(object?obj)=>objisCellPositionother&&Equals(other); publicoverrideintGetHashCode()=>$"{Row}_{Column}".GetHashCode(); }
根据上面的代码,我们就可以获取到获取到所有的图片以及图片的所在位置,这样根据单元格位置去找图片信息的时候就会很方便了
导出Excel时设置图片
实现代码如下:
publicstaticboolTryAddPicture(thisISheetsheet,introw,intcol,byte[]pictureBytes,PictureTypepictureType=PictureType.PNG) { if(sheetisnull) { thrownewArgumentNullException(nameof(sheet)); } try { varpictureIndex=sheet.Workbook.AddPicture(pictureBytes,pictureType); varclientAnchor=sheet.Workbook.GetCreationHelper().CreateClientAnchor(); clientAnchor.Row1=row; clientAnchor.Col1=col; varpicture=(sheet.DrawingPatriarch??sheet.CreateDrawingPatriarch()) .CreatePicture(clientAnchor,pictureIndex); picture.Resize(); returntrue; } catch(Exceptione) { Debug.WriteLine(e); } returnfalse; }
通过上面的代码我们就可以在指定的单元格设置图片,目前没有支持单元格合并操作,有需要自己进行修改
WeihanLi.Npoi
WeihanLi.Npoi在1.15.0版本中增加了图片导入导出的支持,使用示例可以参考下面的单元测试:
[Theory] [ExcelFormatData] publicasyncTaskImageImportExportTest(ExcelFormatexcelFormat) { usingvarhttpClient=newHttpClient(); varimageBytes=awaithttpClient.GetByteArrayAsync("https://weihanli.xyz/assets/avator.jpg"); varlist=Enumerable.Range(1,5) .Select(x=>newImageTest(){Id=x,Image=imageBytes}) .ToList(); varexcelBytes=list.ToExcelBytes(excelFormat); varimportResult=ExcelHelper.ToEntityList(excelBytes,excelFormat); Assert.NotNull(importResult); Assert.Equal(list.Count,importResult.Count); for(vari=0;i 导入时会自动将byte[]类型的属性尝试获取对应的单元格位置的图片,如果在对应的位置找到了图片就能够读取到图片的字节数组信息映射到model里的字节数组属性
除此之外,还支持直接导入的时候将图片信息Map到IPictureData属性上,但是觉得还是字节数组更通用一些,如果对此感兴趣可以参考项目源码以及单元测试
More
感谢@ZeguangZhang94童鞋提出的需求和帮忙测试~
如果你也有类似的读取指定单元格的图片或者在指定单元格插入图片的需求,可以试一下上面的方法,希望对你有帮助,可以直接引用我的类库或者直接拷贝源码到自己的项目里使用
References
- https://github.com/WeihanLi/WeihanLi.Npoi
- https://github.com/WeihanLi/WeihanLi.Npoi/blob/dev/src/WeihanLi.Npoi/NpoiExtensions.cs#L1143
- https://stackoverflow.com/questions/24084129/read-image-from-excel-file-using-npoi
- https://stackoverflow.com/questions/41138848/add-image-to-excel-xlsx-using-npoi-c-sharp
- https://github.com/WeihanLi/WeihanLi.Npoi/issues/99
以上就是c#NPOI如何在指定单元格导入导出图片的详细内容,更多关于NPOI在指定单元格导入导出图片的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。