java excel 复杂表头_中国式复杂报表开发教程(4)—类Excel复杂表头报表

矩表控件出现之前,对于复杂表头的报表的实现,如多行表头嵌套,列单元格合并等,只能通过一些Look Like的方法来实现,并没有做到真正的底层实现来解决实质性的内容。复杂表头报表,甚至只能通过Table嵌套来实现,这样一来,报表设计难度上升,而且容易出现样式错误等信息。无所不能的矩表控件,所向无敌,列单元格合并更不在话下。

本节中国式复杂报表第四讲:类Excel 复杂表头报表实现;主要通过行列单元格合并功能来实现。无论多复杂的报表表头,都能轻松创建

报表结构分析:

bf5974d3d8ce5679241b4b47c881e045.png

1. 表头复杂,单列包含多级列头,列头占用的单元格数不确定。

2. 合计行在明细行上方

(这要是没有了矩表控件,可是难倒一大片报表专家)

解决方案:

矩表,矩表,矩表;

列单元格合并

报表实现:

1.新建RDL报表模板

2.添加数据源和数据集

1. 绑定数据源

2. 添加数据集

select * from 财政教育经费投入数据 ;

1349f6976cf47b00f21cfb1682aecb84.png

3.添加矩表控件

添加Tablix后,会发现有类似[ 符号,表示分组,即可根据具体数据动态生成行。会发现设计器下面的矩表分组管理器;

4.添加复杂表头

通过报表结构分析,报表列数据主要分为三组;列中包含三大列“财政教育经费投入(万元)”;“其他投入”;“补充资料”;每一大列下面包含合计项,和子列头;如其他投入:包含村投入,社会捐款;

因此我们需要逐层细化;构造复杂的表头结构;

1. 添加三个分组列;

31e5e5ca5a4d093ad82b54ea4263083f.png

a3077c3f5f231bbafddba2f58f578641.png

2. 添加列头行 5列;

22908bccb424ef75a726c800e0c1db9d.png

3.构造“财务教育经费投入(万元)”列

ef84ce877660e4ab6995721e4ed7816c.png

添加8个子列,合计列自动生成;

08697d0ff8ea75c550e154f2b645017f.png

合并首行单元格,输入“财政教育经费投入(万元)”

合并第二行“1-7”单元格;输入“教育事业费”

合并第二行“8”单元格,第三行“8”单元格,第四行“8”单元格,第五行“8”单元格;输入“基建拨款”

5e32c0bff34f8bc727be5a627f721069.png

合并第三行“1-2”单元格;输入“合计”

列单元格合并,输入“人员经费”;同样的方法,创建“日常公用经费”

725e2d06d3fbdce93cb686428782ba11.png

c9602d8064ee24e0bc212f5953e592a9.png

合并第三行“5-7”单元格,输入“项目经费”

c2ac40f29e4eec11d8ebc5adfda3eb47.png

合并第四行和第五行单元格“1”;合并第四行和第五行单元格“2”;输入内容

caec7a0e4ad72bcb6725c9fb5bf9a487.png

合并第四行和第五行“5”单元格,输入“合计”;合并第四行“6”,“7”单元格;输入“其中”;在剩余的单元格中,输入内容;

64f1cf1510111221a8fbfa1fd39230e3.png

添加分组合计;选中单元格,右键选择添加合计“分组前面”

e5c8ab0722ed252faf86029dc87ef13f.png

合并相应单元格,输入“合计”;

34c3ecc92ab50bcab3446fa673fcf654.png

“财政教育经费投入”列就已经构造完成,可采用相同的操作来创建“其他投入”;“补充资料”列。

5.添加行,将具体字段拖拽到行分组中;

6.将具体数据绑定到单元格中;

7.选择行分组单元格添加合计,选择插入“分组前面”,即可保证合计在详细数据上方:

7dff37572878b6547da3ed94f9835b08.png

到这里,报表的整体结构都已创建完成了,需要做的就是调整报表样式。

文章转自葡萄城

标签:报表解决方案报表.NET报表控件

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,尊重他人劳动成果

a6e1590ae4b228073faff3806334194e.png0

好文不易,鼓励一下吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java读取Excel表头可以使用Apache POI库来实现。对于复杂表头,可以使用递归的方式进行处理。下面是一个示例代码: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.io.InputStream; public class ExcelReader { public static void main(String[] args) { try { InputStream inp = new FileInputStream("path/to/your/excel/file.xlsx"); Workbook workbook = new XSSFWorkbook(inp); Sheet sheet = workbook.getSheetAt(0); // 读取第一个sheet页 int rowIndex = 0; // 表头所在的行索引 Row headerRow = sheet.getRow(rowIndex); // 读取表头 readHeader(headerRow, 0, ""); workbook.close(); inp.close(); } catch (Exception e) { e.printStackTrace(); } } private static void readHeader(Row row, int colIndex, String columnHeader) { Cell cell = row.getCell(colIndex); String value = cell.getStringCellValue(); if (cell.getCellType() == CellType.BLANK) { return; } // 处理合并单元格 int mergedRegionIndex = findMergedRegionIndex(row.getSheet(), row.getRowNum(), colIndex); if (mergedRegionIndex >= 0) { value = row.getSheet().getMergedRegion(mergedRegionIndex).getCell(0).getStringCellValue(); } columnHeader += value + " "; // 递归处理子列 if (cell.getCellType() == CellType.STRING && cell.getStringCellValue().contains(" ")) { readHeader(row, colIndex + 1, columnHeader); } else { System.out.println(columnHeader.trim()); } } private static int findMergedRegionIndex(Sheet sheet, int rowIndex, int colIndex) { for (int i = 0; i < sheet.getNumMergedRegions(); i++) { CellRangeAddress range = sheet.getMergedRegion(i); if (range.isInRange(rowIndex, colIndex)) { return i; } } return -1; } } ``` 这段代码会读取Excel文件中第一个sheet页的第一行作为表头,并且会处理合并单元格的情况。对于复杂表头,会使用递归的方式处理子列。每读取到一个完整的表头,会打印出来。你可以根据需要对表头进行其他的处理操作。请将代码中的"path/to/your/excel/file.xlsx"替换为你实际的Excel文件路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值