JAVA生产报表导出成PDF格式(报表中的内容存储在String字符串中,需要解析,业务特殊)

来源:互联网 发布:win10禁止软件运行 编辑:程序博客网 时间:2024/05/17 03:19
//生产的pdf文件路径String wordName = UUID.randomUUID() + ".pdf";SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//创建一个pdf的document对象com.itextpdf.text.Document document = new com.itextpdf.text.Document(com.itextpdf.text.PageSize.A4, 30f, 10f, 144f, 56f);com.itextpdf.text.pdf.BaseFont bfChinese = com.itextpdf.text.pdf.BaseFont.createFont("STSongStd-Light","UniGB-UCS2-H", com.itextpdf.text.pdf.BaseFont.NOT_EMBEDDED); com.itextpdf.text.Font FontChinese = new com.itextpdf.text.Font(bfChinese, 14, Font.COURIER); // 其他所有文字字体    com.itextpdf.text.Font BoldChinese = new com.itextpdf.text.Font(bfChinese, 14, Font.BOLD); // 粗体    com.itextpdf.text.Font titleChinese = new com.itextpdf.text.Font(bfChinese, 20, Font.BOLD); // 模板抬头的字体    com.itextpdf.text.Font subFontChinese = new com.itextpdf.text.Font(bfChinese, 12, Font.COURIER); //  com.itextpdf.text.Font subBoldFontChinese = new com.itextpdf.text.Font(bfChinese, 8, Font.BOLD); //  com.itextpdf.text.pdf.PdfWriter instance = com.itextpdf.text.pdf.PdfWriter.getInstance(document, new FileOutputStream(dir+"/"+wordName)); document.open();

对已经生成的document对象进行操作

//设置大标题com.itextpdf.text.Paragraph title = new com.itextpdf.text.Paragraph("测试("+reportName+")报表",titleChinese);// 抬头          title.setAlignment(com.itextpdf.text.Element.ALIGN_CENTER); // 居中设置          title.setLeading(1f);//设置行间距//设置上面空白宽度          document.add(title); 

下面的内容根据自己的业务和报表的需求修改

//报表导出的时间、和导出报表时查询数据的时间范围和报表的类型        title=new com.itextpdf.text.Paragraph("报表类型:"+reportName ,BoldChinese);        title.setAlignment(com.itextpdf.text.Element.ALIGN_LEFT);        title.setSpacingBefore(10f);        document.add(title);                 title=new com.itextpdf.text.Paragraph("创建时间:"+format.format(new Date()) ,BoldChinese);        title.setAlignment(com.itextpdf.text.Element.ALIGN_LEFT);        title.setSpacingBefore(10f);        document.add(title);         title=new com.itextpdf.text.Paragraph("查询时间:"+parameter+" 到  "+parameter2 ,BoldChinese);        title.setAlignment(com.itextpdf.text.Element.ALIGN_LEFT);        title.setSpacingBefore(10f);        document.add(title); 

