`
niqingyang
  • 浏览: 44191 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
阅读更多

继续中午....

 

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

 

列头表格:ColHeadReport

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



 

生成代码:

 

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<Cell> cols = new ArrayList<Cell>();
		
		/**
		 * 
		 * 向列头列表中填充单元格
		 * 
		 */
		
		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<String, Object> map = new HashMap<String, Object>();
//			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

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

 



 

生成代码:

 

格式化的代码: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<String, Object> map = new HashMap<String, Object>();
		map.put("cellType", Report.CELL_TYPE_Data);
		
		List<Cell> rowList = new ArrayList<Cell>();
		
		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

 

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

 



 

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

 

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

简单的CSS样式:

 

<style type="text/css">
		
			.table_currentDate{
				width: 550px;
				background-color: White;
				text-align: center;
				font-weight: 800;
				font-size: 18px;
			}
		
			.table_dailyReport{
				border-collapse: collapse;
				border: 1px solid #CCCCCC;
				width: 100%;
				width: 550px;
				background-color: White;
			}

			.table_dailyReport td{
				word-wrap: nowrap;
				word-break: keep-all;/**----强制文字不换行----**/
				border-color: #E3E3E3;/**#ccc**/
				padding: 1px 2px 1px 4px;
				color: #333;
			}

			.colHead{
				border-bottom: 1px solid windowtext;
				height: 20px;
				width: 90px;
				text-align: center;
				font-weight: 800;
				font-size: 16px;
				background-color: #F7F7F7;
			}

			.data{
				border-left: 1px solid windowtext;
				border-right: 1px solid windowtext;
				border-bottom: 1px solid windowtext;
				height: 70px;
				width: 70px;
				font-size: 14px;
				text-align: center;
			}
			
			.today{
				background-color: #29A0D3;
			}
		</style>

 

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

 

<table id="treeTable" class="table_dailyReport">
	<c:forEach items="${report.rowList}" var="row">
		<tr>
			<c:forEach items="${row.cellList}" var="cell">
				<td id="${cell.id}" colspan="${cell.colSpan}" rowspan="${cell.rowSpan}" class="${cell.cellType} ${cell.data['today']}">
				<c:choose>
					<c:when test="${cell.cellType == 'data'}">${cell.data['day']}</c:when>
					<c:otherwise><b>${cell.name}</b></c:otherwise>
				</c:choose>
				</td>
			</c:forEach>
		</tr>
	</c:forEach>
</table>

 

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

 

讨论群:107249241

 

 

 

  • 大小: 12.8 KB
  • 大小: 10.9 KB
  • 大小: 8.2 KB
分享到:
评论

相关推荐

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

    Java实现的,将树形层级结构的数据转换成表格,通过打点的方式向表格中插入数据,支持行头表格、列头表格、交叉表格三种形式

    Excel树形结构数据导入Oracle数据库(Java)

    在Java中处理这种数据,我们需要遍历这些层级,构建相应的数据模型来表示树形结构。 该博客中提到的"ExecleToDBUtils.java"文件,很可能是用于读取Excel并将其数据转换为适合存储在Oracle数据库中的格式的工具类。...

    java导出excel树结构工具类

    该工具类实现java导出树形结构的方法,并未采用excel分组功能实现,而是根据树节点显示层级设置excel样式。针对easyUi,treeGrid开发的导出excel功能。方法简便实用、性强、通俗易懂。项目中亲测,no problem。

    Android 树形结构开发demo,实现单选多选功能

    在Android应用开发中,树形结构的界面设计是一种常见的数据展示方式,特别是在处理层级关系复杂的数据时,如文件系统、组织架构等。本教程将详细讲解如何利用Android技术实现一个支持单选和多选功能的树形结构示例。...

    树形菜单和结合表格的树形菜单

    树形菜单和结合表格的树形菜单是一种常见的用户界面元素,尤其在数据层级结构复杂的Web应用中非常实用。本文将详细介绍这种技术,以及如何利用JavaScript实现,并探讨TableTree4J_V1.2RE这个库提供的功能。 首先,...

    树形结构xtree有添加和修改的功能。

    在IT领域,树形结构是一种常见的数据组织方式,它以层级的形式表示元素之间的关系,而XTREE则是一种基于HTML和JavaScript实现的树形结构控件。这个“xtree”项目显然是一个具有添加和修改功能的树形结构实现,可能是...

    java 表格树

    在Java编程领域,"表格树"(Treetable)是一种复合控件,它结合了表格(Table)和树形视图(Tree)的功能,能够同时展示数据的层次结构和线性列表。这种组件通常用于数据组织复杂且具有层级关系的情况,如文件系统、...

    JavaScript树形控件实现无限级树形菜单

    - **树形结构表格(TreeGrid)**:一次性生成树形表格,支持完整的分页和列排序功能。 - **其他复杂应用场景**:根据实际需求定制化的无限级树形菜单或树形结构。 #### 八、结论 通过使用Ext JS框架的AsyncTreeNode...

    JSP实现树型结构TREE

    本例"JSP实现树型结构TREE"提供了一个使用JSP(JavaServer Pages)、EXTJS(一个前端JavaScript框架)、JSON(JavaScript Object Notation)以及MySQL数据库来创建树形结构的示例,这对于初学者或开发者来说,是一个...

    非常实用的树形菜单,有数据库表

    1. **树形菜单**:树形菜单是一种层次结构的展示方式,它通过节点和边来表示数据之间的层级关系。用户可以通过展开和折叠节点来查看和操作数据。在Web应用中,树形菜单常用于文件管理、组织结构、类别导航等场景。 ...

    树状表格以及菜单树,很好用

    树状表格结合了表格的行列布局和树形结构的特点,它在每一行数据中可以展开或折叠子级数据,这种形式在数据层级较多且关联性强的情况下非常有用。例如,在项目管理软件中,可以使用树状表格来展示任务的层级关系,父...

    树状表格,可编辑

    在前端,开发人员可能会使用JavaScript库如jQuery、React、Vue或Angular来构建用户界面,这些库提供了丰富的组件和API,可以轻松创建交互式的树形结构。例如,像ag-Grid、Handsontable或wijmo等专业表格库就支持树状...

    java excel tree

    在Java Excel报表的上下文中,组合模式用于构建树形结构,代表组织中的部门或职位,每个节点可以是另一个子组织或者是个体员工。通过这种方式,我们可以方便地遍历和操作整个组织架构,无论是顶层的公司部门还是底层...

    excel树形字典,导入数据库

    在Excel中,树形字典通常指的是通过表格形式表示的具有层级关系的数据。例如,一个物料管理系统中的材料字典可能包含多个层次,如大类、中类、小类和具体物料,它们之间存在父子关系。这样的结构在Excel中可以通过多...

    左侧树形菜单+右侧页面+sql2000

    总结来说,这个项目是一个基于Web的管理界面,利用树形菜单展示三级结构,通过AJAX技术实现实时响应,与SQL Server 2000数据库进行交互,支持数据的插入操作。开发者需要掌握前端开发、后端编程以及数据库管理等相关...

    EXT 分页,树形结构案列

    5. 树形网格(TreeGrid):EXT还提供了结合了表格和树结构的TreeGrid组件,可以在同一视图中展示具有层级关系的表格数据。 三、EXT与Struts2整合 在Java Web开发中,EXT与Struts2框架的整合很常见。Struts2是一个...

    java编程两种树形菜单结构的转换代码

    在Java编程中,树形菜单结构常用于组织和展示层级数据,例如文件系统、组织架构或者网站导航。这里我们讨论两种常见的树形菜单结构:SingleTreeNode 和 MultiTreeNode,并且介绍如何将它们相互转换的代码。 首先,...

    struts2动态树形目录

    动态树形目录是Web应用程序中常见的一种交互方式,它允许用户以树状结构查看和操作数据,如文件系统、组织结构或层级关系的数据。在本项目中,"struts2动态树形目录"实现了这一功能,用户可以通过界面动态地创建、...

    bootstrap treeview可搜索下拉树形

    这个特定的压缩包文件包含了一个实现可搜索下拉树形功能的示例,这在许多Web应用中非常有用,比如用于导航菜单、组织结构展示或者层级数据的交互操作。 在jQuery中,Bootstrap Treeview通过添加特定的CSS样式和...

    treeTable树形显示

    TreeTable是一种在网页中以树状结构展示数据的表格组件,它将表格和树形视图结合在一起,常用于组织和展示层次结构的数据。在给定的“treeTable(jeesite使用)”压缩包中,我们可以找到一个基于Java Web框架Jeesite...

Global site tag (gtag.js) - Google Analytics