如何用Kotlin结合Apache Tika实现Excel转带样式的HTML?
解决Apache Tika Excel转HTML(保留样式)的Kotlin实现问题
你当前的代码使用BodyContentHandler只会提取纯文本内容,而命令行的--html参数实际是调用了Tika的XHTML结构化输出处理器,并启用了表格样式渲染逻辑。要复现该行为,需调整以下关键部分:
核心修改点
- 替换
BodyContentHandler为XHTMLContentHandler,用于生成带结构的HTML内容 - 配置解析上下文,启用Excel表格的样式渲染
- 将输出写入文件(而非仅打印纯文本)
完整Kotlin代码示例
import org.apache.tika.metadata.Metadata import org.apache.tika.parser.AutoDetectParser import org.apache.tika.parser.ParseContext import org.apache.tika.sax.XHTMLContentHandler import java.io.File import java.io.FileInputStream import java.io.FileOutputStream import java.io.OutputStreamWriter fun convertExcelToHtml(inputFilePath: String, outputFilePath: String) { val inputStream = FileInputStream(File(inputFilePath)) val outputStream = FileOutputStream(File(outputFilePath)) val writer = OutputStreamWriter(outputStream, "UTF-8") // 使用XHTML处理器生成带结构的HTML内容 val xhtmlHandler = XHTMLContentHandler(writer) val metadata = Metadata() val parseContext = ParseContext() // 自动检测文件类型(适配更多Office格式,也可替换为OOXMLParser仅处理Excel) val parser = AutoDetectParser() parseContext.set(org.apache.tika.parser.microsoft.ooxml.OOXMLParser::class.java, org.apache.tika.parser.microsoft.ooxml.OOXMLParser()) // 执行解析,生成带样式的HTML parser.parse(inputStream, xhtmlHandler, metadata, parseContext) writer.flush() writer.close() inputStream.close() println("HTML文件已生成:$outputFilePath") } fun main() { val inputPath = "./spreadsheet.xlsx" val outputPath = "./output.html" convertExcelToHtml(inputPath, outputPath) }
关键细节说明
- XHTMLContentHandler:这个处理器会将Excel的表格结构(行、列、单元格样式)转换成标准的HTML
<table>、<tr>、<td>等标签,完全对应命令行--html的输出逻辑。 - 样式保留:Tika的OOXML解析器默认会保留单元格的基本样式(如边框、背景色、字体格式),这些样式会被转换为内联CSS或HTML属性,与命令行输出效果一致。
- AutoDetectParser:替代直接使用
OOXMLParser可自动识别不同Office文件格式,扩展性更强;若仅需处理Excel,直接使用OOXMLParser并保留上下文配置即可。
依赖说明
确保项目依赖包含Tika核心包和标准解析包(以Maven为例):
<dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-core</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-parsers-standard-package</artifactId> <version>2.9.2</version> </dependency>
内容的提问来源于stack exchange,提问作者mitch g
相关产品推荐
相关产品推荐

