Database 可以在Vaadin中下载JPA存储库作为CSV文件吗?
假设我们已经定义了一个实体,并且它连接到一个数据库。现在,我们可以使用存储库访问数据库Database 可以在Vaadin中下载JPA存储库作为CSV文件吗?,database,spring-boot,csv,jpa,vaadin14,Database,Spring Boot,Csv,Jpa,Vaadin14,假设我们已经定义了一个实体,并且它连接到一个数据库。现在,我们可以使用存储库访问数据库 @Autowired private DataLoggRepository dataLoggRepository; 如果我想从数据库中获取所有行并下载它。然后,我可以编写以下代码: List<DataLogg> dataLoggers = dataLoggRepository.findAll(); List dataLoggers=dataLoggRepository.findAll();
@Autowired
private DataLoggRepository dataLoggRepository;
如果我想从数据库中获取所有行并下载它。然后,我可以编写以下代码:
List<DataLogg> dataLoggers = dataLoggRepository.findAll();
List dataLoggers=dataLoggRepository.findAll();
现在,我如何才能以正确的方式在Vaadin中将对象
数据记录器
加载为CSV文件 在这里,您可以看到如何创建下载文件的链接:
Anchor csvLink = new Anchor(new StreamResource("file.csv",
() -> {
String csvString = ...// create the csv
return new ByteArrayInputStream(csvString.getBytes());
}), "Download CSV");
csvLink.getElement().setAttribute("download", true);
要创建CSV,您可以使用各种选项,如OpenCSV或直接从SQL查询创建CSV。以下是一个工作示例
// Download all data
Anchor download = new Anchor(); // Add this to the layout
loggerId.addValueChangeListener(e-> {
String fileName = String.valueOf(loggerId.getValue()) + ".csv";
List<DataLogg> selectedLogger = dataLoggRepository.findByLoggerId(loggerId.getValue());
download.setHref(getStreamResource(fileName, selectedLogger));
});
download.getElement().setAttribute("download",true);
download.add(new Button("Download", new Icon(VaadinIcon.DOWNLOAD_ALT)));
//下载所有数据
锚点下载=新锚点();//将此添加到布局中
loggerId.addValueChangeListener(e->{
字符串文件名=String.valueOf(loggerId.getValue())+“.csv”;
List selectedLogger=dataLoggRepository.findByLoggerId(loggerId.getValue());
下载.setHref(getStreamResource(文件名,selectedLogger));
});
download.getElement().setAttribute(“download”,true);
下载.添加(新按钮(“下载”,新图标(VaadinIcon.download_ALT));
作用
public StreamResource getStreamResource(String filename, List<DataLogg> selectedLogger) {
// Create a large CSV file in a form of StringBuilder and then convert it all to bytes
StringWriter stringWriter = new StringWriter();
stringWriter.write("id, dateTime, DO0, DO1, DO2, DO3, AI0, AI1, AI2, AI3, loggerId, samplingTime\n");
for (int i = 0; i < selectedLogger.size(); ++ i) {
DataLogg dataLogg = selectedLogger.get(i);
String row = dataLogg.getId() + "," +
dataLogg.getDateTime() + "," +
dataLogg.getDO0() + "," +
dataLogg.getDO1() + "," +
dataLogg.getDO2() + "," +
dataLogg.getDO3() + "," +
dataLogg.getAI0() + "," +
dataLogg.getAI1() + "," +
dataLogg.getAI2() + "," +
dataLogg.getAI3() + "," +
dataLogg.getLoggerId() + "," +
dataLogg.getSamplingTime() + "\n";
stringWriter.write(row);
}
// Try to download
try {
byte[] buffer = stringWriter.toString().getBytes("UTF-8");
return new StreamResource(filename, () -> new ByteArrayInputStream(buffer));
} catch (UnsupportedEncodingException e) {
byte[] buffer = new byte[] {0};
return new StreamResource(filename, () -> new ByteArrayInputStream(buffer));
}
}
public StreamResource getStreamResource(字符串文件名,列表选择记录器){
//以StringBuilder的形式创建一个大型CSV文件,然后将其全部转换为字节
StringWriter StringWriter=新StringWriter();
write(“id,dateTime,DO0,DO1,DO2,DO3,AI0,AI1,AI2,AI3,loggerId,samplingTime\n”);
对于(int i=0;inewbytearrayinputstream(缓冲区));
}捕获(不支持的编码异常e){
字节[]缓冲区=新字节[]{0};
返回新的StreamResource(文件名,()->newbytearrayinputstream(缓冲区));
}
}
使用任何CSV生成工具,如OpenCSV@Eklavya非常感谢。OpenCSV与Vaadin一起工作吗?Vaadin是web应用程序框架。我可以使用按钮吗?您的代码与Vaadin14不兼容。您可以将链接设置为按钮样式。但是你不能使用按钮。你说不工作是什么意思?我正在我的应用程序中使用它。您是否收到错误消息?也可以查看我的答案。我可以使用按钮吗?
-是的,您可以使用将显示按钮而不是锚定链接的附加组件。我所有的下载都使用这个。