加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

npoi插入word图片(终于解决插入图片后打不开word)

(2017-03-08 09:42:13)
分类: C#

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 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 0text.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插入页码教程:插入页码
注:每插入一张图片,都必须开启一次文件流,注意是必须,一个文件流只能插入一张图片,所以,最好的办法就是循环。

本次博客就分享到这里,我们下次再会。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有