字符串输出文件
fun renderFile(fileName: String, data: String): ResponseEntity<InputStreamResource> {
return ResponseEntity.ok()
.headers(fileHeaders(fileName))
.contentLength(data.length.toLong())
.body(InputStreamResource(data.byteInputStream()))
}
private fun fileHeaders(fileName: String): HttpHeaders {
val headers = HttpHeaders()
headers.add("Cache-Control", "no-cache, no-store, must-revalidate")
headers.add("Content-Disposition", "attachment; filename=\"$fileName\"")
headers.add("Pragma", "no-cache")
headers.add("Expires", "0")
return headers
}
输出 excel 文件
当手动拼 csv 文件字符串,再通过上面的方法输出的文件在 windows 上会乱码,输出的文件是给编辑的,要保证在 Excel 中打开没有问题才行,最简单可靠的办法就是引入专门的 csv lib 包来处理了
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.5</version>
</dependency>
代码如下
//返回文件路径
fun statistic(fileName: String): String {
val filePath = "${System.getProperty("java.io.tmpdir")}/$fileName"
val writer = FileWriter(filePath)
//这个是写 utf8 bom 文件的头,不加的话 excel 打开文件的中文就是乱码
writer.write(String(byteArrayOf(0xEF.toByte(), 0xBB.toByte(), 0xBF.toByte())))
val csvPrinter = CSVFormat.EXCEL.withHeader("公众号", "数据量", "有效数据").print(writer)
val infoMap = wechatDao.countByAuthor().map { it.author to it.num }.toMap()
val importInfoMap = wechatDao.countImportedByAuthor().map { it.author to it.num }.toMap()
infoMap.entries.forEach({ csvPrinter.printRecord(it.key, it.value, importInfoMap[it.key] ?: 0) })
csvPrinter.printRecord("----- 统计 -----", infoMap.values.sum(), importInfoMap.values.sum())
writer.flush()
writer.close()
log.info("微信统计写入文件 $filePath")
return filePath
}
Controller 中调用
@GetMapping("/wechat/statistic")
fun statistic(): ResponseEntity<InputStreamResource> {
val dataStr = LocalDate.now().toString()
val fileName = "wechat_$dataStr.csv"
val filePath = wechatService.statistic(fileName)
return ResponseEntity.ok()
.headers(fileHeaders(fileName))
.body(InputStreamResource(FileInputStream(filePath)))
}
kotlin 真是越用越觉得爽
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于