首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么当我从xlsx读到java时,日期字段会乱七八糟?

当从Excel(.xlsx)文件读取数据到Java程序时,日期字段可能会出现乱七八糟的情况,这通常是由于以下几个原因造成的:

原因分析:

  1. 日期格式不一致
    • Excel中的日期可能使用了特定的区域设置格式,而Java默认的日期格式与之不匹配。
  • 时区问题
    • Excel和Java程序可能使用了不同的时区设置,导致日期在转换时出现偏差。
  • 数据类型不匹配
    • Excel中的日期可能被存储为文本或其他非日期类型,而不是真正的日期类型。
  • 库的解析问题
    • 使用的Java库(如Apache POI)在解析Excel文件时可能存在bug或不完善之处。

解决方案:

1. 确保日期格式一致

在读取Excel文件之前,可以尝试设置Java程序的区域设置为与Excel文件相同的区域设置。例如:

代码语言:txt
复制
Locale.setDefault(Locale.US); // 假设Excel文件使用的是美国区域设置

2. 处理时区问题

确保Java程序和Excel文件使用相同的时区。可以通过以下方式设置时区:

代码语言:txt
复制
TimeZone.setDefault(TimeZone.getTimeZone("GMT")); // 设置为格林威治标准时间

3. 检查数据类型

在读取Excel文件时,检查每个单元格的数据类型,并根据需要进行转换。例如,使用Apache POI读取日期:

代码语言:txt
复制
Cell cell = row.getCell(cellIndex);
if (cell.getCellType() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)) {
    Date date = cell.getDateCellValue();
    // 进行后续处理
}

4. 使用合适的库和版本

确保使用的Apache POI库是最新版本,因为新版本通常会修复旧版本中的bug。可以在Maven项目中添加以下依赖:

代码语言:txt
复制
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version> <!-- 使用最新版本 -->
</dependency>

示例代码:

以下是一个完整的示例代码,展示了如何从Excel文件中读取日期字段并进行处理:

代码语言:txt
复制
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class ExcelDateReader {
    public static void main(String[] args) {
        try (FileInputStream file = new FileInputStream("path/to/your/file.xlsx");
             Workbook workbook = new XSSFWorkbook(file)) {

            Sheet sheet = workbook.getSheetAt(0);
            for (Row row : sheet) {
                for (Cell cell : row) {
                    if (cell.getCellType() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)) {
                        Date date = cell.getDateCellValue();
                        System.out.println("Date: " + date);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

参考链接:

通过以上方法,可以有效解决从Excel读取日期字段时出现的乱七八糟的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 【技术创作101训练营】机器学习的有“米”之炊-数据处理

    俗话说“巧妇难为无米之炊”,无论是学会了决策树模型,还是线性回归模型,是SVM还是TensorFlow,我拿一堆乱七八糟的如我Windows中D盘里那个随便一个文件夹下存的资料,让它们几位活动活动筋骨,...不用看都知道,它们还给我一堆乱七八糟。...做的思维导图(工具:百度脑图,导图优势:随时可根据知识的积累,让它变广,变深): python数据分析 (1).png 一:读取数据 首先从准备数据开始,无论我拥有了多少个文件夹的多少种数据,我首先要把它读到我的电脑里...,让我能看到它们,才有可能操作它们,这里我展示了几种不同格式数据的读取方法:csv,json,xlsx,其中有用open打开,有用pandas的read打开,有用numpy的loadtxt打开,它们都是方法...01数据加载.png 二:了解数据及拼接数据 为什么把它们放在一起讲呢?

    43700

    Java使用 POI 操作Excel

    而POI是Apache 的开源项目,由Java编写的跨平台 Java API,可操作 Microsoft Office。借助POI,可以方便的生成数据报表,数据批量上传,数据备份等工作。...在实例化 SXSSFWork 这个对象,可以指定在内存中所产生的 POI 导出相关对象的数量(默认 100),一旦内存中的对象的个数达到这个指定值,就将内存中的这些对象的内容写入到磁盘中(XML 的文件格式...),就可以将这些对象内存中销毁,以后只要达到这个值,就会以类似的处理方式处理,直至 Excel 导出完成。...事件分为: 读到行的开始 读到行的结束 读到一行的内容 优势:执行解析效率高,因为它是按照事件触发的。一次只读一行数据 弊端:不利于保存,更新和删除。..."); } } 测试,可以通过 Jvisualvm 来监视程序的运行情况,包括 CUP,垃圾回收,内存的分配和使用情况(Jvisualvm位于JAVA_HOME/bin目录下,双击打开即可

    6K31

    保姆级文件导入导出功能开发{POI || EasyExcel},还看不懂,你来咬我啊

    开发并且免费开源的一套Java Api....xls的压缩率高,也就是相同数据量下,.xlsx的文件小很多。...看完他的运行速度之后我们来看看,为什么HSSFWorkbook能够这么快就能将数据写入到文件中呢....SXSSFWorkbook的思路是这样,他一开始也是向内存里面写入数据,但是他有一个临界值默认是100.超过这个数据量之后的数据,他自动在磁盘上创建一个临时文件,将数据写入该文件中,之后当内存中的数据写完之后就直接临时文件中将数据拷贝过来...其实这三种概念的理念差不多,基本上主要都是用来处理如果出现缺失的单元格情况,可能影响后续数据的读写操作。

    1.8K30

    EasyExcel实现Excel文件导入

    1 EasyExcel简介 EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。...数字标题 小明 2020-05-05 10:10:10 888.88 数据模板 注意: Java类中的属性字段顺序和Excel中的表头字段顺序一致, 可以不写@ExcelProperty @NoArgsConstructor...,严重的磁盘爆掉 excelReader.finish(); } 2.2.3 格式化Excel中的数据格式 要读取的源数据, 日期格式是yyyy年MM月dd日 HHmm分ss秒, 数字带小数点...", index = 1) // 格式化日期类型数据 @DateTimeFormat(value = "yyyy年MM月dd日 HHmm分ss秒") private Date hireDate...解决方案: 通过泛型指定数据模型类型, 针对不同类型的数据模型只需要定义一个监听器即可; 使用jdk8新特性中的函数式接口, 将数据处理监听器中剥离出去, 进行解耦.

    1.8K30

    C#实战:使用ExcelKit实现海量数据导出

    ,如Name、Age; 读取不指定Code默认使用字段名 ● Desc:字段描述[必指定],对应Excel列头中的文本,如 姓名、地址, ● AllowNull:字段是否允许为空,一般用于读取 ● Converter...:转换器[导出],组件中提供了常用的转换器,如需自定义,则继承自IExportConverter并实现方法 ● ConverterParam:转换器辅助参数[导出],导出使用,如日期格式化导出,导出保留的小数位等...;如需自定义Converter,则ConverterParam完全放置到Convert方法的第二个参数中 ● Sort:字段顺序[导出],导出和读取都可能用到 ● Width:列宽[导出],指定Excel...可空,true为男,false为女,为空则导出也为空,默认不指定ConverterParam的话,导出后显示为:是 否;自定义导出文字,用|区分,左边文字为字段等于true导出的值,右边为字段等于false...导出的值) ● DateTimeFmtConverter:(日期格式化Converter,如需自定义日期格式,需指定ConverterParam) ● DecimalPointDigitConverter

    66170

    Apache POI与easyExcel:Excel文件导入导出的技术深度分析

    它提供了对Excel文件读写操作的全面支持,在处理Excel文件,POI通过HSSF和XSSF两个子项目分别支持.xls和.xlsx格式。...这种处理方式在处理小型文件非常有效,因为它允许开发者以任意方式访问文件内容。然而,随着文件大小的增加,内存消耗也急剧增长,这可能导致性能下降甚至内存溢出。...导出Excel文件,Apache POI同样需要将所有数据加载到内存中,然后一次性写入文件。这种方式在处理大量数据可能变得非常缓慢,并且需要大量的内存资源。...; import java.util.List; // 数据模型类,使用注解标识表头和字段映射关系 public class DataModel { // 表头名称与字段的映射...然而,在处理大型文件,它可能遇到性能问题和内存消耗过高的情况。相比之下,easyExcel则针对大型文件的处理进行了优化,提供了更高的性能和更低的内存消耗。

    1.1K20

    PHPExcel对于Excel中日期和时间类型的处理

    一、Excel中的日期和时间类型 Excel中的日期存储的是数值类型,计算的是1900年1月1日到现在的数值。例如2008-12-31实际上存储的是39813。...Excel中的时间是一个0到0.99999999之间的小数值,表示00:00:00(12:00:00 AM)到23:59:59(11:59:59 PM)之间的时间。...Excel 2007版本中提供了24种默认的日期类型格式,其中带星号的两个和系统时区绑定(这样在不同时区的电脑之间传递文件,时间会发生变化)其他的则不会根据时区发生变化。时间则提供了11种格式。...::FORMAT_DATE_XLSX17, PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX22); foreach ($phpexcel_date_format...至此,我们基本上可以自如的处理Excel的日期字段的读取和写入了。

    3.1K10

    Power Query 真经 - 第 4 章 - 在 Excel 和 Power BI 之间迁移查询

    4.2 导入查询 虽然复制和粘贴查询肯定是将查询 Excel 到 Power BI 中一种有效的方法,但也可以导入查询。那么,为什么有这种模式呢?...立即发现有些地方不对,如图 4-17 所示。 图 4-17 为什么 “Date” 列所有的值都显示为 “Error” 在阅读错误信息,可以看到该列正试图将 “43131” 设置为一个日期。...图 4-18 “Date” 列为什么会有这么多数值而不是日期 在这个特定的步骤中,有如下三件事一定要注意到。...虽然这确实产生风险,即用户必须更新一个外部文件的路径,但它避免了与日期有关的错误,以及无法在数据源中添加行或修改记录的风险。...进入字段列表,展开 “Calendar”,选择 “Month Short” 列。 图 4-22 这看起来很熟悉 此时,用户可能认为所有结果都与前面示例中的结果相同。

    7.7K20

    Spring Boot + EasyExcel 导入导出,好用到爆,可以扔掉 POI 了!

    输入输出简单,提供输入输出过程的接口 支持一定程度的单元格合并等灵活化操作 二、常用注解 @ExcelProperty 指定当前字段对应excel中的那一列。可以根据名字或者Index去匹配。...excel去匹配,加了这个注解忽略该字段 @DateTimeFormat 日期转换,用String去接收excel日期格式的数据会调用这个注解。...里面的value参照java.text.SimpleDateFormat @NumberFormat 数字转换,用String去接收excel数字格式的数据会调用这个注解。...里面的value参照java.text.DecimalFormat @ExcelIgnoreUnannotated 默认不加ExcelProperty 的注解的都会参与读写,加了不会参与 三、依赖 <...} try { String strUrl = "C:\\Users\\Administrator\\Desktop\\json"+System.currentTimeMillis()+".xlsx

    95820

    开发了一个小工具

    闲暇时间, 为了克服平时使用电脑的一个坏习惯,我开发了一个小工具来帮助自己。...这样做虽然方便了, 副作用也很明显, 就像我的桌面,时间久了变成这个样子 ? 桌面除了程序快捷方式图标以外,充斥着杂乱无章乱七八糟的内容,非常碍眼。...桌面上除了快捷方式图标以外的内容都会被读到软件里面。 点击列表第一列的选择框, 选择要清理的文件, 点击清理即可。 如果只是清理列表中其中一项, 可以直接点击列表最右侧对应的清理按钮即可。...被清理的文件存放在第一次打开软件设置的目录下面, 并按日期分开放置在不同的文件下。 ? 每一个目录对应一个xml文件,xml文件里存放着文件移动相关的数据。 ?...为什么用两种语言实现?只是觉得好玩而已, 其实用C#完成这件事也绰绰有余了 。

    70480

    用Docker玩转MLSQL系列(2)-操作excel和数据可视化

    plugin app add - "mlsql-analysis-toolkit-2.4"; 如果你是之前安装的docker镜像,发生如下异常: requirement failed: -streaming.datalake.path...is required java.lang.IllegalArgumentException: requirement failed: -streaming.datalake.path is required...- and dataAddress="A1:C8" as baby; 这就相当于我们得到了两张表,上面的指令执行结果如下: 我们先将两个excel保存成数据湖格式后重新加载,这样后续运行速度快些。...比如日期其实蛮容易没有填写或者异常的。有的时候数据很少很珍贵,我们又不想放弃掉这些部分字段有缺失的数据,最好的方式是补个中位数啥的。...我们接着计算下用户的购买年龄,因为我们添加了修正了一些数据(通过中位数修正了购买日期和出生日期),通过购买年龄(购买日期-出生日期)剔除掉明显不正确的数据。

    91640

    accessors 作用_EasyExcel与@Accessors(chain = true)不兼容分析

    EasyExcel EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。...public @interface Accessors { /** * 如果为true,则访问器将以该字段命名,并且不包含 get 或 set *前缀,且省略了chain,则 chain 默认为true...原因详解 通过删减无关代码的方法, 发现当删减 @Accessors(chain = true)或修改为 @Accessors(chain = false)后, 能够正常读取到了, 定位到是该注解的影响, 为什么影响呢...为什么使用了@Accessors(chain = true)后, BeanMap拷贝不成功呢?...拷贝到Bean的测试 参考: 使用CGlib实现Bean拷贝(BeanCopier) 可见, 需要使用BeanMapMap拷贝到Bean, 需要Map 的Key与Bean的变量名一致, 并有对应的 set

    1.1K20

    Excel解析工具easyexcel全面探索

    Excel读取多页 以上都是最基础的单页读写,在我们调用sheet()方法,实际上都是默认第1页,那么如何读取多页?...excelReader.finish(); } 可以看到doReadAll方法可以读取所有sheet页面 若要读取单独的页面,用第二种方式readSheet(index),index为页面位置,0...自定义字段转换 在读取写入的时候,我们可能会有这样的需求:比如日期格式转换,字符串添加固定前缀后缀等等,此时我们可以进行自定义编写 @Data public class ConverterData {...无对象的读 顾名思义,不创建实体对象来读取Excel数据,那么我们就用Map接收,但这种对日期不友好,对于简单字段的读取可以使用 其它都一样,监听器的继承中泛型参数变为Map即可 public class...排除特定字段和只写入特定字段 使用excludeColumnFiledNames来排除特定字段写入,用includeColumnFiledNames表示只写入特定字段 /** * 根据参数只导出指定列

    4.3K31
    领券