怎样自动把报表插入到word文档中

企业动态
在很多业务场景中需要在word文档中嵌入报表。如果能把报表嵌入word文档做成流水线式的自动化过程,那就是一件两全其美,事半功倍的事情。

[[217561]]

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

 

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

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

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

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

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

 

比如我们开篇看到的大学毕业生就业报告,我们可以先做成如上图所示的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();  
  • 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.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.

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

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

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

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

1、编辑配置文件xml

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

 

<?xml version=”1.0″ encoding=”UTF-8″ standalone=”yes”?> 
 
<!– file表示模板docx文件名,可配置绝对路径或相对路径(web端配置时相对于raqsoftConfig.xml中的reportFileHome) –> 
 
<docx file=”D:/test.doc”> 
 
<!– name表示docx书签,为空则不会插入。 file表示图片文件名,可配置绝对路径或相对路径(web端配置时相对于raqsoftConfig.xml中的reportFileHome) –> 
 
<bookmark name=”logo” type=”image” file=”D:/logo.png”/> 
 
<!– name表示docx书签, text要插入的文本文字 –> 
 
<bookmark name=”编号” type=”text” text=”12345678 “/> 
 
<bookmark name=”时间” type=”text” text=”20170730“/> 
 
<bookmark name=”年度” type=”text” text=”2017 “/> 
 
<!– key表示给定map中的key(未填时跟name相同,对应的value只能是IReport、byte[]、Image、String) –> 
 
<bookmark name=”统计图” type=”map” key=”f”/> 
 
<!– reportFile表示报表模板文件名,可配置绝对路径或相对路径(web端配置时相对于raqsoftConfig.xml中的reportFileHome)–> 
 
<bookmark name=”报表” type=”report” reportFile=”D:/毕业去向.rpx”> 
 
<!– value表示报表参数值(串) –> 
 
         <reportParam name=”arg1″ type=”value” value=”设定参数1″/> 
 
<!– type为map时会从内存中根据name读取keykey未填写时跟name相同,key=””时会取map中key为空的值–> 
 
<reportParam name=”arg2″ type=”map”/>        
 
</bookmark> 
 
</docx> 
  • 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.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.

注:在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);   //设置xml中key为f的值 
 
       map.put(“arg2”, “2014-12-15 12:00:23”);//当插入对象来自内存,比如String,设置xml中key为arg2的值      
 
DocxChanger.insert(map, xmlConfig, fos); 
 
        fos.close(); 
 
       } catch (Throwable x) { 
 
      x.printStackTrace(); 
 
      } 
  • 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.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.

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

责任编辑:庞桂玉 来源: 润乾
相关推荐

2024-07-15 15:05:20

Python数据驱动

2024-11-14 13:19:21

Docker容器开发

2009-07-02 13:12:33

JSP打印报表

2023-06-20 19:39:40

JavaScriptHTML

2022-09-29 10:06:56

SQLMySQL服务端

2018-08-02 21:28:00

软件

2020-04-21 10:45:47

PythonWordExcel

2013-11-07 09:14:32

程序员项目经理

2010-08-03 10:45:40

Sharepoint

2011-04-02 12:55:20

SQL Server

2010-09-27 16:26:09

JVMarm

2009-08-28 17:34:14

读取word文档

2009-12-10 14:18:22

PHP导出Word文档

2009-09-01 13:25:25

C#Word文档替换

2009-09-01 13:51:51

C#创建Word文档

2009-09-01 13:13:28

C#打开Word文档

2024-09-03 08:26:59

Spring格式模板

2009-08-11 14:51:47

C#读取Excel中数

2010-03-04 15:56:28

Ubuntu mysq

2023-10-18 13:57:17

点赞
收藏

51CTO技术栈公众号