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://test.idctop.com/article/487321.html

赞 (0)
python单词怎么记最快?python常用单词大全
上一篇 2026年7月12日 14:36
简米科技GEO优化靠谱吗?2026年GEO优化公司排名
下一篇 2026年7月12日 14:39

相关推荐

  • 联想服务器设置U盘启动不了怎么办,启动项怎么设置?

    遇到联想服务器无法通过U盘启动时,核心原因通常在于BIOS中U盘引导功能未开启或启动顺序设置错误,按以下步骤逐一排查即可解决,联想服务器U盘启动盘的基本要求与常见误区很多人在尝试U盘启动失败后,第一时间怀疑服务器设置,但相当一部分问题出在U盘启动盘本身,如果你的U盘在其他电脑上能正常启动,但在联想服务器上不行……

    2026年8月11日
    900
  • 个人买短视频SDK怎么优惠?短视频SDK开发费用多少钱

    个人购买短视频SDK优惠:2026年高性价比服务器选型与实测指南创作与分发领域,视频流的稳定性、加载速度以及并发处理能力直接决定了用户体验与留存率,对于个人开发者或小型工作室而言,如何在预算有限的情况下,获取稳定且高性能的服务器资源,是搭建短视频SDK后端服务的关键痛点,2026年,随着AI视频生成与实时渲染技……

    2026年6月30日
    1810
  • 共青城档案库房为何采用人脸识别系统?门禁系统多少钱一套

    在共青城档案库房这一对安全性、环境稳定性及数据完整性要求极高的特殊场景中,传统的管理模式正面临严峻挑战,随着数字化进程的加速,人脸识别系统已成为档案库房门禁管理的核心组件,系统的核心效能不仅取决于前端采集设备的精度,更取决于后端服务器的处理能力、存储架构及并发响应速度,本文将深入测评专为共青城档案库房设施设计的……

    2026年6月17日
    2200
  • ASP.NET开发如何提升效率 | 常用技巧实战指南

    ASP.NET 常用技巧掌握高效的开发技巧是构建健壮、高性能ASP.NET应用的关键,以下核心技巧能显著提升你的开发效率和项目质量: 性能优化:速度即体验缓存策略为王:内存缓存 (IMemoryCache): 缓存频繁访问、计算代价高但变化不频繁的数据(如配置、静态列表),注意设置合理的过期时间(绝对或滑动)和……

    2026年2月11日
    12300
  • ASP.NET数据操作入门,如何实现数据库增删改查?

    ASP.NET入门数据篇的核心在于掌握数据访问、操作和绑定技术,帮助开发者高效构建数据驱动的web应用,作为微软强大的web框架,ASP.NET通过一系列工具简化数据库交互,提升开发效率和可靠性,本篇文章聚焦数据处理的入门知识,涵盖基础概念、核心组件、实践方案和优化技巧,确保你从零起步就能上手实战,ASP.NE……

    2026年2月11日
    11300
  • AI边缘计算怎么使用?边缘计算与云计算的区别

    AI边缘计算的核心用法是将人工智能模型部署在靠近数据源头的终端设备上,实现低延迟、高隐私且节省带宽的实时数据处理,而非依赖云端集中式运算,AI边缘计算怎么使用:从概念到落地场景很多人听到“边缘计算”会觉得高大上,其实它就像是你家里的智能音箱,或者工厂里的智能摄像头,以前,这些设备拍到的视频、听到的声音都要传到千……

    2026年6月5日
    4400
  • 公有云私有云怎么选?企业上云成本与安全性对比

    公有云与私有云如何取舍在数字化转型的深水区,服务器架构的选择不再仅仅是技术参数的堆砌,而是关乎企业数据安全、成本控制与业务扩展性的战略决策,面对公有云(Public Cloud)的弹性便捷与私有云(Private Cloud)的安全可控,许多企业在选型时往往陷入两难,本文将基于真实部署经验与行业数据,深入剖析两……

    2026年6月24日
    1710
  • 公有云主机是什么意思?公有云主机和私有云的区别

    公有云主机是什么意思在数字化转型的浪潮中,云计算已成为企业IT架构的核心基石,许多初次接触云服务的技术人员或企业管理者,往往对“公有云主机”这一基础概念存在认知模糊,究竟什么是公有云主机?它与传统物理服务器有何本质区别?在2026年的技术环境下,选择哪家公有云服务商更具性价比与稳定性?本文将基于深度实测数据,为……

    2026年6月29日
    1400
  • Java SDK中文件夹传输如何创建文件夹?,有哪些方法?

    对于Java开发者而言,通过SDK实现文件夹传输的关键在于先创建目标文件夹结构,再利用流式传输或批量上传API完成数据迁移,这能避免路径混乱与权限错误,本文围绕Java SDK操作远程存储系统(对象存储与传统文件系统)的场景,分析创建文件夹的底层逻辑,提供可直接运行的代码示例,并给出性能优化与成本控制建议,为什……

    2026年8月5日
    400
  • 服务器跳转配置文件怎么设置,集群跳转怎么配置?

    在服务器和集群架构中,配置跳转的核心在于理解重定向类型与负载均衡规则,通过修改Nginx、Apache、HAProxy等软件的配置文件,写入对应的指令即可实现,服务器跳转怎么配置?核心文件与指令解析了解服务器跳转的本质服务器跳转通常指URL重定向或反向代理转发,前者将用户请求从旧地址导向新地址,常用于域名变更……

    2026年8月20日
    500

发表回复

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