NPOI word中插入图片

本文详细介绍了使用NPOI库在Word文档中插入图片的两种方法:内联式和锚点式。内联式插图不易调整位置,而锚点式可精确控制图片坐标,适用于复杂布局需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用NPOI制作word数据模板,在插入图片时遇到的一些问题:

1,内联式插图(inline) (这种方式插入图片不好调整显示位置)

XWPFDocument m_Docx = new XWPFDocument();//创建word文档

FileStream gfs = null;
gfs = new FileStream("../../image/1.jpg", FileMode.Open, FileAccess.Read);
CT_P m_p = m_Docx.Document.body.AddNewP();

m_p.AddNewPPr().AddNewJc().val = ST_Jc.center;//段落水平居中
XWPFParagraph gp = new XWPFParagraph(m_p, m_Docx);//创建段落
XWPFRun gr = gp.CreateRun();//创建run
//在run中插入图片
gr.AddPicture(gfs, (int)NPOI.XWPF.UserModel.PictureType.JPEG, "1.jpg", 5300000,2500000);
gfs.Close();

//保存文件到磁盘WinForm  
string docPath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "DocxWord");
if (!Directory.Exists(docPath)) { Directory.CreateDirectory(docPath); }
string fileName = string.Format("{0}.doc", DateTime.Now.ToString("yyyyMMddHHmmssfff"));
FileStream out1 = new FileStream(Path.Combine(docPath, fileName), FileMode.Create);
m_Docx.Write(out1);
out1.Close();

2,锚点插图(anchor)使用四周型的插入方式,可以确定图片坐标位置的方式,文后会放其他的NPOI整理文档连接

FileStream gfs = null;
//读取图片资源
gfs = new FileStream("../../image/1.jpg", FileMode.Open, FileAccess.Read);
CT_P m_p = m_Docx.Document.body.AddNewP();
m_p.AddNewPPr().AddNewJc().val = ST_Jc.center;
XWPFParagraph gp = new XWPFParagraph(m_p, m_Docx);//创建段落
XWPFRun gr = gp.CreateRun();//创建run

CT_Anchor an = new CT_Anchor();
//图片距正文上(distT)、下(distB)、左(distL)、右(distR)的距离。114300EMUS=3.1mm
an.distB = (uint)(0);
an.distL = 0;
an.distR = 0;
an.distT = 0;
an.relativeHeight = 251658240u;
an.behindDoc = false; //"0",图与文字的上下关系
an.locked = false;  //"0"
an.layoutInCell = true;  //"1"
an.allowOverlap = true;  //"1" 

CT_Positive2D simplePos = new CT_Positive2D();
simplePos.x = (long)0;
simplePos.y = (long)0;
CT_EffectExtent effectExtent = new CT_EffectExtent();
effectExtent.b = 0L;
effectExtent.l = 0L;
effectExtent.r = 0L;
effectExtent.t = 0L;
//图左上角坐标
CT_PosH posH = new CT_PosH();
posH.relativeFrom = ST_RelFromH.column;
posH.posOffset = 0;//单位:EMUS,1CM=360000EMUS
CT_PosV posV = new CT_PosV();
posV.relativeFrom = ST_RelFromV.paragraph;
posV.posOffset = 0;

//使用四周型
CT_WrapSquare wrapSquare = new CT_WrapSquare();
wrapSquare.wrapText = ST_WrapText.bothSides;
gr.AddPicture(gfs, (int)NPOI.XWPF.UserModel.PictureType.JPEG, "1.jpg", 5300000,2500000,
posH, posV, wrapSquare,anchor,simplePos,effectExtent);

//保存文件
string docPath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "DocxWord");
if (!Directory.Exists(docPath)) { Directory.CreateDirectory(docPath); }
string fileName = string.Format("{0}.doc", DateTime.Now.ToString("yyyyMMddHHmmssfff"));
FileStream out1 = new FileStream(Path.Combine(docPath, fileName), FileMode.Create);
m_Docx.Write(out1);
out1.Close();

 收集的使用NPOI操作word的文档,还是比较适用的文档 https://download.youkuaiyun.com/download/dengxt/10823924

 NPOI版本: https://download.youkuaiyun.com/download/dengxt/10824550

NPOI是一个用于.NET平台上操作Microsoft Office文件(如Excel、Word等)的开源库。在使用NPOI处理Word文档并插入图片时,你需要首先引用NPOI的`HSSF.usermodel`和`HWPF.usermodel`命名空间,因为Word文档的操作通常涉及到`HWPF`部分。 下面是一个简单的示例代码片段,演示如何使用NPOIWord文档中插入图片: ```csharp using NPOI.HWPF.UserModel; using NPOI.IO; using System.Drawing; // 加载Word文档 using var stream = File.OpenRead("input.docx"); var document = new HSSFWorkbook(stream); // 获取主节(Main Document Part) var mainDocumentPart = document.GetPartByType(HWPFRelation.MAIN_DOCUMENT); // 创建一个绘图对象 HWPFPictureData pictureData = document.CreatePictureData(); pictureData.Biometric = BitConverter.GetBytes((int)PictType.PICT); byte[] imageData = // 这里需要你的图片字节数组 // 设置图片数据 using (MemoryStream ms = new MemoryStream(imageData)) { pictureData.SetImage(ms); } // 创建图片段落,并插入到文档中 var drawing = mainDocumentPart.GetNext DrawingPart(); drawing.RelationshipId = "rId1"; var pic = drawing.CreatePackagePart().CreateRelationship(pictureData.Id, RelationshipType.IMAGE_OBJECT); document.AddPictureData(pictureData); // 定义图片的位置和大小 float left = 50f; // 左侧距离 float top = 100f; // 上方距离 float width = 100f; // 图片宽度 float height = 100f; // 图片高度 var picShape = document.CreateDrawingMLPart<PicShape>(); picShape.SpacerWidth = width; picShape.SpacerHeight = height; picShape.Left = left; picShape.Top = top; docPart.Document.Body.AppendChild(picShape); // 关闭流和文档 document.Close(); stream.Close(); ``` 记得将`imageData`替换为你实际要插入图片字节数组。完成以上步骤后,图片就被成功插入到指定位置了。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值