java在pdf中生成表格的方法
程序员文章站
2024-03-07 12:17:57
1、目标
在pdf中生成一个可变表头的表格,并向其中填充数据。通过泛型动态的生成表头,通过反射动态获取实体类(我这里是user)的get方法动态获得数据,从而达到动态...
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)、文件内容如下
4、其他相关链接
生成可变表头excel:
读取excel:java使用poi批量导入excel数据的方法
java如何在pdf中生成表格,我相信通过这个简单实例演示有了大概的认识,大家可以动手去试验一下,看看会不会达到预想的效果。