Itext生成table小结
17.07.28日写
需要的jar包
<!-- itextpdfJar包 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.2.1</version>
</dependency>
<!-- 解决中文显示问题的Jar包 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
生成一个PDF文档
//创建PDF文档
Document document = new Document();
//创建 PdfWriter instance.
//PdfWriter.getInstance(document, new FileOutputStream(“D:\” + “createSamplePDF.pdf”)); //该方法写入到磁盘
response.setHeader(“Content-disposition”, “attachment; filename=jx.pdf”);
response.setContentType(“application/pdf”);
PdfWriter.getInstance(document, response.getOutputStream()); //变成一个下载流
//打开Document.
document.open();
//设置中文字体
BaseFont baseFont = BaseFont.createFont(“STSong-Light”, “UniGB-UCS2-H”,BaseFont.NOT_EMBEDDED);
Font font = new Font(baseFont);
//加入第一行content.
//document.add(new Paragraph(new String(“你好世界!”.getBytes(),”GBK”) ,font));
document.add(new Paragraph(“你好世界!”,font));
创建一个table和其中的cell
/**
* 开始第二张表格
*/
PdfPTable table2=new PdfPTable(42); //设置表格所占列数
PdfPCell [][] cell2=new PdfPCell[20][10];//cell数组
/**
* 第一行
*/
cell2[1][1]=createCell(“课程性质”,2,25);
cell2[1][2]=createCell(“小计”,1,6);
cell2[1][3]=createCell(“小计”,1,6);
cell2[1][4]=createCell(“备注”,1,5);
/**
* 第二行
*/
cell2[2][2]=createCell(“学时”,1,3);
cell2[2][3]=createCell(“比例”,1,3);
cell2[2][4]=createCell(“学分”,1,3);
cell2[2][5]=createCell(“比例”,1,3);
cell2[2][6]=createCell(” “,1,5);
for(int i=0;i<20;i++){
for(int j=0;j<10;j++){
if(cell2[i][j]!=null){
table2.addCell(cell2[i][j]);
}
}
}
table2.setWidthPercentage(60); //设置表格宽度(百分比)
table2.setHorizontalAlignment(0);//设置表格居左
table.setSpacingAfter(15f); //设置表格后间距
document.add(table2);
/**
* 创建一个单元格的cell
* @param cellName
* @return
* @throws DocumentException
* @throws IOException
*/
public PdfPCell createCell(String cellName) throws DocumentException, IOException{
BaseFont title1 = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
// 设置字体
Font mainFont = new Font(title1,7,Font.NORMAL);
float f = 0.5f;
float lineHeight = 18f;
PdfPCell cell = new PdfPCell(new Phrase(cellName, mainFont));
cell.setUseBorderPadding(true);
cell.setBorderWidth(f);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
return cell;
}
/**
* 创建占据多个单元格的cell
* @param cellName
* @param row
* @param col
* @return
* @throws DocumentException
* @throws IOException
*/
public PdfPCell createCell(String cellName,Integer row,Integer col) throws DocumentException, IOException{
BaseFont title1 = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
Font titleFont = new Font(title1, 25, Font.NORMAL);
// 设置字体
Font mainFont = new Font(title1,7, Font.NORMAL);
float f = 0.5f;
float lineHeight = 18f;
PdfPCell cell = new PdfPCell(new Phrase(cellName, mainFont));
cell.setUseBorderPadding(true);
cell.setBorderWidth(f);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);//设置左右居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);//设置上下居中
//设置cell占据的行列数
if(row!=null){
cell.setRowspan(row);//设置cell占据行数
}
if(col!=null){
cell.setColspan(col);//设置cell占据列数
}
return cell;
}
常用方法
table.setWidthPercentage(100); //表格宽度定义100%
table.setSpacingAfter(15f); //设置表格后间距
复杂表格生成的代码示例
// 标题字体
BaseFont title1 = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
Font titleFont = new Font(title1, 25, Font.NORMAL);
// 设置字体
Font mainFont = new Font(title1, 10, Font.NORMAL);
float f = 0.5f;
Document doc = null;
float lineHeight = 18f;
PdfPCell[][] cell = new PdfPCell[100][20];
//int colNum = 1;
//int rowNum = 1;
doc = new Document(PageSize.A3);//设置文档大小为A3纸
//PdfWriter.getInstance(doc, new FileOutputStream("test1.pdf"));
response.setHeader("Content-disposition", "attachment; filename=jx.pdf");
response.setContentType("application/pdf");
PdfWriter.getInstance(doc, response.getOutputStream());
doc.open();
Paragraph p1 = new Paragraph("教学计划表\n\n", titleFont);
p1.setAlignment(1);
doc.add(p1);
/**
* 插入表格
*/
/**
* 第一行
*/
PdfPTable table = new PdfPTable(53);
//表格宽度100%
table.setWidthPercentage(100);
PdfPCell cell1 = createCell("铁道机车专业教学计划表",1,53);
table.addCell(cell1);
/**
* 第二行
*/
/*PdfPCell cell2_1 = createCell("月");
table.addCell(cell2_1);
String [] mouthList={"九月","十月","十一月","十二月","一月","二月","三月","四月","五月","六月","七月","八月"};
Integer [] mouthLegth={5,4,4,4,5,4,4,4,5,4,5,4};
for(int i=0;i<mouthList.length;i++){
PdfPCell celltemp = createCell(mouthList[i],1,mouthLegth[i]);
table.addCell(celltemp);
}*/
PdfPCell cell2_1 = createCell("学期",1,1);
PdfPCell cell2_2 = createCell("上学期",1,26);
PdfPCell cell2_3 = createCell("下学期",1,26);
table.addCell(cell2_1);
table.addCell(cell2_2);
table.addCell(cell2_3);
PdfPCell cell3_1 = createCell("周");
table.addCell(cell3_1);
for(int i=0;i<52;i++){
int j;
if(i<=25)
j=i+1;
else
j=i-25;
PdfPCell celltemp = createCell(String.valueOf(j));
table.addCell(celltemp);
}
/**
* 第四,五,六行
*/
String[] hanzi={"一","二","三","四"};
for(int i=0;i<3;i++){
PdfPCell temp = createCell(hanzi[i]);
table.addCell(temp);
for(int j=0;j<52;j++){
PdfPCell celltemp = createCell("上课");
table.addCell(celltemp);
}
}
/**
* 第七行
*/
PdfPCell cell7_1 = new PdfPCell(new Phrase("军训:JX 军训:JX 军训:JX 军训:JX 军训:JX 军训:JX 军训:JX 军训:JX 军训:JX \n 军训:JX 军训:JX 军训:JX 军训:JX 军训:JX ",mainFont));
cell7_1.setRowspan(10);
cell7_1.setColspan(53);
table.addCell(cell7_1);
/**
* 第八行
*/
PdfPCell [] pdfPCells=new PdfPCell[18];
pdfPCells [0]=createCell("序号",1,2);
pdfPCells [1]=createCell("课程模块",1,5);
pdfPCells [2]=createCell("课程代码",1,3);
pdfPCells [3]=createCell("课程名称",1,15);
pdfPCells [4]=createCell("核心课程",1,3);
pdfPCells [5]=createCell("学分",1,3);
pdfPCells [6]=createCell("总学时",1,3);
pdfPCells [7]=createCell("理论",1,2);
pdfPCells [8]=createCell("实践",1,2);
pdfPCells [9]=createCell("一");
pdfPCells [10]=createCell("二");
pdfPCells [11]=createCell("三");
pdfPCells [12]=createCell("四");
pdfPCells [13]=createCell("五");
pdfPCells [14]=createCell("六");
pdfPCells [15]=createCell("上课周数",1,3);
pdfPCells [16]=createCell("开课部门",1,3);
pdfPCells [17]=createCell("备注",1,4);
for(int i=0;i<18;i++){
table.addCell(pdfPCells[i]);
}
//公共基础课模拟数据
List<Map<String,Object>> ggjck=new ArrayList<Map<String,Object>>();
for(int i=0;i<5;i++){
Map<String,Object> km=new HashMap<String,Object>();
km.put("kcdm","10001");
km.put("kcmc","雪中悍刀行");
km.put("hxkc","是");
km.put("xf","3.0");
km.put("zxs","30");
km.put("ll","理论");
km.put("sj","实践");
km.put("yi","1");
km.put("er","2");
km.put("san","3");
km.put("si","4");
km.put("wu","5");
km.put("liu","6");
km.put("skzs","10/13");
km.put("kkbm","理学院");
km.put("bz","重要课程");
ggjck.add(km);
}
//专业基础课模拟数据
List<Map<String,Object>> zyjck=new ArrayList<Map<String,Object>>();
for(int i=0;i<5;i++){
Map<String,Object> km=new HashMap<String,Object>();
km.put("kcdm","10001");
km.put("kcmc","锦衣夜行");
km.put("hxkc","是");
km.put("xf","3.0");
km.put("zxs","30");
km.put("ll","理论");
km.put("sj","实践");
km.put("yi","1");
km.put("er","2");
km.put("san","3");
km.put("si","4");
km.put("wu","5");
km.put("liu","6");
km.put("skzs","10/13");
km.put("kkbm","文学院");
km.put("bz","重要课程");
zyjck.add(km);
}
//公共选修课模拟数据
List<Map<String,Object>> ggxxk=new ArrayList<Map<String,Object>>();
for(int i=0;i<5;i++){
Map<String,Object> km=new HashMap<String,Object>();
km.put("kcdm","10001");
km.put("kcmc","回到明朝当王爷");
km.put("hxkc","是");
km.put("xf","3.0");
km.put("zxs","30");
km.put("ll","理论");
km.put("sj","实践");
km.put("yi","1");
km.put("er","2");
km.put("san","3");
km.put("si","4");
km.put("wu","5");
km.put("liu","6");
km.put("skzs","10/13");
km.put("kkbm","文学院");
km.put("bz","重要课程");
ggxxk.add(km);
}
//专业选修课模拟数据
List<Map<String,Object>> zyxxk=new ArrayList<Map<String,Object>>();
for(int i=0;i<5;i++){
Map<String,Object> km=new HashMap<String,Object>();
km.put("kcdm","10001");
km.put("kcmc","诛仙");
km.put("hxkc","是");
km.put("xf","3.0");
km.put("zxs","30");
km.put("ll","理论");
km.put("sj","实践");
km.put("yi","1");
km.put("er","2");
km.put("san","3");
km.put("si","4");
km.put("wu","5");
km.put("liu","6");
km.put("skzs","10/13");
km.put("kkbm","文学院");
km.put("bz","重要课程");
zyxxk.add(km);
}
//模拟小计
Map<String,Object> xjMap=new HashMap<String,Object>();
xjMap.put("xf", 55);
xjMap.put("zxs",562);
xjMap.put("ll",349);
xjMap.put("sj",213);
//第二级模块
Map<String,Object >secondLevelModule1=new HashMap<String,Object>();
secondLevelModule1.put("xj",xjMap);
secondLevelModule1.put("courseList", ggjck);
Map<String,Object >secondLevelModule2=new HashMap<String,Object>();
secondLevelModule2.put("xj",xjMap);
secondLevelModule2.put("courseList", zyjck);
Map<String,Object >secondLevelModule3=new HashMap<String,Object>();
secondLevelModule3.put("xj",xjMap);
secondLevelModule3.put("courseList", ggxxk);
Map<String,Object >secondLevelModule4=new HashMap<String,Object>();
secondLevelModule4.put("xj",xjMap);
secondLevelModule4.put("courseList", zyxxk);
//第一级模块
Map<String,Object> moduleMap1=new HashMap<String,Object>();
moduleMap1.put("secondModuleName","公共基础课程");
moduleMap1.put("moduleInfo",secondLevelModule1);
Map<String,Object> moduleMap2=new HashMap<String,Object>();
moduleMap2.put("secondModuleName","专业基础课程");
moduleMap2.put("moduleInfo",secondLevelModule2);
Map<String,Object> moduleMap3=new HashMap<String,Object>();
moduleMap3.put("secondModuleName","公共选修课程");
moduleMap3.put("moduleInfo",secondLevelModule3);
Map<String,Object> moduleMap4=new HashMap<String,Object>();
moduleMap4.put("secondModuleName","专业选修课程");
moduleMap4.put("moduleInfo",secondLevelModule4);
Map<String,Object> firstLevelModule1=new HashMap<String,Object>();
List<Map<String,Object>> secondLevelList1=new ArrayList<Map<String,Object>>();
secondLevelList1.add(moduleMap1);
secondLevelList1.add(moduleMap2);
firstLevelModule1.put("firstModuleName","必修课");
firstLevelModule1.put("secondLevelModuleList",secondLevelList1);
Map<String,Object> firstLevelModule2=new HashMap<String,Object>();
List<Map<String,Object>> secondLevelList2=new ArrayList<Map<String,Object>>();
secondLevelList2.add(moduleMap3);
secondLevelList2.add(moduleMap4);
firstLevelModule2.put("firstModuleName","选修课");
firstLevelModule2.put("secondLevelModuleList",secondLevelList2);
List<Map<String,Object>> moduleList=new ArrayList<Map<String,Object>>();
moduleList.add(firstLevelModule1);
moduleList.add(firstLevelModule2);
Map<String,Object> finallyModuleMap=new HashMap<String, Object>();
finallyModuleMap.put("moduleList", moduleList);
//System.out.println(finallyModuleMap.toString());
Object object = JSONObject.toJSON(finallyModuleMap);
System.out.println(object.toString());
//尝试循环加入数据
//得到一级模块的行数
int firstModuleNum=moduleList.size();//一级模块个数
int [] firstModuleRow=new int [10];//一级模块所占行数数组
int secondModuleNum=0;//二级模块个数
int [][]secondModuleRow=new int[10][10];//二级模块所占行数
for(int i=0;i<moduleList.size();i++){
int firstModuleRowTemp=0;
for(int j=0;j<((ArrayList)moduleList.get(i).get("secondLevelModuleList")).size();j++){
secondModuleNum++;//二级模块+1
Map tempMap = (HashMap)(((ArrayList)moduleList.get(i).get("secondLevelModuleList")).get(j));//
int secondModuleRowTemp=((ArrayList)(((HashMap)(tempMap.get("moduleInfo"))).get("courseList"))).size();
secondModuleRow[i][j]=secondModuleRowTemp+1; //得到二级模块所占行数
firstModuleRowTemp+=(secondModuleRowTemp+1); //一级模块所占行数为二级模块之和
}
firstModuleRow[i]=firstModuleRowTemp;
}
System.out.println("firstModuleNum "+firstModuleNum);
System.out.println("secondModuleNum "+secondModuleNum);
System.out.println(firstModuleRow[0]+" "+firstModuleRow[1]);
System.out.println(secondModuleRow[0][0]+" "+secondModuleRow[0][1]+" "+secondModuleRow[1][0]+" "+secondModuleRow[1][1]);
//生成cell数组
int rowNum=9;//开始行数
int colNum=1;//开始列数
int addRowNum=0;//循环增加的行数
for(int i=0;i<moduleList.size();i++){ //循环一级模块
//cell[rowNum][1] =createCell(String.valueOf(colNum));//序号cell
String firstModuleName=moduleList.get(i).get("firstModuleName").toString();//一级模块名称
cell[rowNum+addRowNum][2]=createCell(firstModuleName,firstModuleRow[i],2);//一级模块名称cell
List<Map<String,Object>> secondLevelModuleListTemp=new ArrayList<Map<String,Object>>(); //二级模块
secondLevelModuleListTemp=(ArrayList)(((HashMap)moduleList.get(i)).get("secondLevelModuleList"));
for(int j=0;j<secondLevelModuleListTemp.size();j++){ //循环二级模块
Map<String,Object> secondLevelModuleMapTemp=secondLevelModuleListTemp.get(j);
String secondModuleName=secondLevelModuleMapTemp.get("secondModuleName").toString(); //二级模块名称
cell[rowNum+addRowNum][3]=createCell(secondModuleName,secondModuleRow[i][j],3);//二级模块名称cell
List<Map<String,Object>> courseListTemp=new ArrayList<Map<String,Object>>(); //课程列表
Map<String,Object> xjTemp=new HashMap<String,Object>(); //小结
courseListTemp=(ArrayList)(((HashMap)secondLevelModuleMapTemp.get("moduleInfo")).get("courseList"));
xjTemp=(HashMap)(((HashMap)secondLevelModuleMapTemp.get("moduleInfo")).get("xj"));
for(int k=0;k<=courseListTemp.size();k++){ //循环课程信息和小结信息
if(k<courseListTemp.size()){ //循环课程信息
Map<String,Object> courseMap=new HashMap<String, Object>(); //单一课程具体信息
courseMap=courseListTemp.get(k);
cell[rowNum+addRowNum][1] =createCell(String.valueOf(k+1),1,2);//序号cell
cell[rowNum+addRowNum][4] =createCell(courseMap.get("kcdm").toString(),1,3);//课程代码cell
cell[rowNum+addRowNum][5] =createCell(courseMap.get("kcmc").toString(),1,15);//课程代码cell
cell[rowNum+addRowNum][6] =createCell(courseMap.get("hxkc").toString(),1,3);//课程代码cell
cell[rowNum+addRowNum][7] =createCell(courseMap.get("xf").toString(),1,3);//课程代码cell
cell[rowNum+addRowNum][8] =createCell(courseMap.get("zxs").toString(),1,3);//课程代码cell
cell[rowNum+addRowNum][9] =createCell(courseMap.get("ll").toString(),1,2);//课程代码cell
cell[rowNum+addRowNum][10] =createCell(courseMap.get("sj").toString(),1,2);//课程代码cell
cell[rowNum+addRowNum][11] =createCell(courseMap.get("yi").toString());//课程代码cell
cell[rowNum+addRowNum][12] =createCell(courseMap.get("er").toString());//课程代码cell
cell[rowNum+addRowNum][13] =createCell(courseMap.get("san").toString());//课程代码cell
cell[rowNum+addRowNum][14] =createCell(courseMap.get("si").toString());//课程代码cell
cell[rowNum+addRowNum][15] =createCell(courseMap.get("wu").toString());//课程代码cell
cell[rowNum+addRowNum][16] =createCell(courseMap.get("liu").toString());//课程代码cell
cell[rowNum+addRowNum][17] =createCell(courseMap.get("skzs").toString(),1,3);//课程代码cell
cell[rowNum+addRowNum][18] =createCell(courseMap.get("kkbm").toString(),1,3);//课程代码cell
cell[rowNum+addRowNum][19] =createCell(courseMap.get("bz").toString(),1,4);//课程代码cell
addRowNum++;//行数计数器增加
}else if(k==courseListTemp.size()){//增加小结信息
cell[rowNum+addRowNum][1] =createCell(" ",1,2);//序号cell
cell[rowNum+addRowNum][4] =createCell(" ",1,3);//课程代码cell
cell[rowNum+addRowNum][5] =createCell("小结",1,15);//课程代码cell
cell[rowNum+addRowNum][6] =createCell("是",1,3);//课程代码cell
cell[rowNum+addRowNum][7] =createCell(xjTemp.get("xf").toString(),1,3);//课程代码cell
cell[rowNum+addRowNum][8] =createCell(xjTemp.get("zxs").toString(),1,3);//课程代码cell
cell[rowNum+addRowNum][9] =createCell(xjTemp.get("ll").toString(),1,2);//课程代码cell
cell[rowNum+addRowNum][10] =createCell(xjTemp.get("sj").toString(),1,2);//课程代码cell
cell[rowNum+addRowNum][11] =createCell(" ");//课程代码cell
cell[rowNum+addRowNum][12] =createCell(" ");//课程代码cell
cell[rowNum+addRowNum][13] =createCell(" ");//课程代码cell
cell[rowNum+addRowNum][14] =createCell(" ");//课程代码cell
cell[rowNum+addRowNum][15] =createCell(" ");//课程代码cell
cell[rowNum+addRowNum][16] =createCell(" ");//课程代码cell
cell[rowNum+addRowNum][17] =createCell(" ",1,3);//课程代码cell
cell[rowNum+addRowNum][18] =createCell(" ",1,3);//课程代码cell
cell[rowNum+addRowNum][19] =createCell(" ",1,4);//课程代码cell
addRowNum++;//行数计数器增加
}
}
}
}
//table循环加入cell
for(int i=0;i<100;i++){
for(int j=0;j<20;j++){
if(cell[i][j]!=null){ //当cell不为空的时候进行添加
table.addCell(cell[i][j]);
}
}
}
doc.add(table);