怎样自动把报表插入到word文档中-九游会登陆

发布时间:2018-01-04 分类:产品文章 tag:,

word0

在很多业务场景中需要在word文档中嵌入报表。比如下图这个报告:

word1

这是一个某大学年度毕业生就业报告,其中表格和统计图的数据来自数据库,如果通过报表工具,制作这样的表格和统计图是轻而易举的事情,但如果要把这些报表和统计图做到word报告里就麻烦很多。以往有两个办法:一个是每次做好报表和统计图之后,导出为word,再手工复制粘贴到word报告中;第二个是把整个报告都做成一个报表模板,然后再一起导出为word。 方法一,纯手工操作效率低;方法二,报表工具排版能力有限,生成的word版面效果不够完美。

那么,还有什么好办法呢?

通常这类报告都有规定的模板样式,只是要定期替换里面的个别信息,比如上图所示的文档编号,报告时间,标题里的年度,图片,每个章节下的报表和统计图,这些信息是动态变化的,而其他文字描述部分以及整体样式都是固定不变的。所以,如果能把报表嵌入word文档做成流水线式的自动化过程,那就是一件两全其美,事半功倍的事情。

润乾报表就提供了把报表嵌入word的功能,实现步骤如下:

1、制作word模板,将需要插入内容的位置设置好书签

word2

比如我们开篇看到的大学毕业生就业报告,我们可以先做成如上图所示的word模板,图示绿色线框位置就是需要定期更新的部分,预先在这些位置插入书签(比如书签名为:编号,时间,logo,年度,报表,统计图),以此标记要插入到word的内容对应插入到什么位置。

2、制作报表,这一步就不详述了。

3、调用润乾报表的raqsoft.report.view.oxml.word.docxchanger里的方法,将图片,文本,报表等内容插入到指定书签位置,生成新的word报告。

 eg

 //设置报表授权文件

file flic = new file(“c:/tmp/report5.lic”);

fileinputstream lis = new fileinputstream(flic);

sequence.readlicense( sequence.p_rpt, lis);

 

file f = new file(“e:/test.docx”);               // 模板文件

file of = new file(“d:/out.docx”);             // 输出文件

 … …

fileoutputstream fos = new fileoutputstream(of);

 docxchanger dc = new docxchanger(f, fos); //实例化docxchanger

 

//书签“编号”,“时间”,“年度”处插入文字

dc.inserttext(编号“, “12345678”);

dc.inserttext(时间“, “20170730”);

dc.inserttext(年度“, “2017”);

 

 //书签“logo”处插入图片文件

file f1 = new file(“d:/logo.png”);

dc.insertimage(“logo”, f1);

 

//书签“报表”,“统计图”处插入报表和统计图

file f2 = new file(“d:/毕业去向.rpx”);

fileinputstream fis =new fileinputstream(f2);

ireport report = reportutils.read(fis);

 fis.close();

context context = new context();

…… 

engine engine = new engine((reportdefine) report, context);

report = engine.calc();

dc.insertreport(报表“, report);

                           

file f3 = new file(“d:/留学.rpx”);

fileinputstream fis2 =new fileinputstream(f3);

ireport report2 = reportutils.read(fis2);

 fis2.close();

context context2 = new context();

…… 

engine engine2 = new engine((reportdefine) report2, context2);

report2 = engine2.calc();

dc.insertreport(统计图“, report2);

                             

//执行所有修改动作,然后关闭输出文件流

dc.execute();

 fos.close();

 

至此,word报告就自动生成了,以后每次只要执行一遍这段程序就行了,是不是方便了不少?

 

 

不过,这个办法还有个缺点,当插入内容变化时,我们就需要修改java代码,而改了代码之后又得重编译部署,难以做到热切换。这个办法还是不够方便。

为此,润乾报表还提供了外部配置的方法来实现word报表,可以预先编辑一个xml文件,在里面写个需要替代的书签等内容,然后程序会读取这个配置文件生成相应的word文档。

这样,当插入内容变化的时候,只要修改xml配置信息即可,而不用修改代码再编译了。我们一起来看一下:

1、编辑配置文件xml

该文件中可配置多个书签和插入对象,当对象来源于内存时,可配置成map,通过key从内存中取值,key值可以是ireport、byte[]、image、string,值的类型程序会自动判断。

编号” type=”text” text=”12345678 “/>

时间” type=”text” text=”20170730“/>

年度” type=”text” text=”2017 “/>

统计图” type=”map” key=”f”/>

报表” type=”report” reportfile=”d:/毕业去向.rpx”>

         设定参数1″/>

       

注:在web应用中,如果web.xml里配置了reportservlet,那么程序会自动加载raqsoftconfig.xml,读取该文件里配置的reportfilehome,数据源信息,授权文件等信息。

2、根据配置信息生成word文档

try {

 file of = new file(“d:/out.docx”);// 输出文件

 ……

fileoutputstream fos = new fileoutputstream(of);

 

 //加载xml,batch.xml内容如上一小节所示

        string xmlconfig = docxchanger.xmlfile2string(“d:/batch.xml”);

 

         //当插入的对象来自内存,比如ireport对象

         file f4 = new file(“d:/留学.rpx”);

         fileinputstream fis = new fileinputstream(f4);

         ireport report = reportutils.read(fis);

fis.close();

context context = new context();

engine engine = new engine((reportdefine) report, context);

report = engine.calc();

 

//当对象来源于内存时,可配置成map

hashmap map = new hashmap();

       map.put(“f”, report);   //设置xmlkeyf的值

       map.put(“arg2”, “2014-12-15 12:00:23”);//当插入对象来自内存,比如string,设置xmlkeyarg2的值

             

docxchanger.insert(map, xmlconfig, fos);

        fos.close();

       } catch (throwable x) {

      x.printstacktrace();

      }

 

说了这么多,大家肯定会觉得理想很丰满,现实很骨感,这个功能是很完美,确实可以帮我解决这些个棘手的问题,但是都知道报表工具价格昂贵,再加上这样小奢的功能,岂不是贵上加贵,为此特意买一套昂贵的报表工具,似乎就不划算了,而开源报表里面又没有这个功能。但是你不知道的是,超高性价比的润乾报表恰巧就有这个功能,恰巧你还看到了。

网站地图