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 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

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

 



 

生成代码:

 

格式化的代码: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;}@Overridepublic void after(WritableSheet sheet, Report report) throws WriteException {// TODO Auto-generated method stub}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic int getColOffset() {return 0;}@Overridepublic int getRowOffset() {return 1;}@Overridepublic 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

 

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

 



 

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

 

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

简单的CSS样式:

 

 

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

 

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

 

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

 

讨论群:107249241

 

 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部