程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java在pdf中生成表格的辦法

java在pdf中生成表格的辦法

編輯:關於JAVA

java在pdf中生成表格的辦法。本站提示廣大學習愛好者:(java在pdf中生成表格的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是java在pdf中生成表格的辦法正文


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 <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)、測試成果

9)、文件內容以下

java若何在pdf中生成表格,我信任經由過程這個簡略實例演示有了年夜概的熟悉,年夜家可以著手去實驗一下,看看會不會到達料想的後果。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved