Java实现树形层级结构的表格 二

继续中午....

 

代码中com.cntrust.report.example包下已经提供三种表格的实例代码,可直接运行。

 

列头表格:ColHeadReport

使用场景:类似常见的信息列表,由列头和数据行构成,如下图:


Java实现树形层级结构的表格 二_第1张图片
 

生成代码:

 

package com.cntrust.report.example;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import jxl.write.WriteException;

import com.cntrust.report.Cell;
import com.cntrust.report.ColHeadReport;
import com.cntrust.report.format.DefaultExcelReportFormat;

public class ColHeadReportTest {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws WriteException 
	 */
	public static void main(String[] args) throws WriteException, IOException {
		List cols = new ArrayList();
		
		/**
		 * 
		 * 向列头列表中填充单元格
		 * 
		 */
		
		cols.add(new Cell("sh1", "上海市第一中学", "-1"));
		cols.add(new Cell("sh2", "上海市第二中学", "-1"));
		
		//单元格的构造函数参数列表:单元格唯一标识、单元格显示名称、上级单元格的唯一标识
		cols.add(new Cell("sh2,一班", "一班", "sh2"));
		cols.add(new Cell("sh2,一班,数学", "数学", "sh2,一班"));
		cols.add(new Cell("sh2,一班,语文", "语文", "sh2,一班"));
		
		cols.add(new Cell("03", "二班", "sh2"));
		cols.add(new Cell("03,01", "数学", "03"));
		cols.add(new Cell("03,01", "语文", "03"));
		
		cols.add(new Cell("04", "一班", "sh1"));
		cols.add(new Cell("04,01", "数学", "04"));
		cols.add(new Cell("04,02", "语文", "04"));
		
		cols.add(new Cell("05", "二班", "sh1"));
		cols.add(new Cell("05,01", "数学", "05"));
		cols.add(new Cell("05,01", "语文", "05"));
		
		//根据列头构建报表
		ColHeadReport report = new ColHeadReport(cols);
		
		for (int i = 1; i < 11; i++) {
			//为上海市第二中学一班的数学添加数据
			
			/**
			 * 
			 * 向表格中插入数据有点类似于根据坐标打点的方式,
			 * 插入的数据根据数据单元格对应的行头单元格ID和列头单元格ID定位,
			 * 然后想单元格内部的Map集合内插入键值对,也支持直接插入一个Map集合
			 * 
			 */
			report.setData(i, "sh2,一班,数学", "score", i);
			
			/**
			 * 
			 * 或是这样,通过Map集合的方式插入数据
			 * 
			 */
//			Map map = new HashMap();
//			map.put("score", i);
//			report.setData(i, "sh2,一班,数学", map);
			
		}
		
		//设置标题
		report.setTitle("上海市中学成绩表");
		
		//默认的格式化类通过传人键“score”从数据单元格中读取出对应的值显示在Excel中
		report.toExcel(new DefaultExcelReportFormat("score"), new File("D:/成绩表_ColHeadReport.xls"));
		
		System.out.println("完成!");
	}

}

 

 

行头表格:RowHeadReport

使用场景:这种表格不怎么常见,不过还是加上吧,有时候交叉表格不太好实现的就用这个替代一下也可以的,如下图:

 


Java实现树形层级结构的表格 二_第2张图片
 

生成代码:

 

格式化的代码:DailyReportFormat

 

package com.cntrust.report.example.format;

import jxl.format.Alignment;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.WritableCell;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WriteException;

import com.cntrust.report.Cell;
import com.cntrust.report.Report;
import com.cntrust.report.Row;
import com.cntrust.report.format.ExcelReportFormat;

public class DailyReportFormat extends ExcelReportFormat{

	private String key = "co";
	private WritableSheet sheet;
	
	public DailyReportFormat(){
		
	}
	
	public DailyReportFormat(String key){
		this.key = key;
	}
	
	@Override
	public void after(WritableSheet sheet, Report report) throws WriteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void before(WritableSheet sheet, Report report) throws WriteException {
		sheet.setName("sheet1");
		
		//设置第一列宽度
		sheet.setColumnView(0, 28);
		sheet.setColumnView(1, 30);
		sheet.setColumnView(2, 125);
		//设置第一二三四行高度
		sheet.setRowView(0, 660);
		//sheet.setRowView(1, 360);
		
		//合并单元格
	    sheet.mergeCells(0, 0, report.getColSpan() - 1, 0);
	   // sheet.mergeCells(0, 1, report.getColSpan() - 1, 1);
	    
	    WritableCellFormat format = this.getCellFormatWithNoBorder(this.getFont(WritableFont.ARIAL, 16, true, false));
	    Label title = new Label(0, 0, report.getTitle(), format);
	    sheet.addCell(title);
	    format = this.getCellFormatWithNoBorder(this.getFont(WritableFont.ARIAL, 10, true, false));
	    //水平居左
	    format.setAlignment(Alignment.LEFT);
	    //设置垂直居下
	    format.setVerticalAlignment(VerticalAlignment.BOTTOM);
	    //format.setShrinkToFit(false);
	    
	    //sheet.addCell(new Label(0, 1, "日期:" + new Date().toLocaleString().substring(0, 10), format));
		
	    this.sheet = sheet;
	    
	}

