博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 如何在pdf中生成表格
阅读量:5224 次
发布时间:2019-06-14

本文共 15287 字,大约阅读时间需要 50 分钟。

1、目标

  在pdf中生成一个可变表头的表格,并向其中填充数据。通过泛型动态的生成表头,通过反射动态获取实体类(我这里是User)的get方法动态获得数据,从而达到动态生成表格。

  每天生成一个文件夹存储生成的pdf文件(文件夹的命名是年月日时间戳),如:20151110

  生成的文件可能在毫秒级别,故文件的命名规则是"到毫秒的时间戳-uuid",如:20151110100245690-ece540e5-7737-4ab7-b2d6-87bc23917c8c.pdf

  通过读取properties文件动态获取文件存储的跟目录。获取方式可查看:

2、所需的jar

  这里通过itex插件进行pdf的生成,需要的jar包括以下几个

3、编码实现

1)、实体类

package com.zcr.until;public class User {    private String name;    private int age ;    private float height;    private String adress;    private String sex;    private String jj;        public String getJj()    {        return jj;    }    public void setJj(String jj)    {        this.jj = jj;    }    public User()    {        }    public User(String name,int age,float height,String adress,String sex,String jj)    {        this.name = name;        this.age = age;        this.height = height;        this.adress = adress;        this.sex = sex;        this.jj = jj;    }        public String getAdress()    {        return adress;    }    public void setAdress(String adress)    {        this.adress = adress;    }    public String getSex()    {        return sex;    }    public void setSex(String sex)    {        this.sex = sex;    }            public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public float getHeight() {        return height;    }    public void setHeight(float height) {        this.height = height;    }    }

2)、properties文件

pdfPath=E\:/appDataPdf

3)、读取properties文件,获取pdf存储的路径

