У меня есть синтаксический анализатор SAX, который читает файл XML (в частности, файл .xlsx) и возвращает содержимое в виде списка объектов Row: это примерно так
fun readExcelContent(data: InputStream) {
val pkg = OPCPackage.open(file)
val reader = XSSFReader(pkg)
val sst = reader.sharedStringsTable
val parser = XMLHelper.newXMLReader()
val handler = ExcelSheetHandler(sst)
parser.contentHandler = handler
val sheet = reader.sheetsData.next()
val source = InputSource(sheet)
parser.parse(source)
return handler.content
}
Где ExcelSheetHandler
- это класс, который расширяет DefaultHandler
и заботится о заполнении списка:
class ExcelSheetHandler(sst: SharedStringsTable): DefaultHandler() {
private val content = mutableListOf<Row>()
@Throws(SAXException::class)
override fun endElement(uri: String?, localName: String?, name: String) {
// If it's the end of a content element, add a row to content
}
}
По сути, это небольшая модификация примера модели событий в Apache POI howto .
Мне было интересно, есть ли способ, чтобы readExcelContent
возвращал асинхронный объект, такой как поток, и отправлял строки своему клиенту, как только они были прочитаны, вместо того, чтобы ждать всего файл для обработки.