如何将scala.io.BufferedSource转换为java.io.File适配Apache POI调用?
解决方案
针对你的场景提供两种可直接使用的实现方案:
方案1:仅本地开发/资源未打入Jar包时使用
如果你的项目仅在本地运行,资源没有被封装到Jar包内,可以直接通过类加载器获取资源URI构造File对象,无需硬编码源码路径:
import java.io.File val resourceUri = getClass.getResource("/resource.file").toURI val targetFile = new File(resourceUri) val workbook = WorkbookFactory.create(targetFile)
注意:该方案不支持Jar包运行场景,Jar包内的资源无法被映射为文件系统的File对象,会抛出参数非法异常
方案2:全场景通用(优先推荐)
WorkbookFactory本身提供了接收InputStream类型的重载方法,不需要强制传入File对象,该方案在本地开发、Jar包运行场景下都可以正常工作:
直接通过类加载器获取输入流
import org.apache.poi.ss.usermodel.WorkbookFactory import java.io.InputStream val inputStream: InputStream = getClass.getResourceAsStream("/resource.file") val workbook = WorkbookFactory.create(inputStream) // 业务处理完成后手动关闭资源 inputStream.close() workbook.close()
从已有的scala.io.BufferedSource转换
如果你已经通过Source.fromResource拿到了缓冲源对象,可以直接获取其底层输入流传入:
import scala.io.Source val source = Source.fromResource("resource.file") val workbook = WorkbookFactory.create(source.inputStream()) // 处理完成后关闭资源 source.close() workbook.close()
额外提示
- 如果资源存放在resources的子目录下,路径需要对应调整,例如
resources/excel/data.xlsx对应的路径为/excel/data.xlsx - 可以使用Scala的
Using工具自动管理资源,避免手动关闭遗漏:
import scala.util.Using Using(getClass.getResourceAsStream("/resource.file")) { stream => val workbook = WorkbookFactory.create(stream) // 此处编写Excel处理逻辑 }.get
内容的提问来源于stack exchange,提问作者Zhao Li
相关产品推荐
相关产品推荐

