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/poi%e5%a6%82%e4%bd%95%e8%af%bb%e5%8f%96excel%e6%96%87%e4%bb%b6%ef%bc%9fpoi%e8%af%bb%e5%8f%96excel%e4%b9%b1%e7%a0%81%e6%80%8e%e4%b9%88%e8%a7%a3%e5%86%b3/

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

相关推荐

  • 腾讯云幻兽帕鲁服务器32元/月配置如何,幻兽帕鲁服务器租用价格

    腾讯云幻兽帕鲁服务器32元/月即可拥有4核16G配置,适合中小规模联机,但需注意12M带宽在高并发下的负载压力,对于许多想要自建《幻兽帕鲁》服务器的玩家来说,寻找一款性价比极高且稳定的托管方案是首要任务,市面上服务器种类繁多,参数眼花缭乱,但真正能兼顾性能与价格的选项并不多,这款32元/月的配置之所以受到关注……

    2026年6月29日
    1210
  • 苹果手机ID注册为什么连接服务器失败,怎么解决

    苹果手机id注册连接服务器失败,绝大多数情况下不是苹果服务器“罢工”,而是你的网络环境、DNS解析或设备时间设置出了问题,导致设备无法连上Apple的验证服务器,如果你正卡在创建新Apple ID的“验证失败”界面,先别急着反复点重试,下面这套从根源排查的实战方案,按顺序操作,通常10分钟内能解决,苹果id注册……

    2026年10月17日
    400
  • VPS测评,实测体验与数据对比,vps测评哪家强?

    2026年VPS测评结论:若追求极致性价比与亚洲网络优化,推荐选择搭载ARM架构且提供CN2 GIA线路的轻量级实例;若需企业级高可用与全球低延迟,建议选用基于Intel Xeon或AMD EPYC最新一代处理器、支持NVMe SSD且具备多节点BGP互联的高端集群方案,核心硬件架构与性能基准测试在2026年的……

    2026年5月19日
    7300
  • 华为h22h-05怎么进BIOS?,服务器进BIOS按啥键?

    华为服务器h22h-05进入bios的方法很直接:开机自检时连续按Del键,进入启动菜单按F2键,显示器直连状态下操作最稳妥,华为服务器h22h-05怎么进bios:按哪个键、什么时机h22h-05进bios按哪个键:显示器直连时的标准答案华为服务器h22h-05机架式服务器,多数配置基于AMI UEFI固件……

    2026年9月30日
    100
  • Excel除法出现0怎么办?Excel除法遇到0怎么处理

    在 Excel 中进行除法运算时,如果除数为 0,Excel 会返回错误值 #DIV/0!,以下是几种常见的处理方法,根据你的需求选择最合适的一种:使用 IF 函数(最常用)如果你希望在除数为 0 时显示为 0、空值 或 特定提示文字,可以使用 IF 函数,显示为 0:=IF(B2=0, 0, A2/B2)解释……

    2026年7月12日
    20400
  • 服务器配置推荐应该怎么选?哪个配置性价比高?

    服务器配置推荐的核心是让硬件服务于业务,对于面向大众的网站和轻量应用,4核8G内存、40G SSD云服务器是当前性价比最高的起点,后续可根据实际负载弹性调整,服务器配置怎么选?从业务场景入手避开常见误区很多人在选服务器时容易陷入“参数竞赛”,盲目追求高核高内存,结果资源闲置、成本超支,业内专家指出,服务器配置的……

    2026年7月20日
    600
  • 杭州物理机租用该如何选型,哪家性价比更高?

    先明确业务场景,再定配置和带宽,最后对比服务商口碑与售后, 在杭州做互联网业务,物理机依然不可替代,下面从配置、价格、服务商到操作流程,一次说透,为什么在杭州租物理机,而不是直接用云服务器?杭州聚集了大量电商、直播、游戏和金融科技企业,物理机的价值在于性能独占、无超售、硬件可定制,云服务器虽然方便,但IOPS受……

    2026年10月5日
    100
  • maya2026许可服务器怎么填,指定服务器地址设置方法?

    把Maya2024指定许可服务器填成27000@你的服务器IP或27000@你的服务器主机名就行,具体在FlexNet许可面板的“License Server”输入框里改,改完点“Apply”再重启Maya,很多人第一次装网络版Maya,卡在这一步不知道填什么,其实它不复杂,下面把流程和常见坑一次性说清楚,为什……

    2026年10月14日
    000
  • 我的世界ec服务器如何查看ec币,ec币余额查询方法有哪些?

    在《我的世界》EC服务器里,查看EC币的方法很简单:按键盘上的E键打开背包界面,看物品栏上方那一行数字,或者输入服务器公告里给出的查询命令(通常是/money、/balance、/coins之一),两种方式都能让你立刻知道自己兜里有多少EC币,具体视服务器插件配置而定,下面我会把常见情况逐一拆开讲,顺便聊聊那些……

    2026年10月3日
    000
  • 如何正确使用Excel定位公式,有哪些步骤?

    Excel定位公式的核心是使用VLOOKUP、INDEX+MATCH或XLOOKUP实现跨表、跨列的数据精确查找与匹配,根据微软官方文档和行业实践,掌握这三个函数你就能应对绝大多数办公场景下的数据定位需求,Excel定位公式怎么用?三种主流方案全面对比VLOOKUP:最易上手的垂直查找VLOOKUP是Excel……

    2026年7月16日
    3100

发表回复

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