下面是具体的用循环输入需要的报表

         float[] widths={50f};        com.itextpdf.text.pdf.PdfPTable table = new com.itextpdf.text.pdf.PdfPTable(widths);        table.setSpacingBefore(20f);// 设置表格上面空白宽度          table.setTotalWidth(500);// 设置表格的宽度          table.setWidthPercentage(100);//设置表格宽度为%100          table.getDefaultCell().setBorder(0);//设置表格默认为无边框          com.itextpdf.text.pdf.PdfPCell cell = new com.itextpdf.text.pdf.PdfPCell(new com.itextpdf.text.Paragraph("", subBoldFontChinese));        org.dom4j.Element rootElement = parseText.getRootElement();List<Element> elements = rootElement.elements();for (Element elementn : elements) {List<Element>  elementw= elementn.elements();for(Element element :elementw){String attributeValue = element.attributeValue("chartType");//判断该标签内的内容是否为报表需要的内容if(null!=attributeValue){//如果是chart,标示这是一个图片 if("chart".equals(attributeValue)){String attributeValue2 = element.attributeValue("src");attributeValue2=attributeValue2.replace("@", "\\\\"); float[] widthes = { 50f };// 设置表格的列宽和列数   com.itextpdf.text.pdf.PdfPTable hiddenTable = new  com.itextpdf.text.pdf.PdfPTable(widthes);// 建立一个pdf表格          hiddenTable.setSpacingBefore(11f);  //设置表格上空间          hiddenTable.setTotalWidth(500);// 设置表格的宽度          hiddenTable.setWidthPercentage(100);//设置表格宽度为%100          hiddenTable.getDefaultCell().disableBorderSide(1);          hiddenTable.getDefaultCell().disableBorderSide(2);          hiddenTable.getDefaultCell().disableBorderSide(4);          hiddenTable.getDefaultCell().disableBorderSide(8);                    com.itextpdf.text.Image upgif = com.itextpdf.text.Image.getInstance(attributeValue2);           upgif.scalePercent(120);//设置缩放的百分比%7.5          upgif.setAlignment(com.itextpdf.text.Element.ALIGN_RIGHT);                    cell = new com.itextpdf.text.pdf.PdfPCell(new com.itextpdf.text.Paragraph("", subBoldFontChinese));//描述          cell.setHorizontalAlignment(com.itextpdf.text.Element.ALIGN_RIGHT);// 设置内容水平居中显示          cell.addElement(upgif);          cell.setPaddingTop(0f);             //设置内容靠上位置          cell.setPaddingBottom(0f);          cell.setPaddingRight(20f);          cell.setBorder(Rectangle.NO_BORDER);//设置单元格无边框          hiddenTable.addCell(cell);           document.add(hiddenTable);  //如果是chartTable ,标示这是一个表格 }else if("chartTable".equals(attributeValue)){List<Element> elements3 = element.elements();if(elements3.size()>0){float[] width = { 50f,50f};com.itextpdf.text.pdf.PdfPTable table_chart = new com.itextpdf.text.pdf.PdfPTable(width);table_chart.getDefaultCell().setBorder(1);//设置表格默认为无边框  for (Element element3 : elements3) {List<Element> elements4 = element3.elements();for (int i = 0;i<elements4.size();i++) {Element object =elements4.get(i);String text = object.getText();com.itextpdf.text.pdf.PdfPCell cell_chart = new com.itextpdf.text.pdf.PdfPCell(new com.itextpdf.text.Paragraph(text , FontChinese));//描述  cell_chart.setFixedHeight(20);  cell_chart.setHorizontalAlignment(com.itextpdf.text.Element.ALIGN_CENTER);// 设置内容水平居中显示  cell_chart.setVerticalAlignment(com.itextpdf.text.Element.ALIGN_MIDDLE);  // 设置垂直居中              table_chart.addCell(cell_chart); }}document.add(table_chart);}//如果是dsc,标示这是针对该报表的文字描述}else if("dsc".equals(attributeValue)){List<Element> elements3 = element.elements();if(elements3.size()>0){float[] width_dsc = {50f};for (Element element3 : elements3) {List<Element> elements4 = element3.elements();StringBuffer buffer=new StringBuffer();for (Element object : elements4) {buffer.append(object.getText());}String string = buffer.toString(); Pattern p = Pattern.compile(":"); Matcher matcher = p.matcher(string); String replaceFirst = matcher.replaceFirst(""); if(replaceFirst.length()==0){continue; } com.itextpdf.text.Paragraph title_dsc=new com.itextpdf.text.Paragraph(replaceFirst,subFontChinese); title_dsc.setAlignment(com.itextpdf.text.Element.ALIGN_LEFT); title_dsc.setSpacingBefore(10f);         document.add(title_dsc); }}}}else{List<Element> elements2 = element.elements();for (Element element2 : elements2) {String elemen = element2.attributeValue("chartType");if(null!=elemen){if("chartTable".equals(elemen)){List<Element> elements3 = element2.elements();if(elements3.size()>0){float[] width = { 50f,50f};com.itextpdf.text.pdf.PdfPTable table_chart = new com.itextpdf.text.pdf.PdfPTable(width);table_chart.getDefaultCell().setBorder(1);//设置表格默认为无边框  for (Element element3 : elements3) {List<Element> elements4 = element3.elements();for (int i = 0;i<elements4.size();i++) {Element object =elements4.get(i);String text = object.getText();com.itextpdf.text.pdf.PdfPCell cell_chart = new com.itextpdf.text.pdf.PdfPCell(new com.itextpdf.text.Paragraph(text , FontChinese));//描述  cell_chart.setFixedHeight(20);  cell_chart.setHorizontalAlignment(com.itextpdf.text.Element.ALIGN_CENTER);// 设置内容水平居中显示  cell_chart.setVerticalAlignment(com.itextpdf.text.Element.ALIGN_MIDDLE);  // 设置垂直居中              table_chart.addCell(cell_chart); }}document.add(table_chart);}}else  if("chart".equals(elemen)){String attributeValue2 = element2.attributeValue("src");attributeValue2=attributeValue2.replace("@", "\\\\"); float[] widthes = { 50f };// 设置表格的列宽和列数   com.itextpdf.text.pdf.PdfPTable hiddenTable = new com.itextpdf.text.pdf.PdfPTable(widthes);// 建立一个pdf表格          hiddenTable.setSpacingBefore(11f);  //设置表格上空间          hiddenTable.setTotalWidth(500);// 设置表格的宽度          hiddenTable.setWidthPercentage(100);//设置表格宽度为%100          hiddenTable.getDefaultCell().disableBorderSide(1);          hiddenTable.getDefaultCell().disableBorderSide(2);          hiddenTable.getDefaultCell().disableBorderSide(4);          hiddenTable.getDefaultCell().disableBorderSide(8);                    com.itextpdf.text.Image upgif = com.itextpdf.text.Image.getInstance(attributeValue2);           upgif.scalePercent(120f);//设置缩放的百分比%7.5          upgif.setAlignment(com.itextpdf.text.Element.ALIGN_RIGHT);                    cell = new com.itextpdf.text.pdf.PdfPCell(new com.itextpdf.text.Paragraph("", subBoldFontChinese));//描述          cell.setHorizontalAlignment(com.itextpdf.text.Element.ALIGN_RIGHT);// 设置内容水平居中显示          cell.addElement(upgif);          cell.setPaddingTop(0f);             //设置内容靠上位置          cell.setPaddingBottom(0f);          cell.setPaddingRight(20f);          cell.setBorder(Rectangle.NO_BORDER);//设置单元格无边框          hiddenTable.addCell(cell);           document.add(hiddenTable); }else if ("dsc".equals(elemen)) {List<Element> elements3 = element2.elements();if(elements3.size()>0){for (Element element3 : elements3) {List<Element> elements4 = element3.elements();StringBuffer buffer=new StringBuffer();for (Element object : elements4) {buffer.append(object.getText());}String string = buffer.toString(); Pattern p = Pattern.compile(":"); Matcher matcher = p.matcher(string); String replaceFirst = matcher.replaceFirst(""); if(replaceFirst.length()==0){continue; }  com.itextpdf.text.Paragraph title_dsc=new com.itextpdf.text.Paragraph(replaceFirst,subFontChinese); title_dsc.setAlignment(com.itextpdf.text.Element.ALIGN_LEFT); title_dsc.setSpacingBefore(10f);         document.add(title_dsc);             } } }}}}}}
最后,关闭该document对象

if(null!=document){document.close();}


0 0