POI如何读取Excel文件?poi读取excel乱码怎么解决

使用 Apache POI 读取 Excel 文件是 Java 开发中非常常见的场景,Apache POI 提供了两套主要的 API 来处理不同版本的 Excel 文件:

  1. HSSF:用于处理旧版 Excel 格式(.xls,Excel 97-2003)。
  2. XSSF:用于处理新版 Excel 格式(.xlsx,Excel 2007 及以后)。

为了兼容两种格式,通常建议使用 WorkbookFactory 自动识别文件类型。

打开.csv文件或者Excel表格后文字变成乱码怎么办
加载中
打开.csv文件或者Excel表格后文字变成乱码怎么办

✅ 推荐方式:使用 WorkbookFactory 自动识别格式

以下是一个完整的示例,展示如何读取 .xls.xlsx 文件,并遍历所有单元格数据。

添加 Maven 依赖

<dependencies>
    <!-- Apache POI 核心库 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>5.2.3</version> <!-- 请使用最新稳定版 -->
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.3</version>
    </dependency>
</dependencies>

Java 代码示例

import org.apache.poi.ss.usermodel.;
import org.apache.poi.ss.util.NumberToTextConverter;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ExcelReader {
    public static void main(String[] args) {
        String filePath = "example.xlsx"; // 或 example.xls
        try (FileInputStream fis = new FileInputStream(new File(filePath));
             Workb

POI如何读取Excel文件?poi读取excel乱码怎么解决

ook workbook = WorkbookFactory.create(fis)) { // 获取第一个工作表 Sheet sheet = workbook.getSheetAt(0); // 遍历每一行 for (Row row : sheet) { // 遍历每一列 for (Cell cell : row) { String cellValue = getCellStringValue(cell); System.out.print(cellValue + "t"); } System.out.println(); // 换行 } } catch (IOException e) { e.printStackTrace(); } } / 将 Cell 转换为 String,处理不同数据类型 / private static String getCellStringValue(Cell cell) { if (cell == null) { return ""; } CellType cellType = cell.getCellType(); if (cellType == CellType.STRING) { return cell.getStringCellValue(); } else if (cellType == CellType.NUMERIC) { // 判断是否为日期类型 if (DateUtil.isCellDateFormatted(cell)) { return cell.getDateCellValue().toString(); } else { // 避免科学计数法,转为整数或保留小数 double numericValue = cell.getNumericCellValue(); // 如果小数部分为0,则转为整数显示 if (numericValue == Math.floor(numericValue)) { return String.valueOf((long) numericValue); } else { return String.valueOf(numericValue); } } } else if (cellType == CellType.BOOLEAN) { return String.valueOf(cell.getBooleanCellValue()); } else if (cellType == CellType.FORMULA) { try { // 尝试获取公式计算后的数值 return String.valueOf(cell.getNumericCellValue()); } catch (IllegalStateException e) { // 如果公式返回字符串,则获取字符串值 return cell.getStringCellValue(); } } else if (cellType == CellType.BLANK) { return ""; } else { return ""; } } }

POI如何读取Excel文件?poi读取excel乱码怎么解决


🔍 关键说明

为什么用 WorkbookFactory.create()

  • 它会自动检测文件扩展名和内容,决定使用 HSSFWorkbook(.xls)还是 XSSFWorkbook(.xlsx)。
  • 你不需要手动判断文件类型,代码更简洁、健壮。

单元格类型处理

Excel 单元格可能有多种类型:

  • STRING:文本
  • NUMERIC:数字(包括日期和整数)
  • BOOLEAN:布尔值
  • FORMULA:公式
  • BLANK:空单元格

getCellStringValue() 方法中,我们对每种类型做了兼容处理,特别是:

  • 日期判断:使用 DateUtil.isCellDateFormatted() 判断数值型单元格是否为日期。
  • 数字格式化:避免 0 显示为 0,而是显示为 1

性能考虑(大数据量)

Excel 文件非常大(如超过 10 万行),XSSF(.xlsx) 会占用大量内存,可能导致 OutOfMemoryError

解决方案:使用 SXSSF(流式读取)

import org.apache.poi.xssf.streaming.SXSSFWorkbook;
// 注意:SXSSFWorkbook 主要用于写入,读取大文件建议使用 Apache POI 的 Event Model (SAX)
// 或者使用第三方库如 EasyExcel(推荐)

💡 强烈建议:对于生产环境的大文件读取,推荐使用 Alibaba EasyExcel,它基于 POI 封装,内存占用极低,API 更简洁。


🚀 替代方案:使用 EasyExcel(推荐用于生产环境)

POI如何读取Excel文件?poi读取excel乱码怎么解决

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.3.2</version>
</dependency>
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import java.util.List;
public class EasyExcelReader {
    public static void main(String[] args) {
        String fileName = "example.xlsx";
        // 读取数据
        EasyExcel.read(fileName, DataModel.class, new ReadListener<DataModel>() {
            @Override
            public void invoke(DataModel data, AnalysisContext context) {
                System.out.println(data.getName() + " - " + data.getAge());
            }
            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {
                System.out.println("所有数据读取完成!");
            }
        }).sheet().doRead();
    }
}
// 数据模型
class DataModel {
    private String name;
    private Integer age;
    // getter 和 setter
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public Integer getAge() { return age; }
    public void setAge(Integer age) { this.age = age; }
}

场景 推荐方案
小文件、简单需求、学习用途 Apache POI(WorkbookFactory
大文件、高性能、生产环境 Alibaba EasyExcel
需要解析复杂公式或样式 Apache POI

如有具体需求(如只读某列、跳过表头、处理合并单元格等),可以进一步说明,我可以提供针对性代码。

首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/487321.html

(0)
python单词怎么记最快?python常用单词大全
上一篇 2026年7月12日 14:36
下一篇 2026年5月25日 10:15

相关推荐

  • Excel表格内容如何均匀分布?excel表格内容怎么均匀分布

    在Excel中实现均匀分布的核心方法是使用“随机函数”结合“排序”或“条件格式”,其中最常用且高效的技巧是利用辅助列生成随机数后排序,或直接使用条件格式中的“色阶”功能进行视觉上的均匀分布,很多职场人在处理数据时,常遇到需要将一组数值在视觉上或逻辑上打乱、平均分配的情况,老师想随机分配学生座位,或者财务想随机抽……

    2026年7月8日
    7500
  • AIoT芯片最新消息有哪些?2026年AIoT芯片行业发展趋势如何

    AIoT芯片行业正处于从“单点智能”向“泛在智能”跨越的关键转折期,技术演进的核心结论是:端侧AI算力爆发与能效比极致优化已成为竞争主旋律,随着大模型技术下沉,传统的物联网芯片正加速蜕变为具备高性能推理能力的智能芯片,市场格局正在重塑,“存算一体”架构与先进封装技术成为打破性能瓶颈的关键钥匙,市场格局重塑:端侧……

    2026年3月12日
    17000
  • 广电网络能获得公网IP吗?广电宽带怎么申请公网IP

    广电网络完全能够获得公网IP,但需满足特定业务场景与申请条件,普通家庭宽带默认仍以私网IP为主,广电网络与公网IP的现状解析广电网络的IP地址资源池随着2024年全国广电网络整合与“全国一网”体系全面落地,中国广电作为第四大基础电信运营商,已从工信部获取了规模可观的IPv4与IPv6地址段,面对庞大的家庭用户基……

    2026年4月24日
    6700
  • AIoT时代有哪些新趋势?未来智能家居发展怎么样

    AIoT正从简单的设备连接迈向具备自主决策能力的“智能体”协同,其核心趋势在于边缘计算与生成式AI的深度融合,让万物不仅“在线”,更具备“思考”与“行动”的能力,过去几年,我们谈论物联网时,更多关注的是如何让灯泡亮起来、让空调动起来,但站在2026年的视角,这种单向的控制指令已显得过于初级,现在的AIoT(人工……

    2026年6月12日
    3300
  • VPS测评,实测体验,VPS测评推荐哪个?

    2026年VPS测评结论:对于追求极致性价比与低延迟的国内用户,推荐选择搭载ARM架构的轻量级VPS;若需部署高并发业务或海外加速,则应优先考虑具备BGP多线接入的高性能Intel/AMD实例,具体选择需严格依据业务场景与预算而定, 2026年VPS市场核心趋势与选型逻辑随着云计算技术的下沉与边缘计算的普及,V……

    2026年5月16日
    6200
  • 如何操作aspx页面实现图片上传功能?详细步骤与技巧揭秘!

    ASPX图片上传核心实现与安全指南ASPX页面中实现图片上传的核心是利用 FileUpload 服务器控件配合后端代码处理HTTP文件流,并将文件安全地保存到服务器指定位置,以下是关键步骤和最佳实践:前端准备:FileUpload控件与表单设置放置 FileUpload 控件:在您的 .aspx 页面中,拖放一……

    2026年2月4日
    12300
  • ai人工智能发展趋势如何?未来人工智能有哪些商机?

    AI人工智能发展趋势正从单一的技术爆发期迈向深度的产业融合期,未来三到五年内,“应用深化”与“垂直落地”将成为核心主旋律,技术不再是空中楼阁,而是转变为实实在在的生产力工具,企业若不能构建基于AI的核心竞争力,将在数字化浪潮中面临淘汰风险,生成式AI的普及只是开始,真正的变革在于AI如何重构业务流程与决策逻辑……

    2026年3月6日
    11600
  • SoftShellWebVPS测评,美国、荷兰3.5美元/月实测数据与性能表现,SoftShellWebVPS测评怎么样

    SoftShellWebVPS在2026年仍具备极高的性价比,其美国与荷兰节点在3.5美元/月价位段展现出优于同价位竞品的网络稳定性与I/O性能,适合对延迟敏感但预算有限的建站及开发用户,核心性能实测:延迟与吞吐量的真实表现在2026年的VPS市场中,3.5美元/月属于入门级竞争红海,SoftShellWeb凭……

    2026年5月17日
    4400
  • ajax如何对数据库增删改查?ajax操作数据库实例教程

    通过Ajax实现数据库增删改查,核心在于利用JavaScript的XMLHttpRequest或Fetch API异步发送HTTP请求,配合后端接口处理JSON数据,从而在不刷新页面的情况下完成数据交互,这种技术架构彻底改变了传统Web应用的用户体验,将原本需要整页重载的操作转化为毫秒级的局部刷新,对于现代前端……

    2026年5月30日
    4200
  • 广电网络安全如何加固?广电网络信息安全防护措施有哪些

    面对2026年智能化演进的广电网络,唯有构建“云网边端”一体化的零信任动态防御体系,深度融合国密算法与AI态势感知,方能彻底阻断黑产攻击,守住播控与数据双安全生命线,广电网络安全加固的核心痛点与破局逻辑传统边界防御为何频频失守?广电网络早已告别封闭的孤岛时代,随着5G广播、物联网终端的大规模接入,传统“外壳坚硬……

    2026年4月24日
    5700

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注