	@Override
	public WritableCell getCell(int colIndex, int rowIndex, Cell c) throws WriteException {
		WritableFont font = null;
		WritableCell cell = null;
		
		String cellType = c.getData().get("cellType") == null ? null : c.getData().get("cellType").toString();
		
		if(Report.CELL_TYPE_Data.equals(cellType)){
			font = this.getFont(WritableFont.ARIAL, 10, false, false);
			WritableCellFormat format = this.getCellFormatWithSimpleBorder(font);
			//水平居中
			format.setAlignment(Alignment.LEFT);
			//行高
			this.sheet.setRowView(rowIndex, 1000);
			
			//cell = new jxl.write.Number(colIndex, rowIndex, value, format);
			cell = new Label(colIndex, rowIndex, c.getName(), format);
		}else if(Report.CELL_TYPE_RowHead.equals(cellType)){
			font = this.getFont(WritableFont.ARIAL, 10, true, false);
			WritableCellFormat format = this.getCellFormatWithSimpleBorder(font);
			cell = new Label(colIndex, rowIndex, c.getName(), format);
			
			//行高
			this.sheet.setRowView(rowIndex, 1000);
			
		}else{
			font = this.getFont(WritableFont.ARIAL, 10, true, false);
			WritableCellFormat format = this.getCellFormatWithSimpleBorder(font);
			cell = new Label(colIndex, rowIndex, c.getName(), format);
		}
		
		return cell;
	}

	@Override
	public int getColOffset() {
		return 0;
	}

	@Override
	public int getRowOffset() {
		return 1;
	}

	@Override
	public int getTableRowHeight(Report report, Row row, int rowIndex) {
		return 360;
	}

}

 

构造表格代码:

 

package com.cntrust.report.example;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import jxl.write.WriteException;

import com.cntrust.report.Cell;
import com.cntrust.report.Report;
import com.cntrust.report.RowHeadReport;
import com.cntrust.report.example.format.DailyReportFormat;

public class DailyReportTest {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws WriteException 
	 */
	public static void main(String[] args) throws WriteException, IOException {
		
		/**
		 * 
		 * 构造一个包含cellType的Map集合,将会放入Cell中,
		 * 用于在格式化时根据此类型进行不同的显示
		 * 
		 */
		Map map = new HashMap();
		map.put("cellType", Report.CELL_TYPE_Data);
		
		List rowList = new ArrayList();
		
		rowList.add(new Cell("日期", "日期", "-1"));
		rowList.add(new Cell("项目", "项目", "日期"));
		rowList.add(new Cell("内容", "内容", "项目"));
		
		rowList.add(new Cell("01", "2014年7月16日", "-1"));
		rowList.add(new Cell("01,01", "湖北一期", "01"));
		
		Cell cell1 = new Cell("01,01,01", "今天我都做了些什么呢?", "01,01");
		cell1.setData(map);
		rowList.add(cell1);
		
		Cell cell2 = new Cell("01,01,02", "我也不知道都做了些什么!", "01,01");
		cell2.setData(map);
		rowList.add(cell2);
		
		rowList.add(new Cell("01,02", "湖北一期", "02"));
		
		Cell cell3 = new Cell("01,02,01", "今天我都做了些什么呢?", "01,02");
		cell3.setData(map);
		rowList.add(cell3);
		
		Cell cell4 = new Cell("01,02,02", "我也不知道都做了些什么!", "01,02");
		cell4.setData(map);
		rowList.add(cell4);
		
		rowList.add(new Cell("02", "2014年7月17日", "-1"));
		rowList.add(new Cell("02,01", "湖北二期", "02"));
		
		Cell cell5 = new Cell("02,01,01", "我今天做了很多东西", "02,01");
		cell5.setData(map);
		rowList.add(cell5);
		
		Cell cell6 = new Cell("02,01,02", "今天的确做了很多东西!", "02,01");
		cell6.setData(map);
		rowList.add(cell6);
		
		Cell cell7 = new Cell("02,01,03", "嗯,我确定!", "02,01");
		cell7.setData(map);
		rowList.add(cell7);
		
		Report report = new RowHeadReport(rowList);
		
		report.toExcel(new DailyReportFormat(), new File("D:/日报_RowHeadReport.xls"));
		
		System.out.println("完成!");
	}

}

 

交叉表格:CrossReport

 

使用场景:这类表格使用还是蛮频繁的,特别是对大量数据进行统计,再以很多维度进行显示的情况下,如下图:

 


Java实现树形层级结构的表格 二_第3张图片
 

实例代码我就不写了,如果数据是从数据库中查询出来在展现,代码量还是蛮少的,作为一个非常懒的程序猿如果让我一一写的话,我会疯掉的!!有兴趣的话自己试着写写吧微笑

 

以上图片均为统一的接口导出的Excel文件,那如何在页面中用统一的方式展现呢?如下:

简单的CSS样式:

 

 

JSP中通过EL表达式进行统一的绘制表格(report对象已放入上下文中):

 


		
				
${cell.data['day']} ${cell.name}

 

差不多就这样吧,展示的思想就是通过行列坐标定位单元格,然后填充数据。

 

讨论群:107249241

 

 

 

你可能感兴趣的:(Java)