精华内容
下载资源
问答
  • 2021-02-28 18:46:06

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

    一般来说,一个完整的java报表设计流程,大体分为如下几个步骤:

    1:打开设计器

    2:配置数据源

    3:新建报表

    4:配置私有数据源

    5:报表设计

    6:预览报表

    7:发布报表

    第一部分:配置数据源

    步骤一:新建数据库

    打开报表设计器,在设计器最上方的菜单栏当中,选择服务器,在该下拉菜单当中选择公有的数据源管理器,弹出一个数据源管理器对话框。

    点击该对话框左上角的增加数据源按钮来添加新的数据源。在这里我们为数据源命名为FRDemo。

    用鼠标选中刚刚命名的数据源,右边显示对应的数据源属性编辑面板,共有五项属性:驱动,URL,用户名和密码,以及一个测试数据库连接按钮。

    步骤二:设置数据库属性

    首先设置驱动器,在驱动项中选择 sun.jdbc.odbc.JdbcOdbcDriver,然后点击URL文本框旁边的…按钮,系统会根据选择的驱动自动显示对应的URL格式。

    将jdbc:odbc:DatabaseName中的DatabaseName换成正在使用的数据库的名字:FRDemo,即jdbc:odbc:FRDemo。由于FRDemo并未设置用户名和密码,因此这两项属性留空。

    点击测试连接按钮,系统弹出连接成功的消息框表明数据库连接成功。

    如果您的数据库并非Microsoft Access数据库,请根据您原有数据源选择其数据源驱动器。因为URL是根据您的数据源类型来设定的,单击后面的按钮则生成URL的对应模本,如您的数据库是Mysql,那么在驱动程序框中选择“org.gjt.mm.mysql.Driver”,对应可以生成URL为 “jdbc:mysql://localhost/DatabaseName”, 将DataBaseName更换成您的数据库名字。下面依次填写您数据库的用户名和密码,如没有则留空。配置完成后选择下面的“测试链接”,如链接成功则可以进入下一个步骤。

    如非本地数据源请将其中的 localhost换成数据库的IP;如在local后有“:”则将“:”后的数字改为对应的网络服务器端口即可。

    第二部分:报表设计

    报表设计的过程,可以分为如下几个步骤:

    1新建报表

    2定义数据源

    3绑定数据列

    4汇总

    5格式化报表

    步骤一:新建报表

    这一步,就是要选择新建报表的类型,该类型选择共分为三种,分组报表,自由报表。我们的报表设计主要是自由报表类型。因此在下面的报表设计器当中,我们无论选择哪种新建方式,选择的报表类型都可以是自由报表。

    新建报表的第一种选择,是点击文件|新建报表,通过二级菜单来选择要新建的报表类型。

    第二种途径是在工具栏当中,点击新建报表按钮右侧的下拉箭头,出现报表类型选择的列表。另外,还可以直接点击工具栏当中的新建按钮。

    我们设计的主要报表类型是自由报表,因此,选择自由报表类型。打开报表设计界面。

    步骤二:定义数据源

    在选定了报表类型之后,我们需要将报表当中用到的数据进行定义,也就是从数据库当中找到我们在该张报表当中需要用到的数据表。关于公有数据源和私有数据源的详细区别,请参见配置数据源章节。

    在上一个步骤当中,点击确定选定报表类型,系统会自动弹出一个私有数据源对话框。

    点击左上角的添加按钮,新增一个数据源,会弹出一个定义名字的对话框,我们命名为ds1(这里ds是datasource的缩写),点击确定打开私有数据源的编辑页面。

    在SQL文本框中,写入SQL语句“select * from sale”。点击文本框右侧的预览按钮,即可以看到数据库数据的预览。点击确定打开报表设计界面。

    报表设计界面里面,在左侧的数据面板,私有数据源处,可以看到我们刚刚定义的私有数据源ds1。

    步骤三:绑定数据列

    首先,我们先来设置左侧的分组。将ds1中的字段Region字段拖拽到A3单元格中,保留其默认的设置,即数据纵向扩展,并且进行分组,合并相同内容的值。

    更多相关内容
  • 就是由于合同中非数据项的计算公式会根据年份而进行变更,而之前是将公式硬编码到系统中的,只要时间一变,系统就没法使用了,因此要求合同中各个非基础数据的项都能自定义公式,根据设置的公式来自动生成报表和合同...
  • 背景: 需求就是设计一个自定义报表...报表维护页面,添加报表数据源等基本信息,保存后自动报表模块生成报表链接及对应数据。 因为当前项目报表预期会比较简单,能展示,能搜索,能导出即可,再一个希望后期能比较

    (一)大概

    背景:
    需求就是设计一个自定义报表功能,当需要新报表时,能够快速的构建。
    经过初步的构思,有至少三种方式可以实现:

    1. 构建demo代码,一个报表对应编写一套代码,不过可以将重复代码提取,尽可能的缩减代码,每套代码只保留个性化功能点;

    2. 一键生成代码,设计一套代码生成程序,以后需要报表时,一键生成配套代码,然后将代码拷贝到对应程序即可;

    3. 报表维护页面,添加报表数据源等基本信息,保存后自动在报表模块生成报表链接及对应数据。

      因为当前项目报表预期会比较简单,能展示,能搜索,能导出即可,再一个希望后期能比较省事,有个看似高大上的东西,所以,最终选择了方式3。

    思路设计:

    1. 要实现动态生成报表,那就得共用一套代码,不然还需要修改发布等等(当然目前好像也可以,但不是很了解);
    2. 共用一套代码就需要区分各个不同的报表,而且还调用同一个接口
      2.1这个后端可以通过rest风格带参数来区分不同的报表,这个参数可以用这条信息的id来区分,这个id最好是无规律的(比如java的uuid,再一个可以是添加时间加一个随机数方式),不要用id自增(太容易被人试出别的报表链接),最终选择java的uuid方式。
      2,2后端数据解决了,就剩前端,前端要能根据后端传递的不同数据,解析出不同的字段,然后根据这些字段动态的构建报表,这个应该也没问题,无非是页面加载时解析后台传过来的数据,然后渲染上。

    内容步骤
    根据思路,大体可以分成这么几部分:

    1. 设计通用后端接口;
    2. 设计通用前端接口;
    3. 增加管理页面相关前后端;
    4. 添加报表模块;
    5. 整合文档及程序包等。
      此外,由于这个项目设计到多数据源,还有考虑这点。

    基本大概就是这些,下一步简单描述下实现…

    (二)大体实现

    一、通用后端:
    摘取几处主要的代码

    • controller设计
    @Autowired
    	private ICommonReportsService iCommonReportsService;
    	
        @RequestMapping("list/{id}")
        public String list(@PathVariable(value = "id") String id,ModelMap mmap) { 
        	System.out.println("获取到的id为:" + id);
        	List<Map<String, Object>> list = iCommonReportsService.list(id);    	
        	String reportName = iCommonReportsService.getReportName(id);
        	mmap.put("list", list);
        	mmap.put("reportName", reportName);
        	
        	return "report/common"; 
        }
    
    • service设计
    @Autowired
        private JdbcTemplate jdbcTemplate;
        
        @Autowired
        private CommonReportsService commonReportsService;
        
        public List<Map<String, Object>> list(String id) {
    		String sql = getSql(id);
    		String type = getDBType(id);
    		if(type==null || "".equals(type) || "M".equalsIgnoreCase(type)) {
    			return listOfM(id,sql);
    		}else {
    			return commonReportsService.listOfS(id,sql);
    		}
    	}
    
    • 其他设计

    二、通用前端

    项目中使用的前端页面是thymeleaf+bootstrap
    关键代码如下:

    $(function() {
                var list = [[${list}]];
                var dynamicHeader = [];
                /* dynamicHeader.push({
                	field: "state",
                	check: true
                }); */
                
                dynamicHeader.push({
    				checkbox: true
                });
    
                for (var i = 0; i<(Object.keys(list[0])).length; i++) {
                	var property = (Object.keys(list[0]))[i];
                	//console.log(property);
                	dynamicHeader.push({
                		"title": property,
                		"field": property,
                		//显示是否显示隐藏
                		switchable: true,
                		//是否开启排序
                		sortable: true
                	});
                }
                
                $('#bootstrap-table').bootstrapTable('destroy').bootstrapTable({
                	data: list,
                	//Bstable工具导航条
                	toolbar: '#toolbar',
                	//浏览器缓存,默认为true,设置为false避免页面刷新调用浏览器缓存
                	cache: false,
                	//是否显示行间隔色
                	striped: true,
                	//分页方式:client客户端分页,server服务端分页
                	sidePagination: "client",
                	//排序方式
                	sortOrder: "desc",
                	//每页记录行数
                	pageSize: 25,
                	//初始化加载第一页
                	pageNumber: 1,
                	//可供选择的每页行数
                	pageList: "[25, 50, 100, All]",
                	//是否显示切换按钮
                	showToggle: true,
                	//是否显示所有的列
                	showColumns: true,
                	//是否显示导出按钮
                	showExport: true,
                	//导出数据类型(
                	exportDataType: "basic",
                	//是否显示分页
                	pagination: true,
                	//是否启用全匹配搜索,否则为模糊搜索
                	strictSearch: false,
                	//开启搜索
                	search: true,
                	//自定义所生成的动态表头放入,结合上述data数据,实现表格数据内容的构建
                	columns: dynamicHeader
                });
                
            });
    

    代码参考:
    如何实现BootStrapTable的动态表格
    (后面计划也会转载过来)

    展开全文
  • 通常采用的方式是“Java+POI+Excel模板”来制作简单的报表生成Excel。 其实Java中实现Excel根据模板导出数据的方法有很多,一般简单的可以通过操作pol进行。还可以使用一些工具很轻松的实现模板导出,这些工具...

    日常工作中可能经常会涉及到用java开发报表,需求比较多的就是表格类的报表导出,单元格合并,图表的展现。具体怎么实现,分表格和图表两类来说。

    1、表格类

    通常采用的方式是“Java+POI+Excel模板”来制作简单的报表,生成Excel。

    其实Java中实现Excel根据模板导出数据的方法有很多,一般简单的可以通过操作pol进行。还可以使用一些工具很轻松的实现模板导出,这些工具现在还在维护,而且做得比较好的国内的有easypoi,国外的就是jxls了。

    如果是要用java开发报表模块和功能,其实可以着重利用jxls框架。

    我用jxls也有半年时间了,半年前因项目原因需要导出大量的excel文件,所以找到了jxls,基本可以完全满足所有的项目需要。不使用easypoi的原因是那时候测试时候效果不是很好,项目中有很多复杂的报表(大量单元格合并和单元格样式),easypoi处理合并单元格时候容易出现残损的情况。

    而且pol、jxl代码工作量大,编码效率很低且不方便维护。Jxls的话相对简单轻量,使用特定的标记在excel模板文件中来定义输出格式和布局。

    jxls是通过预制excel模板,然后通过jxls响应API将我们应用程序的数据结合模板格式输出到相应的excel文件中,从而形成报表。

    Java开发报表怎么做?这2类100%提高效率的工具,你得试试

     

    报表的其他需求还有很多,比如前端查询,相关的组件很多,原理无非就是选择你所关注的信息(数据列),选择时间等(查询条件)生成数据集,然后在servlet中将数据集转成报表组件所需要的格式,传送到前台渲染。

    2、图表类

    涉及到报表的图表开发,就是饼图、柱状图那些,可以用echarts还有highchart。

    这里要注意,如果是做web端的图表,不要使用java层的组件,使用js层的组件,因为java层的组件生成的是图片,而js是生成的web代码,如果有交互性的功能和动态功能,java层的组件是难以实现的,同时在java层构造图片也是比较严重消耗服务器性能的。

    推荐使用js层图表组件库,常用的有echarts和国外的知名组件highchart,因为是js组件库,服务端只用推送数据到客户端,有js来绘制图层,因此不需要写文件下载的模块。

    Java开发报表怎么做?这2类100%提高效率的工具,你得试试

     

    这里总结一些报表开发常用的开源组件库吧:

    • Java office、pdf 操作组件库
    • Apache POI
    • JXL
    • iText
    • OpenOffice
    • PDFBox
    • jquery.table2excel.js

    图表前端

    • ECharts
    • Highcharts
    • D3

    后面我就不用java开发报表了,因为报表需求量大,以往的大量报表还要维护,然后还有各种复杂的表格形式难以捉摸容易出bug,所以后面就直接用专业的报表工具。

    像报表导出,图表制作,开发少说2天,如果用报表工具基本上分分钟的事。哎,能有现成工具真的不要花时间和人力去开发应用来解决问题。

    报表工具github是哪个有开源的,之前我们用过jaspereport一阵,好处就不多说了,网上一搜一大把。但是打印报表、复杂的数据计算有点鸡肋,加之我们要和很多应用系统做集成,报表工具要成为一个数据中台的角色,来集中开发个业务的报表,后面还是采购了FineReport。

    我也算是亲身经历过从“开发——开源——商用报表工具”的人了。

    Java开发报表工具——FineReport

    如果有报表开发需求,没有开发能力,但有预算,采购工具是常用的手段,而且一步到位。工具的成本不比人力低?我们以前一个报表开发团队:4个程序员+6个excel做表。报表项目落地后,直接减半,当然工作量也更大了。

    FineReport的话,简单介绍一下吧。

    功能比较丰富,除了基础的数据展现、填报功能外,还支持定时推送,多级上报,打印导出,移动端,大屏展现等各种场景,俨然是个系统了。

    学习成本低,只要学会简单的sql就可以开发,我当年java开发报表的技能早还给百度了。

    开发速度快,可视化SQL取数,报表页面设计类似Excel、参数查询可批量查询并导出报表。

    Java开发报表怎么做?这2类100%提高效率的工具,你得试试

     

    填报功能是用的很多的,因为业务上要采集很多数据,开发填报模板后数据直接入库,而是每天邮箱里躺着几十份Excel文件。

    以前一张报表我们排需求再制作基本要一周,用FineReport的话,只要配置好数据,1、2个小时。在做项目的时候,可以把一些共性需求的报表做在一个模板里,利用参数查询,批量导出。这种维护的成本也是很低的。

    如果要做开发,FineReport也是有接口的,可以根据需求调用相应的接口,用java开发集成定制,或者用js,但和市面上大部分ERP、OA、CRM系统都有了直接的集成。

    最后,附一张我最近在做的大屏项目作品吧。

    Java开发报表怎么做?这2类100%提高效率的工具,你得试试

     

    Java开发报表怎么做?这2类100%提高效率的工具,你得试试

    展开全文
  • hy.common.report ...Excel模板文件中定义变量名称,格式为 ":xx.yy.zz" ,通过反射生成报表数据。格式中的冒号 ":" 通过模板XML配置定义更换。 1. :xx.yy[].zz 方括号表示前面的方法名称的返回类型
  • Java生成PDF报表

    千次阅读 2017-10-16 13:25:43
    Java生成PDF报表  一、前言  前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iText--用于生成PDF文档的一个Java类库。废话不多说,进入正题。  二、iText简介  ...

    Java生成PDF报表

      一、前言

      前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iText--用于生成PDF文档的一个Java类库。废话不多说,进入正题。

      二、iText简介

      iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。

      iText的安装非常方便,在http://itextpdf.com/ 网站上下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。

      三、建立第一个PDF文档

      用iText生成PDF文档需要5个步骤:

      ①建立com.lowagie.text.Document对象的实例。
      Document document = new Document(); 

      ②建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
      PDFWriter.getInstance(document, new FileOutputStream("Helloworld.PDF")); 

      ③打开文档。
      document.open(); 

      ④向文档中添加内容。
      document.add(new Paragraph("Hello World")); 

      ⑤关闭文档。
      document.close(); 

      通过上面的5个步骤,就能产生一个Helloworld.PDF的文件,文件内容为"Hello World"。

      建立com.lowagie.text.Document对象的实例

      com.lowagie.text.Document对象的构建函数有三个,分别是:
      public Document();
      public Document(Rectangle pageSize);
      public Document(Rectangle pageSize,
      int marginLeft,
      int marginRight,
      int marginTop,
      int marginBottom); 

      构建函数的参数pageSize是文档页面的大小,对于第一个构建函数,页面的大小为A4,同Document(PageSize.A4)的效果一样;对于第三个构建函数,参数marginLeft、marginRight、marginTop、marginBottom分别为左、右、上、下的页边距。

      通过参数pageSize可以设定页面大小、面背景色、以及页面横向/纵向等属性。iText定义了A0-A10、AL、LETTER、HALFLETTER、_11x17、LEDGER、NOTE、B0-B5、ARCH_A-ARCH_E、FLSA 和FLSE等纸张类型,也可以通过Rectangle pageSize = new Rectangle(144, 720);自定义纸张。通过Rectangle方法rotate()可以将页面设置成横向。

      书写器(Writer)对象

      一旦文档(document)对象建立好之后,需要建立一个或多个书写器(Writer)对象与之关联。通过书写器(Writer)对象可以将具体文档存盘成需要的格式,如com.lowagie.text.PDF.PDFWriter可以将文档存成PDF文件,com.lowagie.text.html.HtmlWriter可以将文档存成html文件。

      设定文档属性

      在文档打开之前,可以设定文档的标题、主题、作者、关键字、装订方式、创建者、生产者、创建日期等属性,调用的方法分别是:
      public boolean addTitle(String title)
      public boolean addSubject(String subject)
      public boolean addKeywords(String keywords)
      public boolean addAuthor(String author)
      public boolean addCreator(String creator)
      public boolean addProducer()
      public boolean addCreationDate()
      public boolean addHeader(String name, String content) 

      其中方法addHeader对于PDF文档无效,addHeader仅对html文档有效,用于添加文档的头信息。
    当新的页面产生之前,可以设定页面的大小、书签、脚注(HeaderFooter)等信息,调用的方法是:
      public boolean setPageSize(Rectangle pageSize)
      public boolean add(Watermark watermark)
      public void removeWatermark()
      public void setHeader(HeaderFooter header)
      public void resetHeader()
      public void setFooter(HeaderFooter footer)
      public void resetFooter()
      public void resetPageCount()
      public void setPageCount(int pageN) 

      如果要设定第一页的页面属性,这些方法必须在文档打开之前调用。

      对于PDF文档,iText还提供了文档的显示属性,通过调用书写器的setViewerPreferences方法可以控制文档打开时Acrobat Reader的显示属性,如是否单页显示、是否全屏显示、是否隐藏状态条等属性。

      另外,iText也提供了对PDF文件的安全保护,通过书写器(Writer)的setEncryption方法,可以设定文档的用户口令、只读、可打印等属性。

      添加文档内容

      所有向文档添加的内容都是以对象为单位的,如Phrase、Paragraph、Table、Graphic对象等。比较常用的是段落(Paragraph)对象,用于向文档中添加一段文字。
    四、文本处理

      iText中用文本块(Chunk)、短语(Phrase)和段落(paragraph)处理文本。
    文本块(Chunk)是处理文本的最小单位,有一串带格式(包括字体、颜色、大小)的字符串组成。如以下代码就是产生一个字体为HELVETICA、大小为10、带下划线的字符串:
    Chunk chunk1 = new Chunk("This text is underlined", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE)); 

      短语(Phrase)由一个或多个文本块(Chunk)组成,短语(Phrase)也可以设定字体,但对于其中以设定过字体的文本块(Chunk)无效。通过短语(Phrase)成员函数add可以将一个文本块(Chunk)加到短语(Phrase)中,如:phrase6.add(chunk);

      段落(paragraph)由一个或多个文本块(Chunk)或短语(Phrase)组成,相当于WORD文档中的段落概念,同样可以设定段落的字体大小、颜色等属性。另外也可以设定段落的首行缩进、对齐方式(左对齐、右对齐、居中对齐)。通过函数setAlignment可以设定段落的对齐方式,setAlignment的参数1为居中对齐、2为右对齐、3为左对齐,默认为左对齐。

      五、表格处理

      iText中处理表格的类为:com.lowagie.text.Table和com.lowagie.text.PDF.PDFPTable,对于比较简单的表格处理可以用com.lowagie.text.Table,但是如果要处理复杂的表格,这就需要com.lowagie.text.PDF.PDFPTable进行处理。这里就类com.lowagie.text.Table进行说明。

      类com.lowagie.text.Table的构造函数有三个:

      ①Table (int columns)
      ②Table(int columns, int rows)
      ③Table(Properties attributes)

      参数columns、rows、attributes分别为表格的列数、行数、表格属性。创建表格时必须指定表格的列数,而对于行数可以不用指定。

      建立表格之后,可以设定表格的属性,如:边框宽度、边框颜色、衬距(padding space 即单元格之间的间距)大小等属性。下面通过一个简单的例子说明如何使用表格,代码如下:

      

    复制代码
     1 Table table = new Table(3);
     2 table.setBorderWidth(1);
     3 table.setBorderColor(new Color(0, 0, 255));
     4 table.setPadding(5);
     5 table.setSpacing(5);
     6 Cell cell = new Cell("header");
     7 cell.setHeader(true);
     8 cell.setColspan(3);
     9 table.addCell(cell);
    10 table.endHeaders();
    11 cell = new Cell("example cell with colspan 1 and rowspan 2");
    12 cell.setRowspan(2);
    13 cell.setBorderColor(new Color(255, 0, 0));
    14 table.addCell(cell);
    15 table.addCell("1.1");
    16 table.addCell("2.1");
    17 table.addCell("1.2");
    18 table.addCell("2.2");
    19 table.addCell("cell test1");
    20 cell = new Cell("big cell");
    21 cell.setRowspan(2);
    22 cell.setColspan(2);
    23 table.addCell(cell);
    24 table.addCell("cell test2");  
    复制代码

      运行结果如下:
      header cell test2 

      代码1-5行用于新建一个表格,如代码所示,建立了一个列数为3的表格,并将边框宽度设为1,颜色为蓝色,衬距为5。

      代码6-10行用于设定表格的表头,第7行cell.setHeader(true);是将该单元格作为表头信息显示;第8行cell.setColspan(3);指定了该单元格占3列;为表格添加表头信息时,要注意的是一旦表头信息添加完了之后,必须调用endHeaders()方法,如第10行,否则当表格跨页后,表头信息不会再显示。

      代码11-14行是向表格中添加一个宽度占一列,长度占二行的单元格。

      往表格中添加单元格(cell)时,按自左向右、从上而下的次序添加。如执行完11行代码后,表格的右下方出现2行2列的空白,这是再往表格添加单元格时,先填满这个空白,然后再另起一行,15-24行代码说明了这种添加顺序。

      六、图像处理

      iText中处理表格的类为com.lowagie.text.Image,目前iText支持的图像格式有:GIF, Jpeg, PNG, wmf等格式,对于不同的图像格式,iText用同样的构造函数自动识别图像格式。通过下面的代码分别获得gif、jpg、png图像的实例。
      Image gif = Image.getInstance("vonnegut.gif");
      Image jpeg = Image.getInstance("myKids.jpg");
      Image png = Image.getInstance("hitchcock.png"); 

      图像的位置

      图像的位置主要是指图像在文档中的对齐方式、图像和文本的位置关系。IText中通过函数public void setAlignment(int alignment)进行处理,参数alignment为Image.RIGHT、Image.MIDDLE、Image.LEFT分别指右对齐、居中、左对齐;当参数alignment为Image.TEXTWRAP、Image.UNDERLYING分别指文字绕图形显示、图形作为文字的背景显示。这两种参数可以结合以达到预期的效果,如setAlignment(Image.RIGHT|Image.TEXTWRAP)显示的效果为图像右对齐,文字围绕图像显示。

      图像的尺寸和旋转

      如果图像在文档中不按原尺寸显示,可以通过下面的函数进行设定:
      public void scaleAbsolute(int newWidth, int newHeight)
      public void scalePercent(int percent)
      public void scalePercent(int percentX, int percentY) 

      函数public void scaleAbsolute(int newWidth, int newHeight)直接设定显示尺寸;函数public void scalePercent(int percent)设定显示比例,如scalePercent(50)表示显示的大小为原尺寸的50%;而函数scalePercent(int percentX, int percentY)则图像高宽的显示比例。

      如果图像需要旋转一定角度之后在文档中显示,可以通过函数public void setRotation(double r)设定,参数r为弧度,如果旋转角度为30度,则参数r= Math.PI / 6。

      七、中文处理

      默认的iText字体设置不支持中文字体,需要下载远东字体包iTextAsian.jar,否则不能往PDF文档中输出中文字体。通过下面的代码就可以在文档中使用中文了:
      BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
      com.lowagie.text.Font FontChinese = new com.lowagie.text.Font(bfChinese, 12, com.lowagie.text.Font.NORMAL);
      Paragraph pragraph=new Paragraph("你好", FontChinese); 

      八、分页处理

      如果只是简单的显示当前页码,使用以下代码即可(设定了页面的大小后,会自动分页)。

    1 HeaderFooter footer = new HeaderFooter(new Phrase("页码:",keyfont), true);  
    2 footer.setBorder(Rectangle.NO_BORDER);  
    3 document.setHeader(footer);

      如果要显示当前页码以及总页码。

      则需要计算总页数,设定每页大小,使用pdf.newPage( )手动分页。

      详见一下代码:

    复制代码
      1 package com.foster;
      2 
      3 import java.io.File;
      4 import java.io.FileOutputStream;
      5 import java.util.ArrayList;
      6 import java.util.List;
      7 
      8 import com.lowagie.text.Cell;
      9 import com.lowagie.text.Document;
     10 import com.lowagie.text.DocumentException;
     11 import com.lowagie.text.Font;
     12 import com.lowagie.text.HeaderFooter;
     13 import com.lowagie.text.Image;
     14 import com.lowagie.text.Paragraph;
     15 import com.lowagie.text.Table;
     16 import com.lowagie.text.pdf.BaseFont;
     17 import com.lowagie.text.pdf.PdfPCell;
     18 import com.lowagie.text.pdf.PdfWriter;
     19 
     20 public class PDFReport {
     21 
     22     
     23     public static void main(String[] args) throws Exception, DocumentException {
     24         
     25         List<String> ponum=new ArrayList<String>();
     26         add(ponum, 26);
     27         List<String> line=new ArrayList<String>();
     28         add(line, 26);
     29         List<String> part=new ArrayList<String>();
     30         add(part, 26);
     31         List<String> description=new ArrayList<String>();
     32         add(description, 26);
     33         List<String> origin=new ArrayList<String>();
     34         add(origin, 26);
     35         
     36         //Create Document Instance
     37         Document document=new Document();
     38         
     39         //add Chinese font
     40         BaseFont bfChinese=BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
     41         
     42         //Font headfont=new Font(bfChinese,10,Font.BOLD);
     43         Font keyfont=new Font(bfChinese,8,Font.BOLD);
     44         Font textfont=new Font(bfChinese,8,Font.NORMAL);
     45         
     46         //Create Writer associated with document
     47         PdfWriter.getInstance(document, new FileOutputStream(new File("D:\\POReceiveReport.pdf")));
     48         
     49         document.open();
     50         
     51         //Seperate Page controller
     52         int recordPerPage=10;
     53         int fullPageRequired=ponum.size()/recordPerPage;
     54         int remainPage=ponum.size()%recordPerPage>1?1:0;
     55         int totalPage=fullPageRequired+remainPage;
     56         
     57         for(int j=0;j<totalPage;j++){
     58             document.newPage();
     59             
     60             //create page number
     61             String pageNo=leftPad("页码: "+(j+1)+" / "+totalPage,615);
     62             Paragraph pageNumber=new Paragraph(pageNo, keyfont) ;
     63             document.add(pageNumber);
     64             
     65             //create title image
     66             Image jpeg=Image.getInstance("D:\\title.JPG");
     67             jpeg.setAlignment(Image.ALIGN_CENTER);
     68             jpeg.scaleAbsolute(530, 37);
     69             document.add(jpeg);
     70             
     71             //header information
     72             Table tHeader=new Table(2);
     73             float[] widthsHeader={2f,3f};
     74             tHeader.setWidths(widthsHeader);
     75             tHeader.setWidth(100);
     76             tHeader.getDefaultCell().setBorder(PdfPCell.NO_BORDER);
     77             
     78             
     79             String compAdd="河源市高新技术开发区兴业大道中66号";
     80             String company="丰达音响(河源)有限公司";
     81             String vendor="V006";
     82             String vendorName="中山市卢氏五金有限公司";
     83             String ccn="FHH";
     84             String mas_loc="FHH";
     85             String delivery_note="20130718001";
     86             String receive_date="20130718";
     87             String dept="H11";
     88             String asn="0123456789";
     89             
     90             
     91             Cell c1Header=new Cell(new Paragraph("地址:"+compAdd,keyfont));
     92             tHeader.addCell(c1Header);
     93             c1Header=new Cell(new Paragraph("供应商:"+vendor,keyfont));
     94             tHeader.addCell(c1Header);
     95             c1Header=new Cell(new Paragraph("公司:"+company,keyfont));
     96             tHeader.addCell(c1Header);
     97             c1Header=new Cell(new Paragraph("供应商工厂:"+vendorName,keyfont));
     98             tHeader.addCell(c1Header);
     99             c1Header = new Cell(new Paragraph("CCN:   "+ccn+"    Master Loc:   "+mas_loc,keyfont));
    100             tHeader.addCell(c1Header);
    101             c1Header = new Cell(new Paragraph("送货编号: "+delivery_note+"                             送货日期: "+receive_date,keyfont));
    102             tHeader.addCell(c1Header);
    103             c1Header=new Cell(new Paragraph("Dept:"+dept,keyfont));
    104             tHeader.addCell(c1Header);
    105             c1Header=new Cell(new Paragraph("ASN#:"+asn,keyfont));
    106             tHeader.addCell(c1Header);
    107             document.add(tHeader);
    108             
    109             //record header field
    110             Table t=new Table(5);
    111             float[] widths={1.5f,1f,1f,1.5f,1f};
    112             t.setWidths(widths);
    113             t.setWidth(100);
    114             t.getDefaultCell().setBorder(PdfPCell.NO_BORDER);
    115             Cell c1 = new Cell(new Paragraph("PO#",keyfont));
    116             t.addCell(c1);
    117             c1 = new Cell(new Paragraph("Line",keyfont));
    118             t.addCell(c1);
    119             c1 = new Cell(new Paragraph("Part#",keyfont));
    120             t.addCell(c1);
    121             c1 = new Cell(new Paragraph("Description",keyfont));
    122             t.addCell(c1); 
    123             c1 = new Cell(new Paragraph("Origin",keyfont));
    124             t.addCell(c1); 
    125             
    126             //calculate the real records within a page ,to calculate the last record number of every page
    127             int maxRecordInPage= j+1 ==totalPage ? (remainPage==0?recordPerPage:(ponum.size()%recordPerPage)):recordPerPage;
    128             
    129             for(int i=j*recordPerPage;i<((j*recordPerPage)+maxRecordInPage);i++){
    130                 Cell c2=new Cell(new Paragraph(ponum.get(i), textfont));
    131                 t.addCell(c2);
    132                 c2=new Cell(new Paragraph(line.get(i), textfont));
    133                 t.addCell(c2);
    134                 c2=new Cell(new Paragraph(part.get(i), textfont));
    135                 t.addCell(c2);
    136                 c2=new Cell(new Paragraph(description.get(i), textfont));
    137                 t.addCell(c2);
    138                 c2=new Cell(new Paragraph(origin.get(i), textfont));
    139                 t.addCell(c2);
    140             }
    141             document.add(t);
    142             
    143             if(j+1==totalPage){
    144 
    145                 Paragraph foot11 = new Paragraph("文件只作  Foster 收貨用"+printBlank(150)+"__________________________",keyfont);
    146                 document.add(foot11);
    147                 Paragraph foot12 = new Paragraph("Printed from Foster supplier portal"+printBlank(134)+company+printBlank(40)+"版本: 1.0",keyfont);
    148                 document.add(foot12);
    149                 HeaderFooter footer11=new HeaderFooter(foot11, true);
    150                 footer11.setAlignment(HeaderFooter.ALIGN_BOTTOM);
    151                 HeaderFooter footer12=new HeaderFooter(foot12, true);
    152                 footer12.setAlignment(HeaderFooter.ALIGN_BOTTOM);
    153             }
    154         }
    155         document.close();
    156     }
    157     
    158     public static String leftPad(String str, int i) {
    159         int addSpaceNo = i-str.length();
    160         String space = ""; 
    161         for (int k=0; k<addSpaceNo; k++){
    162                 space= " "+space;
    163         };
    164         String result =space + str ;
    165         return result;
    166      }
    167     
    168     public static void add(List<String> list,int num){
    169         for(int i=0;i<num;i++){
    170             list.add("test"+i);
    171         }
    172     }
    173     
    174     public static String printBlank(int tmp){
    175           String space="";
    176           for(int m=0;m<tmp;m++){
    177               space=space+" ";
    178           }
    179           return space;
    180     }
    181 
    182 }
    复制代码

      为了使副标题严格对齐,使用了表格table进行控制,但是却没能找到去掉表格边框的方法..........郁闷.......

      九、总结 

      总的来说,iText是一套java环境下不错的制作PDF的组件。因为iText支持jsp/javabean下的开发,这使得B/S应用中的报表问题能得到很好的解决。由于iText毕竟不是专门为制作报表设计,所有报表中的内容、格式都需要通过写代码实现,相对于那些专业的支持可视化设计的报表软件来说,编程的工作量就有一定程度的增加。

    展开全文
  • 使用java Apache poi 根据word模板生成word报表

    万次阅读 多人点赞 2018-03-24 16:19:37
    使用java Apache poi 根据word模板生成word报表 使用poi读取word模板,替换word中的{text}标签,并根据自定义标签循环生成表格或表格中的行。 代码示例下载:...
  • JAVA生成报表(JFreeChart)

    千次阅读 2016-09-07 11:10:56
    JAVA生成报表 JFreeChart是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)...
  • Java报表小记之 JasperReports & iReport

    万次阅读 热门讨论 2016-05-09 09:22:36
    关于Java报表工具JasperReports以及iReport的详细介绍
  • Java使用itext生成PDF报表

    千次阅读 2015-06-18 11:45:32
    Java使用itext生成PDF报表
  • 使用sql语句生成报表 In this article, we will discuss the SQL Server Reporting Service Report Builder and look at how to handle common client, end user requests using Report Builder. Report Builder ...
  • Java报表制作

    2015-08-14 15:19:41
    Java报表制作(iReport+jaserReport+jFreeChart)  INTRODUCTION 目前开源报表中,本人觉得比较好的组合是iReport+jasperReport+jFreeChart,本文将对这三个工具做一些介绍,希望对你的报表开发有些帮助。 2 ...
  • Java目录监视器源程序 9个目标文件 内容索引:JAVA源码,综合应用,目录监视 用JAVA开发的一个小型的目录监视系统系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。...
  • 通过java程序,定义相关参数并生成对应的json文件。 通过java命令行调用API,调用phantomjs命令,并传入js、配置文件路径,从而开启爬虫。 首先采集关键词的搜索页的链接集合,最后统一去遍历采集具体的...
  • java生成pdf报表

    千次阅读 2016-10-12 16:11:21
     前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iText--用于生成PDF文档的一个Java类库。废话不多说,进入正题。  二、iText简介  iText是著名的开放源码的站点sourceforge一个...
  • 合并报表excel自动模板_自动合并

    千次阅读 2020-08-29 17:04:43
    合并报表excel自动模板 介绍 (Intro) One day we decided that we don’t want to waste any more time on tasks that can be automated and we decided to start with automation of our merging process. 有一天,...
  • 同时J2EE平台的产品几乎能够在任何操作系统和硬件配置上运行,因此文中设计了一个基于J2EE 架构的超市综合管理信息系统。根据J2EE 架构的多层应用程序方案和超市管理信息系统的特点,系统采用以Web 为中心的应用程序...
  • java 生成 word 文档的多种方法(三)

    万次阅读 热门讨论 2019-01-25 14:49:03
    这篇文章给大家介绍java 通过POI技术生成word ,这种实现方式项目中也很常用,比如生成常用表格,报表等。废话少说,下面就给大家详细介绍实现原理! A、word文档正文段落概述: 一个word文档包含多个段落,一个...
  • 报表系统-报表管理平台

    千次阅读 2020-09-18 18:07:27
    旨在帮助企业用户快速搭建企业报表平台,将企业内部流转的营销、财务、人力等数据进行整合加工,构造不同部门的业务模型,最终生成业务报表、数据驾驶舱等分析应用; 面向的是经典的商业智能分析展现场景,以中国式...
  • 通过实体bean注解生成报表文件 程式码范例 注释报告 bean。 name 属性是列标签,columnIndex 是报表中列的顺序 @ReportField(name = "Brewer", columnIndex = 0) private String name; 动机 将报告框架(Jasper 等...
  • JAVA生成PDF报表

    千次阅读 2015-08-25 15:09:52
     在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表Java组件--iText。通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或下载得到生成报表,这样就很好的解决...
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
     用JAVA开发的一个小型的目录监视系统系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...
  • JXls实现基于excel模板生成报表

    千次阅读 2019-01-22 19:58:23
    JXls实现基于excel模板生成报表 jxls是非常小巧方便生成excel报表的工具库。jxls在excel模板中使用特定标记,定义输出格式和数据布局。在很多应用中有报表功能需要生成excel。 java有很多开源或商业库可以创建...
  • 但是,虽然当前我国政府的信息化事业已经取得了初步的成效,能够依据不同的客观业务需求来实现信息系统的开发设计。但是,目前所存在的问题也是较为明显的,那就是这些信息系统彼此之间都是孤立的,难以做到协同工作...
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的...
  • 两种方式实现java生成Excel

    千次阅读 2018-04-18 12:07:10
    Web应用中难免会遇到需要将数据导出并生成excel文件的需求。同样,对于本博客中的总结,也是建立在为了完成这样的一个需求,才开始去了解其实现形式,并且顺利完成需求的开发,先将实现过程总结于此。本博文是本人的...
  • java的酒店房间管理系统

    千次阅读 2021-02-19 13:24:17
    这些问题都可以通过计算机辅助系统来解决。随着计算机和信息技术的飞速发展,酒店客房的管理由传统的工作模式逐渐被信息化、网络化的现代工作模式所代替。以住宿为主的酒店假如再延用传统的管理模式,就会增加酒店...
  • 一般可以使用该模板引擎来生成月报,日报,单据报表等等。我们都知道预先生成静态HTML文件,当访问时可以提高效率的。 Freemarker简单介绍 Freemarker是一款模板引擎,基于模板用来生成文本(任何来自HTML格式的...
  • 欢迎添加微信互相交流学习哦! 项目源码:... ...1.4 系统开发方法 6 1.6 可行性研究 7 1.6.1 经济可行性 7 1.6.2 技术可行性 7 1.6.3运行可行性 7 1.6.4 时间可行性 7 1.6.5 法律可行性 ...
  • JavaFast是一款基于代码生成器的智能快速开发平台,可以帮助解决java项目中80%的重复工作,让开发者更多关注业务逻辑。 既能快速提高开发效率,帮助公司节省人力成本,同时不失灵活性。 可以应用在任何J2EE项目的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,168
精华内容 10,867
关键字:

java报表系统的可定义自动生成方法

java 订阅