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\:/appDataPdf3)、讀取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、其他相關鏈接
java如何在pdf中生成表格,我相信通過這個簡單實例演示有了大概的認識,大家可以動手去試驗一下,看看會不會達到預想的效果。
總結
以上是生活随笔為你收集整理的java生成pdf表格_java在pdf中生成表格的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java乒乓_java – 正确实现乒乓
- 下一篇: java print int_java