Vaadin中FileDownloader如何导出DataProvider过滤后的CSV数据?
解决Vaadin过滤后CSV下载仍包含全量数据的问题
我看了你的代码,问题出在获取数据的方式上——你在createCsvResource()里用了dataProvider.items.toList(),但这个items属性返回的是原始的未过滤数据集合,完全没考虑你后来添加的过滤条件!
DataProvider的过滤逻辑是在内部处理的,要拿到过滤后的结果,你需要用dataProvider.fetch(Query())方法,它会返回经过所有过滤、排序处理后的数据流。
下面是修改后的关键代码:
修正createCsvResource()方法
private fun createCsvResource(): StreamResource { return StreamResource(StreamResource.StreamSource { // 用fetch(Query())获取过滤后的数据流,再转成列表 val filteredTransactions = dataProvider.fetch(Query()).toList() val csv = filteredTransactions.toCsv() try { return@StreamSource csv.byteInputStream() } catch (e: IOException) { e.printStackTrace() return@StreamSource null } }, "financial_transactions.csv") }
额外的小优化
另外,你的setDataProvider()方法可以稍微简化一下,不用每次都重新设置DataProvider,直接更新过滤条件就行:
private fun setDataProvider() { dataProvider.clearFilters() yearField.value?.let { selectedYear -> dataProvider.setFilterByValue(FinancialTransaction::fiscalYear, selectedYear) } }
这样修改后,当你点击下载按钮时,createCsvResource()会获取到当前DataProvider中已经过滤后的数据集,生成的CSV就会和Grid里显示的内容一致了。
内容的提问来源于stack exchange,提问作者Johan Vergeer
相关产品推荐
相关产品推荐

