如何利用NatTable Export API实现选中行或全部行按需导出
实现NatTable选中行优先导出的解决方案
要实现"有选中行则导出选中,无选中则导出全部"的需求,核心是自定义ExportCommandHandler,替换默认的处理器逻辑,加入选中行的判断和数据筛选。下面是具体步骤和代码:
1. 创建自定义的ExportCommandHandler
我们需要继承默认的ExportCommandHandler,重写导出执行逻辑,先检查是否有选中行,再决定导出范围:
import org.eclipse.nebula.widgets.nattable.NatTable; import org.eclipse.nebula.widgets.nattable.command.ExportCommand; import org.eclipse.nebula.widgets.nattable.export.command.ExportCommandHandler; import org.eclipse.nebula.widgets.nattable.layer.CompositeLayer; import org.eclipse.nebula.widgets.nattable.layer.ILayer; import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer; import org.eclipse.nebula.widgets.nattable.util.GUIHelper; import org.eclipse.swt.widgets.Shell; import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry; import org.eclipse.nebula.widgets.nattable.export.DefaultExporter; import java.util.ArrayList; import java.util.List; public class CustomExportCommandHandler extends ExportCommandHandler { private final SelectionLayer selectionLayer; private final ILayer dataLayer; public CustomExportCommandHandler(CompositeLayer compositeLayer, NatTable natTable) { super(compositeLayer); // 从复合层中获取SelectionLayer(确保你的复合层包含该层) this.selectionLayer = (SelectionLayer) compositeLayer.getLayerByClass(SelectionLayer.class); // 获取数据层(根据你的实际层级结构调整,这里假设取底层数据层) this.dataLayer = compositeLayer.getUnderlyingLayerByPosition(0, 0); } @Override protected void executeExport(ExportCommand command) { // 检查是否存在选中行 if (!selectionLayer.getSelectedRowPositions().isEmpty()) { // 获取数据模型层面的选中行索引(而非UI层位置) int[] selectedRowIndexes = selectionLayer.getSelectedRowIndexes(); List<Object> selectedData = new ArrayList<>(); // 从数据层提取选中行的数据 for (int rowIndex : selectedRowIndexes) { // 这里根据你的数据模型调整,示例中取整行数据对象 selectedData.add(dataLayer.getDataValueByPosition(0, rowIndex)); } // 执行选中数据的导出 exportTargetData(selectedData, command.getConfigRegistry(), command.getShell()); } else { // 无选中行时,调用默认的全量导出逻辑 super.executeExport(command); } } // 自定义导出逻辑,复用NatTable的导出工具 private void exportTargetData(List<Object> dataToExport, IConfigRegistry configRegistry, Shell shell) { DefaultExporter exporter = new DefaultExporter(GUIHelper.getDisplay()); // 如果需要导出Excel,可以替换为ExcelExporter // ExcelExporter exporter = new ExcelExporter(); exporter.export(dataToExport, configRegistry, shell); } }
2. 替换原有命令处理器注册
把原来的默认处理器替换成我们自定义的版本:
// 替换原注册代码 compositeLayer.registerCommandHandler(new CustomExportCommandHandler(compositeLayer, natTable)); natTable.addConfiguration(new DefaultExportBinding());
3. 保留原有按钮调用逻辑
你的按钮点击代码不需要修改,因为命令的处理逻辑已经在自定义Handler中完成:
@Override public void widgetSelected(SelectionEvent e) { natTable.doCommand( new ExportCommand( natTable.getConfigRegistry(), natTable.getShell() ) ); }
关键注意事项
- SelectionLayer获取:确保你的CompositeLayer中确实包含SelectionLayer,如果结构不同,可以直接持有SelectionLayer的引用传入自定义Handler。
- 索引转换:一定要使用
getSelectedRowIndexes()获取数据模型层面的索引,而不是UI层的行位置,避免数据错位。 - 导出格式扩展:如果需要导出Excel等格式,只需替换
DefaultExporter为ExcelExporter,逻辑保持一致。
这样修改后,当用户选中行时会自动导出选中内容,无选中时则导出全部数据,完全符合你的需求。
内容的提问来源于stack exchange,提问作者mahesh bhagirath
相关产品推荐
相关产品推荐

