转载

java 如何在pdf中生成表格

1、目标

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

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

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

通过读取properties文件动态获取文件存储的跟目录。获取方式可查看: http://www.cnblogs.com/0201zcr/p/4700418.html

2、所需的jar

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

java 如何在pdf中生成表格

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 <T> void generatePDF(String [] head,List<T> 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 <T> String generatePDFs(String [] head,List<T> 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<User> list = new ArrayList<User>();  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)、测试结果

java 如何在pdf中生成表格

9)、文件内容如下

java 如何在pdf中生成表格

4、其他相关链接

生成可变表头excel: http://www.cnblogs.com/0201zcr/p/4950619.html

读取excel: http://www.cnblogs.com/0201zcr/p/4656779.html

致谢:感谢您的阅读!

正文到此结束
Loading...