如何使用Apache POI读取xlsm文件并另存为xlsx文件
使用Apache POI读取.xlsm并另存为.xlsx的实现方案
嘿,作为刚接触Excel和Apache POI的新手,这个需求其实挺常见的,我来一步步给你讲清楚怎么实现,还有完整的可运行代码示例~
一、核心逻辑
.xlsm本质上是带宏的OOXML格式Excel文件,和.xlsx同属于XSSF的处理范畴。我们只需要用XSSFWorkbook加载.xlsm文件,然后直接将其写入为.xlsx格式即可——POI会自动移除宏相关的内容,因为.xlsx本身不支持宏。
二、必要依赖(Maven)
首先确保你的项目中引入了Apache POI的核心和OOXML依赖,这里以常用的5.2.5版本为例:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.5</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.5</version> </dependency>
如果用Gradle的话,对应依赖如下:
implementation 'org.apache.poi:poi:5.2.5' implementation 'org.apache.poi:poi-ooxml:5.2.5'
三、完整代码示例
下面是一个简洁的转换工具类,注释已经写得很详细,新手也能轻松理解:
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class XlsmToXlsxConverter { public static void main(String[] args) { // 替换成你自己的输入输出文件路径 String xlsmFilePath = "your/input/path/sample.xlsm"; String xlsxFilePath = "your/output/path/sample.xlsx"; // 使用try-with-resources自动关闭流,避免资源泄漏 try (FileInputStream inputStream = new FileInputStream(xlsmFilePath); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); FileOutputStream outputStream = new FileOutputStream(xlsxFilePath)) { // 直接写入文件,POI会自动处理宏的移除 workbook.write(outputStream); System.out.println("转换成功!.xlsm已保存为.xlsx格式"); } catch (IOException e) { e.printStackTrace(); System.err.println("转换出错:" + e.getMessage()); } } }
四、关键注意事项
- 宏丢失说明:转换后的.xlsx文件会丢失所有宏,这是.xlsx格式的特性决定的,如果需要保留宏,只能继续使用.xlsm格式。
- 版本兼容性:尽量使用较新的POI版本(比如5.x),旧版本可能对某些.xlsm文件的兼容性较差。
- 大文件优化:如果处理非常大的.xlsm文件,建议使用
SXSSFWorkbook(流式处理)来避免内存溢出,不过对于新手来说,先从XSSFWorkbook入门即可。
内容的提问来源于stack exchange,提问作者Kuan
相关产品推荐
相关产品推荐

