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
简米科技GEO优化靠谱吗?2026年GEO优化公司排名
下一篇 2026年7月12日 14:39

相关推荐

  • AIPL模型报价是多少?AIPL模型收费标准详解

    AIPL模型定价并非单一维度的成本核算,而是基于数据资产价值、技术实现难度与业务转化预期的综合投资回报模型,企业若仅以“软件授权费”或“服务人工费”来衡量AIPL模型报价,极易陷入低价低效的误区,核心结论在于:合理的报价体系必须反映从公域流量曝光(Awareness)到忠诚用户运营(Loyalty)的全链路数据……

    2026年3月9日
    12300
  • 服务器MySQL数据库访问权限怎么设置,MySQL远程连接怎么开启?

    设置MySQL数据库访问权限的核心在于通过GRANT语句为指定用户在特定主机(Host)上分配相应的数据库操作权限,并执行FLUSH PRIVILEGES命令使配置立即生效,MySQL权限管理的基础逻辑在深入操作之前,必须理解MySQL权限系统的底层运行机制,MySQL的权限并不是简单的“能进”或“不能进”,而……

    程序编程 2026年7月13日
    17100
  • AI剪辑软件免费试用吗?哪个AI剪辑工具好用

    AI视频剪辑技术已从概念验证走向深度应用,正在重塑内容生产的工作流,核心结论:AI剪辑工具通过自动化处理繁琐的重复性工作,能显著提升视频制作效率,但选择合适的工具必须通过实际AI剪辑试用,来验证其算法与特定创作需求的匹配度,从而构建“人机协作”的高效生产模式,需求爆发的当下,创作者面临着时间紧、任务重的双重压力……

    2026年2月25日
    16800
  • ReCloud主机美国BGP评测延迟高吗?ReCloud主机稳定性怎么样

    ReCloud洛杉矶BGP节点在1C2G配置下,国内直连延迟稳定在80-120ms区间,丢包率极低,适合对网络稳定性有基础要求的轻量级应用,但流媒体解锁能力有限,ReCloud主机测评:美西BGP 1C2G性能实测在2026年的海外VPS市场中,洛杉矶BGP线路依然是许多国内用户的首选,主要得益于其相对成熟的基……

    2026年6月18日
    6900
  • 如何在ASP.NET中调用系统设置字体文本框? – ASP.NET开发实战技巧

    在ASP.NET应用程序中实现文本框控件自动使用用户操作系统设置的默认字体,需深入理解Windows系统参数调用与Web控件渲染机制的结合,以下是专业级实现方案:// 适用于ASP.NET WebForms的定制文本框控件using System.Web.UI.WebControls;using System……

    2026年2月7日
    11100
  • ASP.NET如何替换?推荐最佳替代框架方案

    ASP.NET替换的核心方案在于拥抱现代化的、跨平台、高性能的开源技术栈,最主流且官方推荐的路径是升级/迁移到.NET Core及其后续统一的.NET平台(.NET 5/6/7/8+),这是微软官方支持且生态兼容性最佳的方案,对于特定场景,Node.js (Express.js, NestJS)、Python……

    2026年2月11日
    12900
  • 如何进行专业的服务器网络监测,服务器网络延迟高怎么办?

    服务器网络监测是通过实时采集流量、延迟、丢包率等关键指标,确保业务连续性的技术手段,其核心在于构建从物理链路到应用层的全路径可视化体系,服务器网络监测的核心指标与逻辑网络监测并非简单的“通断检查”,而是一套完整的量化分析体系,要实现高效的监测,必须将关注点从单一的“是否在线”转移到“质量如何”上,关键监测维度延……

    2026年7月13日
    1300
  • 广州高宽带cn2域名解析怎么选?CN2服务器域名解析配置教程

    2026年广州地区企业若要实现极速稳定的网络体验,选择广州高宽带cn2域名解析是破局关键,其通过CN2 GIA优质骨干网与智能DNS调度的深度融合,彻底解决南方跨境及高频业务的高延迟与丢包痛点,为何广州高宽带cn2域名解析成为2026年企业刚需粤港澳大湾区网络枢纽的底层逻辑广州作为亚太互联网交换中心,常规BGP……

    2026年4月27日
    5500
  • 服务器CPU进程重复怎么办,服务器CPU进程重复解决方法

    服务器CPU进程重复是导致系统资源耗尽、服务宕机以及业务中断的核心诱因,必须通过“识别-止损-根除”的三步走策略进行紧急干预与长效治理,当服务器响应缓慢或CPU利用率飙升至100%时,往往并非单纯的业务高峰,而是由于进程管理失控引发的资源争夺战,解决这一问题的核心在于精准定位重复进程的父进程,区分正常的多线程并……

    2026年4月10日
    7600
  • Excel数据比例怎么算?Excel表格百分比公式

    在Excel中处理数据比例,核心在于灵活运用“百分比格式”、“条件格式”以及“数据透视表”三大工具,其中数据透视表是处理复杂多维比例分析最高效的方案,很多职场人在面对一堆杂乱的数据时,第一反应往往是手动计算,这不仅效率低下,还容易出错,Excel内置的函数和可视化工具已经足够强大,只要掌握正确的逻辑,就能让数据……

    2026年7月10日
    14400

发表回复

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