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中生成表格,我信任經由過程這個簡略實例演示有了年夜概的熟悉,年夜家可以著手去實驗一下,看看會不會到達料想的後果。