npoi向word插入图片总结
npoi插入word,一把辛酸一把泪呀,开始总是不能插入图片,一插入就word就打不开了,网上百度,好多人都有这个问题,后来看到一篇poi博客poi博客介绍到这个是一个poi项目的bug。后来就一直在想怎么解决这个bug,悻然我们.net也有大神的存在,博客解决了这个问题npoi博客,但是我照着他的套路做,总是不成功,提示“未将对象引用设置到对象的实例”,好崩溃,后来让老大过来帮忙,终于解决了。特别提示:不同npoi版本对word操作有很大影响。博主曾经试验过很多npoi版本,最后确定npoi2.1.3,兼容性良好。(最后成功整理好的代码,换了其他版本,就不行,就是这么神奇,最新版本2.2.1也不行,想不通poi团队怎么会允许这个bug存在这么长时间)。下面开始正式介绍。
一、介绍这个插入图片的bug
你在网上看到的代码可能是这个样子:
C# Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
|
XWPFDocument doc = new XWPFDocument();
XWPFParagraph p1 = doc.CreateParagraph();
XWPFRun x = p1.CreateRun();
using (FileStream fsImg = new FileStream("E:/1.jpg",
FileMode.Open, FileAccess.Read))
{
x.AddPicture(fsImg, (int)PictureType.PNG, "asd",
(int)(400.0 * 9525), (int)(300.0 * 9525));
}
using (FileStream fs = new FileStream("1.docx", FileMode.Create))
{
doc.Write(fs);
}
|
上面这段代码初次运行,没有任何问题,word也能打得开,因为是初次创建word,里面没有任何内容。但是你若将FileMode.Create换成FileMode.Append,你再试试,打开word,就会出现下面这个界面:
http://s2/mw690/003uYJ3pzy79kXfGH9Td1&690
这是为什么呢?据那篇博客介绍,这是因为在向有内容的word插入图片时,没有正确写入xml文件。那么这个xml文件从哪里看呢?word文件是可以用winRAR打开的,你用winRAR打开就看到了。
结论:上述代码在首次创建word时可以插入图片,当word中有内容的时候追加,就会产生错误写入xml,从而出现打不开word的局面。
二、解决办法
既然不能Append,那我们就在首次创建word的时候,将所有图片一次性加入吧。代码如下:
C# Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
|
for (int i = 0; i < text.Count; i++)
{
XWPFParagraph par = doc.CreateParagraph();
par.Alignment = ParagraphAlignment.LEFT;//左对齐
XWPFRun run = par.CreateRun();
run.FontFamily = "宋体";
run.FontSize = 12;
run.SetBold(false);
par.IndentationFirstLine = 500;//首行缩进
run.SetText(text[i].ToString());//为每段设置值
//每段后面都加入一张图片
using (FileStream fsImg = new FileStream(@"C:\Users\lx\Desktop\10.jpg", FileMode.Open, FileAccess.Read))
{
run.AddPicture(fsImg, (int)PictureType.JPEG, "10.jpg", (int)(500.0 * 9525), (int)(400.0 * 9525));
}
}
XWPFParagraph hm_xp = doc.CreateParagraph();
hm_xp.CreateRun().AddBreak(); //分页
using (FileStream fsa = new FileStream(@"C:\Users\lx\Desktop\11.doc", FileMode.Create, FileAccess.Write))
{
doc.Write(fsa);
}
|
附上npoi插入页码教程:插入页码
注:每插入一张图片,都必须开启一次文件流,注意是必须,一个文件流只能插入一张图片,所以,最好的办法就是循环。
本次博客就分享到这里,我们下次再会。
加载中,请稍候......