使用时easyExcel 填充模板导出列表,可以一个sheet里只有三个附表,能左上角1/2切换全部展示与收起来展示附表名就行
打开Excel并创建一个新文档。在第一个工作表上,选择其中三个单元格作为附表导航菜单的区域。在这些单元格中填写附表的名称。
然后在工作表中的其他区域创建模板,用于输入每个附表的数据。在每个工作表中,模板应该具有相同的格式和列名称,但是数据可以不同。
在左上角附表导航菜单的区域,为每个菜单项创建一个超链接。在"插入"选项卡的"超链接"下,选择"本文档"并找到每个附表的名称。在"屏幕提示"字段中,输入菜单项的名称。
在每个需要隐藏和展开的附表中,插入一个表单控件。选择"开发工具"选项卡中的"插入",单击"表单控件"下拉菜单,选择"组合框"。绘制一个方框并选择一个单元格来放置组合框。
然后对组合框进行属性设置。单击组合框并在"属性"窗格中进行更改。选择适当的附表命名,选择一个合适的单元格来存储其状态,并将其属性设置为"隐藏"。然后,计划使用宏来控制组合框的显示和隐藏。请确保为每个附表都创建一个组合框,并在每个组合框的属性窗格中设置正确的名称和状态存储单元格。
最后,创建一个VBA宏,该宏将依据组合框的状态显示或隐藏每个附表。打开VBA编辑器并创建一个新模块。创建一个事件处理函数,该函数将触发来自工作表中的组合框的"点击事件"。在该事件处理程序中,使用If语句根据组合框的状态来显示或隐藏相应的附表。运行该宏以测试菜单导航和状态更改。
注意:如果您使用的是EasyExcel来填充模板并将其导出到Excel文件中,则可以编写Python脚本生成一个带有上述功能的Excel文件。只需使用Python的openpyxl或xlsxwriter库创建Excel文档并进行相应设置即可。
答案参考ChapGPT Plus . 希望对你有帮助
您可以使用EasyExcel库来填充模板并导出列表数据,同时在一个sheet中实现展开和收起的功能。
下面是一种实现方法:
在Excel模板中,创建一个主表和三个附表的区域。将主表放置在左上角的位置。
使用EasyExcel库加载Excel模板,并填充主表数据。
在主表中创建一个超链接或按钮,用于展开和收起附表。
当用户点击展开按钮时,使用EasyExcel库填充附表数据,并将其插入到主表下方。
当用户点击收起按钮时,使用EasyExcel库删除附表数据。
以下是伪代码示例,用于说明上述步骤:
// 加载Excel模板
ExcelWriter writer = EasyExcel.write("template.xlsx").withTemplate("template.xlsx").build();
// 填充主表数据
List<MainTableData> mainDataList = getMainTableData();
writer.fill(mainDataList, new FillConfig().setForceNewRow(true));
// 创建展开按钮
writer.hyperlink(new HyperlinkData(1, 1, 1, 2, "展开", "Sheet2!A1"));
// 当用户点击展开按钮时,填充并展示附表数据
List<AttachmentTableData> attachmentDataList = getAttachmentTableData();
int startRow = mainDataList.size() + 2; // 在主表下方插入附表数据
writer.fill(attachmentDataList, new FillConfig().setStartRow(startRow));
// 当用户点击收起按钮时,删除附表数据
writer.removeRow(startRow, attachmentDataList.size());
// 导出Excel文件
writer.finish();
在上述示例中,getMainTableData()
和getAttachmentTableData()
是根据您的数据源获取主表和附表数据的方法。您需要根据您的实际情况进行相应的修改。
请注意,这只是一种基本的实现思路,您可能需要根据具体需求进行适当调整和修改。
希望这能帮助到您!如有进一步的问题,请随时提问。
若您使用的是 EasyExcel 2.x 版本,可以通过设置 ExcelExporter 参数的 autoCollapsed 属性来控制初始是否展开附表,并用 sheetName 和 autoAppend 判断是否需要在首行添加附表名称。以下是具体的实现:
ExcelExporter exporter = EasyExcel.write(outputStream).autoCloseStream(true).head(heads).autoCollapsed(false).build();
for (int i = 0; i < dataList.size(); i++) {
if (i % 3 == 0) {
// 新建 sheet,参数 autoAppend 为 true 表示在 sheet 首行添加附表名称
exporter.write(dataList.get(i), EasyExcel.writerSheet(i / 3 + 1, "附表" + (i / 3 + 1)).autoAppend(true).build());
} else {
exporter.write(dataList.get(i), EasyExcel.writerSheet(i / 3 + 1).build());
}
}
exporter.finish();
需要注意的是,autoAppend 为 true 时,需要设置表头行总样式 headCellStyle,以使附表名称与表头行样式一致。
如果您使用的是 EasyExcel 1.x 版本,则可以使用 Sheet 中的 setAutoFilter 和 setColumnWidths 方法,实现附表切换全部展示与收起行只展示附表名称的需求。以下是具体的实现:
// 新建 sheet
Sheet sheet = new Sheet(i / 3 + 1, 0);
// 添加附表过滤器
sheet.setAutoFilter(new CellRangeAddress(1, 1, 0, lastColumn));
if (i % 3 != 0) {
// 设置其他 sheet 列宽
sheet.setColumnWidths(columnWidthMap);
sheet.setStartRow(1);
} else {
// 设置附表名称单元格样式
sheet.setStyle(CellStyleUtil.buildCellStyle(workbook, true, true, false, false));
}
// 导出数据
writer.write(dataList.get(i), sheet);
其中,columnWidthMap 是一个 Map,保存的是列名和对应的列宽,用于设置其他 sheet 的列宽。CellStyleUtil.buildCellStyle 是一个自定义方法,用于创建单元格样式。
Sheet sheet = new Sheet(1, 0);
sheet.setSheetName("附表");
List<MyData> dataList = getDataList(); // 获取数据列表
// 填充第一个附表的数据
List<MyData> data1 = filterData(dataList, "附表1"); // 根据条件过滤数据
writeDataToSheet(sheet, data1);
// 填充第二个附表的数据
List<MyData> data2 = filterData(dataList, "附表2"); // 根据条件过滤数据
writeDataToSheet(sheet, data2);
// 填充第三个附表的数据
List<MyData> data3 = filterData(dataList, "附表3"); // 根据条件过滤数据
writeDataToSheet(sheet, data3);
// 在左上角添加切换按钮
Button toggleButton = new Button();
toggleButton.setText("展开/收起");
toggleButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (sheet.getVisibility() == View.VISIBLE) {
sheet.setVisibility(View.GONE);
} else {
sheet.setVisibility(View.VISIBLE);
}
}
});
sheet.addView(toggleButton, 0);
Workbook workbook = new XSSFWorkbook(); // 创建一个新的Workbook对象
Sheet sheet1 = workbook.createSheet("数据列表"); // 创建一个新的Sheet对象,用于存储数据列表的数据
workbook.setActiveSheet(sheet1); // 将数据列表的Sheet设置为活动Sheet
workbook.addSheet("附表", sheet); // 将包含三个附表的Sheet添加到Workbook中
workbook.write(outputStream); // 将Workbook写入输出流中,完成导出操作。
workbook.close(); // 关闭Workbook对象。
EasyExcel基于模板填充导出,如果原模板只有一个sheet,可以通过poi复制出需要的sheet个数的模板
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream);
//循环表名
if (CollectionUtil.isEmpty(sheetNames)){
return;
}
for (String sheetName : sheetNames) {
//第一参数是 以谁为模板,第二个参数是复制出来的模板名
xssfWorkbook.cloneSheet(0, sheetName);
}
可以通过设置Excel的分组数据实现
在EasyExcel的配置类中,设置sheet页的名称和表头,同时将多个附表数据放在一个List中,每个附表对应一个sheet页