package com.zcr.until;import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.util.Properties;public class GetFilePlace {    /**     * 读取文件,获取excel保存的根目录     * @return  excel保存的根目录     */    public   String getFilePath()    {        String dir = System.getProperty("user.dir");  //获得tomcat所在的工作路径                  //获取到存储了文件存储位置的filedir.properties 文件路径   --->java Project的文件路径        String realDir = dir + File.separator + "src" + File.separator +"META-INF" + File.separator + "filedir.properties";             //Web project存储路径        /*String realDir = dir.substring(0, dir.length()-4) + File.separator +"webapps" + File.separator + "generateExcels"                       + File.separator + "classes" + File.separator + "META-INF" + File.separator + "config" + File.separator + "filedir.properties";    */        return realDir;    }        /**     * 获取filePath路径【properities文件】中key对应的值,     * @param filePath properities文件路径【包含properities文件】     * @param key 要查找的key值     * @return key对应的value     */     public   String GetValueByKey(String filePath, String key)      {         Properties pps = new Properties();         try {              InputStream in = new BufferedInputStream (new FileInputStream(filePath));                pps.load(in);             String value = pps.getProperty(key);             in.close();             return value;                      }catch (IOException e) {             e.printStackTrace();             return null;         }     }        /**     * 查询properities文件中可以对应的存储地点     * @param key 查询主键     * @return    key对应的存储地址     */    public  String getFileDirFromProperties(String key)    {        return GetValueByKey(getFilePath(),key);    }}

4)、获取当天存在的文件路径,不存在则生成一个新的文件夹

package com.zcr.service;import java.io.File;import java.text.SimpleDateFormat;import java.util.Calendar;public class GenerateFold{    /**     * 查询当前生成的excel需要存在在哪个路径,如果存在则存储在相应的位置,否则生成改目录, 每天生成一个文件夹,文件夹的命名规则为 年月日的时间戳     * @param foldName  生成excel保存路径     * @return            现在的excel需要保存路径     */    public  String getFold(String foldName)    {        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");                String todayStr = format.format(Calendar.getInstance().getTime());                String foldPath = foldName + File.separator + todayStr;                 File file = new File(foldPath);                if(!file.exists() && !file.isDirectory())        {            System.out.println("不存在");            file.mkdirs();        }        else        {            System.out.println("存在");        }        return  foldPath;    }}

5)、生成文件的名字

package com.zcr.until;import java.io.File;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.UUID;/** * 生成文件名字 * @author zcr * */public class GenerateFileName{    /**     * 根据文件类别生成文件的名字,文件的命名规则是:文件目录/生成时间-uuid(全球唯一编码).文件类别     * @param fileDir  文件的存储路径     * @param fileType 文件的类别     * @return                 文件的名字       */    public String generateFileName(String fileDir,String fileType)    {        String saveFileName = "";        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSS");        saveFileName += format.format(Calendar.getInstance().getTime());                UUID uuid = UUID.randomUUID();  //全球唯一编码                saveFileName += "-" + uuid.toString();        saveFileName += "." + fileType;                saveFileName = fileDir + File.separator + saveFileName;                return saveFileName;    }}

6)、生成pdf

package com.zcr.service;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List;import com.lowagie.text.Document;import com.lowagie.text.DocumentException;import com.lowagie.text.Element;import com.lowagie.text.Font;import com.lowagie.text.PageSize;import com.lowagie.text.Phrase;import com.lowagie.text.pdf.BaseFont;import com.lowagie.text.pdf.PdfPCell;import com.lowagie.text.pdf.PdfPTable;import com.lowagie.text.pdf.PdfWriter;import com.zcr.until.GenerateFileName;import com.zcr.until.GetFilePlace;import com.zcr.until.User;/** * 生成pdf * @author zcr *  */public class CreatePdf{    Document document = new Document();// 建立一个Document对象    private static Font headfont;// 设置字体大小    private static Font keyfont;// 设置字体大小    private static Font textfont;// 设置字体大小    static    {        //中文格式        BaseFont bfChinese;        try        {            // 设置中文显示            bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);            headfont = new Font(bfChinese, 10, Font.BOLD);// 设置字体大小            keyfont = new Font(bfChinese, 8, Font.BOLD);// 设置字体大小            textfont = new Font(bfChinese, 8, Font.NORMAL);// 设置字体大小        }        catch (Exception e)        {            e.printStackTrace();        }    }        /**     * 文成文件     * @param file 待生成的文件名     */    public CreatePdf(File file)    {        document.setPageSize(PageSize.A4);// 设置页面大小        try        {            PdfWriter.getInstance(document, new FileOutputStream(file));            document.open();        }        catch (Exception e)        {            e.printStackTrace();        }    }        public CreatePdf()    {            }        public void initFile(File file)    {        document.setPageSize(PageSize.A4);// 设置页面大小        try        {            PdfWriter.getInstance(document, new FileOutputStream(file));            document.open();        }        catch (Exception e)        {            e.printStackTrace();        }    }        int maxWidth = 520;        /**     * 为表格添加一个内容     * @param value           值     * @param font            字体     * @param align            对齐方式     * @return                添加的文本框     */    public PdfPCell createCell(String value, Font font, int align)    {        PdfPCell cell = new PdfPCell();        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);        cell.setHorizontalAlignment(align);        cell.setPhrase(new Phrase(value, font));        return cell;    }        /**     * 为表格添加一个内容     * @param value           值     * @param font            字体     * @return                添加的文本框     */    public PdfPCell createCell(String value, Font font)    {        PdfPCell cell = new PdfPCell();        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);        cell.setHorizontalAlignment(Element.ALIGN_CENTER);        cell.setPhrase(new Phrase(value, font));        return cell;    }    /**     * 为表格添加一个内容     * @param value           值     * @param font            字体     * @param align            对齐方式     * @param colspan        占多少列     * @return                添加的文本框     */    public PdfPCell createCell(String value, Font font, int align, int colspan)    {        PdfPCell cell = new PdfPCell();        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);        cell.setHorizontalAlignment(align);        cell.setColspan(colspan);        cell.setPhrase(new Phrase(value, font));        return cell;    }        /**     * 为表格添加一个内容     * @param value           值     * @param font            字体     * @param align            对齐方式     * @param colspan        占多少列     * @param boderFlag        是否有有边框     * @return                添加的文本框     */    public PdfPCell createCell(String value, Font font, int align, int colspan,            boolean boderFlag)    {        PdfPCell cell = new PdfPCell();        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);        cell.setHorizontalAlignment(align);        cell.setColspan(colspan);        cell.setPhrase(new Phrase(value, font));        cell.setPadding(3.0f);        if (!boderFlag)        {            cell.setBorder(0);            cell.setPaddingTop(15.0f);            cell.setPaddingBottom(8.0f);        }        return cell;    }    /**     * 创建一个表格对象     * @param colNumber  表格的列数     * @return              生成的表格对象     */    public PdfPTable createTable(int colNumber)    {        PdfPTable table = new PdfPTable(colNumber);        try        {            table.setTotalWidth(maxWidth);            table.setLockedWidth(true);            table.setHorizontalAlignment(Element.ALIGN_CENTER);            table.getDefaultCell().setBorder(1);        }        catch (Exception e)        {            e.printStackTrace();        }        return table;    }    public PdfPTable createTable(float[] widths)    {        PdfPTable table = new PdfPTable(widths);        try        {            table.setTotalWidth(maxWidth);            table.setLockedWidth(true);            table.setHorizontalAlignment(Element.ALIGN_CENTER);            table.getDefaultCell().setBorder(1);        }        catch (Exception e)        {            e.printStackTrace();        }        return table;    }    public PdfPTable createBlankTable()    {        PdfPTable table = new PdfPTable(1);        table.getDefaultCell().setBorder(0);        table.addCell(createCell("", keyfont));        table.setSpacingAfter(20.0f);        table.setSpacingBefore(20.0f);        return table;    }    public 
void generatePDF(String [] head,List
list,int colNum) { Class classType = list.get(0).getClass(); // 创建一个只有5列的表格 PdfPTable table = createTable(colNum); // 添加备注,靠左,不显示边框 table.addCell(createCell("APP信息列表:", keyfont, Element.ALIGN_LEFT, colNum,false)); //设置表头 for(int i = 0 ; i < colNum ; i++) { table.addCell(createCell(head[i], keyfont, Element.ALIGN_CENTER)); } if(null != list && list.size() > 0) { int size = list.size(); for(int i = 0 ; i < size ; i++) { T t = list.get(i); for(int j = 0 ; j < colNum ; j ++) { //获得首字母 String firstLetter = head[j].substring(0,1).toUpperCase(); //获得get方法,getName,getAge等 String getMethodName = "get" + firstLetter + head[j].substring(1); Method method; try { //通过反射获得相应的get方法,用于获得相应的属性值 method = classType.getMethod(getMethodName, new Class[]{}); try { System.out.print(getMethodName +":" + method.invoke(t, new Class[]{}) +","); //添加数据 table.addCell(createCell(method.invoke(t, new Class[]{}).toString(), textfont)); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } System.out.println(""); } } try { //将表格添加到文档中 document.add(table); } catch (DocumentException e) { e.printStackTrace(); } //关闭流 document.close(); } /** * 提供外界调用的接口,生成以head为表头,list为数据的pdf * @param head //数据表头 * @param list //数据 * @return //excel所在的路径 */ public
String generatePDFs(String [] head,List
list) { final String FilePath = "pdfPath"; String saveFilePathAndName = ""; //获得存储的根目录 String savePath = new GetFilePlace().getFileDirFromProperties(FilePath); //获得当天存储的路径,不存在则生成当天的文件夹 String realSavePath = new GenerateFold().getFold(savePath); saveFilePathAndName = new GenerateFileName().generateFileName(realSavePath,"pdf"); File file = new File(saveFilePathAndName); try { file.createNewFile(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } initFile(file); try { file.createNewFile(); //生成一个pdf文件 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } new CreatePdf(file).generatePDF(head,list,head.length); return saveFilePathAndName; }}

7)、测评函数

public static void main(String[] args)     {        System.out.println("begin");                String [] head = {"name","sex","adress","height","age","jj"};                List
list = new ArrayList
(); User user1 = new User("zhangsan",1,1.1f,"北京","男","AA"); User user2 = new User("lisi",22222,3.2f,"上海","女","BB"); list.add(user1); list.add(user2); String filePath = new CreatePdf().generatePDFs(head,list); System.out.println(filePath); System.out.println("end"); }

8)、测试结果

9)、文件内容如下

4、其他相关链接

生成可变表头excel:

读取excel:

 

  致谢:感谢您的阅读!

转载于:https://www.cnblogs.com/0201zcr/p/4952174.html

你可能感兴趣的文章
Idea 提交代码到码云(提交到github也大同小异)
查看>>
c#连接excel2007未安装ISAM解决
查看>>
Mono 异步加载数据更新主线程
查看>>
初识lua
查看>>
我是插件狂人,jDuang,jValidator,jModal,jGallery
查看>>
张季跃 201771010139《面向对象程序设计(java)》第四周学习总结
查看>>
如何解除循环引用
查看>>
android中fragment的使用及与activity之间的通信
查看>>
字典【Tire 模板】
查看>>
jquery的contains方法
查看>>
python3--算法基础:二分查找/折半查找
查看>>
Perl IO:随机读写文件
查看>>
Perl IO:IO重定向
查看>>
转:基于用户投票的排名算法系列
查看>>
WSDL 详解
查看>>
[转]ASP数组全集,多维数组和一维数组
查看>>
C# winform DataGridView 常见属性
查看>>
逻辑运算和while循环.
查看>>
Nhiberate (一)
查看>>
c#后台计算2个日期之间的天数差
查看>>