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

相关推荐

  • AI科技是什么,人工智能未来发展趋势如何?

    AI科技正在经历从感知智能向认知智能的跨越式发展,其核心价值已不再局限于单一任务的自动化处理,而是通过深度学习与大模型技术重构产业逻辑,实现生产力的指数级跃升,当前,这一技术浪潮正推动全球进入“人机协作”的新纪元,企业若想在数字化竞争中占据高地,必须将智能化从辅助工具升级为核心战略资产,构建以数据为燃料、算法为……

    2026年2月22日
    12100
  • AJAX与Mysql如何交互?前后端数据异步传输原理

    AJAX结合MySQL能够实现页面局部刷新,在保持用户交互流畅的同时大幅降低服务器负载,是构建现代动态Web应用的核心技术组合,在传统Web开发模式中,每一次用户操作往往导致整个页面的重新加载,这种体验不仅割裂了用户的注意力,还造成了大量的带宽浪费,AJAX(Asynchronous JavaScript an……

    2026年6月2日
    3300
  • AI应用管理双12活动怎么样,怎么买最划算?

    AI应用管理双12活动不仅是企业采购技术服务的折扣节点,更是重构企业AI资产、优化算力成本与提升模型效能的战略窗口期,对于技术决策者而言,核心在于利用这一时间窗口,通过系统性的管理策略,将分散的AI工具转化为统一的生产力,从而在降低总体拥有成本(TCO)的同时,实现业务价值的最大化, 战略背景:从“粗放采购”转……

    2026年2月28日
    12600
  • 公司网络慢怎么回事?宽带网速慢怎么解决

    公司网络慢怎么回事许多企业在日常运营中常遇到“公司网络慢怎么回事”的困惑,尤其是当业务依赖云端协作、视频会议或大数据传输时,很多时候,问题根源并非仅仅是宽带带宽不足,而是服务器性能瓶颈、网络架构不合理或外部节点延迟过高,为了彻底解决这一痛点,我们需要从底层基础设施入手,深入测评当前市场上主流的云服务器产品,并对……

    2026年6月23日
    1800
  • 公安大数据分析系统怎么用?公安大数据分析系统有哪些功能

    在数字化转型的浪潮中,公共安全领域的信息化建设正迈向深水区,公安大数据分析系统作为核心基础设施,其底层算力支撑直接决定了情报研判的实时性、准确性与安全性,对于负责此类关键业务的技术负责人而言,选择一款能够承载海量数据并发、满足极高安全合规要求且具备弹性扩展能力的服务器,是构建高效智慧警务体系的基石,本次测评聚焦……

    2026年6月26日
    3100
  • 订单业务中断直接产生经济损失怎么办?,订单中断经济损失

    订单业务中断的直接经济损失体现在订单丢失、客户流失和赔偿风险,每分钟损失可达数千元,且恢复成本远超预期,业务中断的经济账:停机一分钟亏多少?订单系统是电商、金融和SaaS行业的核心收银台,一旦它停止服务,每一秒都在流失真金白银,根据行业白皮书统计,多数企业经历一次重大中断后,损失相当于年收入的相当比例,还不包括……

    2026年7月25日
    700
  • 如何在Excel中制作斜线表头并打字?excel表格斜线怎么打文字

    在Excel中实现斜表头打字,核心方法是利用“Alt+Enter”强制换行配合单元格右对齐,或通过“绘图”工具绘制斜线并添加文本框,前者高效通用,后者灵活美观,为什么我们需要斜表格打字?在日常办公场景中,Excel不仅仅是数据的仓库,更是逻辑的展示板,当我们需要在一个单元格内同时表达“行”和“列”的双重含义时……

    2026年7月5日
    18900
  • ASP.NET如何捕获异常?最佳实践详解

    ASP.NET异常处理的核心在于建立一套健壮、分层的捕获、记录、处理和反馈机制,确保应用程序的稳定性和可维护性,同时为开发者和用户提供有价值的诊断信息, 异常捕获的基石:全局与局部机制ASP.NET 提供了不同层次的异常捕获点,理解其作用域是有效处理的基础,Page_Error 事件 (Web Forms):捕……

    程序开发 2026年2月11日
    13330
  • 服务器配置和费用由哪些部分组成,怎么选更划算?

    服务器费用不是一口价,而是由CPU、内存、硬盘、带宽、IP和机房等级逐项叠加出来的,配置越高费用越高,关键看你拿它跑什么业务,很多朋友上来就问“服务器多少钱一年”,这个问题的前提其实是“我该买什么配置”,把配置组成和费用组成拆开看,你就能算出自己的合理预算,避免被销售带偏,服务器硬件配置的五大核心组件服务器本质……

    2026年8月20日
    600
  • 服务器ip地址怎么找回,服务器IP地址忘记了怎么查

    服务器IP地址丢失或遗忘后,找回的核心途径主要依赖于服务器服务商提供的控制面板、本地命令行工具查询、历史登录记录排查以及服务商技术支持协助,登录云服务商或主机提供商的官方管理控制台是最直接、最权威且成功率最高的方法,能够获取到包括公网IP、内网IP在内的所有网络配置信息, 通过服务商管理控制台直接查看(最推荐方……

    2026年4月4日
    9500

发表回复

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