如何正确获取excel中的自定义日期数据?

nayi_224 2021-06-29 18:01:28

excel版本为excel2007.

我需要创建一个公共方法来获取excel中的数据。excel中的日期和数字格式都是用数字存储的,现在先不考虑如何区分到底是日期还是数字,先假定传入的数据肯定为自定义的日期格式

我需要在不预先知道excel中的格式并且也无法强制规定格式的情况下,在java中获取于在excel中所见一致的数据。比如

excel中设定的格式     Excel中看到的结果

mmmm\-yy            January-21

yyyym"月"d"日"      20211月2日

测试用的java代码

	<dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi</artifactId>
		<version>5.0.0</version>
	</dependency>
	<dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi-ooxml</artifactId>
		<version>5.0.0</version>
	</dependency>
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.DateFormat;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.model.StylesTable;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Test01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String a1 = "E:\\tmp\\222.xlsx";
		
		FileInputStream fileInputStream = null;
		try {
			fileInputStream = new FileInputStream(a1);
			XSSFWorkbook sheets = new XSSFWorkbook(fileInputStream);
			Sheet ffSheet = sheets.getSheetAt(0);
			Row row = ffSheet.getRow(0);
			Cell cell = row.getCell(0);
			
			getCellValue((XSSFCell)cell);
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(fileInputStream != null)
					fileInputStream.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
    	
	}
	//	yyyy/mm/dd --> m/d/yy
	//	m/d/yy --> reserved-0x1E
	//	m/d ok
	//	m/d\ hh ok
	//	yyyym"月"d"日" ok
	//	yyyy"年"m"月"d"日" no
	//	yyyy"年"m"月"d"日";@ ok
	//	yyyy" aaaaa"m"月"d"日" 变成数字
	//	mmmm\-yy January-21 --> 一月-21
	private static String getCellValue(XSSFCell cell){
		XSSFCellStyle style = cell.getCellStyle();
		System.out.println(cell.getCellStyle().getDataFormatString());
//		System.out.println(cell.getDateCellValue());
		
		DataFormatter df = new DataFormatter();
		System.out.println(df.formatCellValue(cell));
		System.out.println(df.formatCellValue(cell).replace("\"", ""));
		return "";
	}
	
}

现在遇到的问题是,一部分在excel中正确显示的格式,在java中无法获取,甚至格式format都无法正确获取,目前发现的有:

excel中yyyy/m/d格式在java中会变为m/d/yy,m/d/yy则会变成乱码(reserved-0x1E),yyyy/mm/dd倒是可以正常显示。

excel中的yyyy"年"m"月"d"日"会读取成乱码,但是yyyy"年"m"月"d"日";@或者yyyym"月"d"日"可以正常读取

excel中mmmm\-yy显示为January-21,但是我在java中读出了一月-21。

等等。。。

 

要如何修改上面的getCellValue方法,来处理所有的自定义日期类型?

...全文
721 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
nuclear2011 2021-07-01
  • 打赏
  • 举报
回复 1

NPOI不知道咋解决,我用过Free Spire.XLS,它有一个getDisplayedText方法,可以获取Excel单元格的显示文本,不管当前设置的格式是什么,我写了个读取Excel的sample,你测试下有没有解决你的问题

import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;

public class ReadExcel {
    public static void main(String []args) throws Exception {
        Workbook workbook = new Workbook();
        workbook.loadFromFile("sample.xlsx");
        Worksheet sheet = workbook.getWorksheets().get(0);

        int maxRow = sheet.getLastRow();
        int maxColumn = sheet.getLastColumn();

        for (int row = 1; row <= maxRow; row++)
        {
           for (int col = 1; col <= maxColumn; col++)
            {
                String text = sheet.getCellRange(row, col).getDisplayedText();
                System.out.print(text + "\t\t");
            }
            System.out.print("\n");
        }
    }
}
nayi_224 2021-07-01
  • 举报
回复
@nuclear2011 方法不限,只要能实现就行。现在没时间测试,总之先给个赞了
nayi_224 2021-07-02
  • 举报
回复
@nuclear2011 刚测试了一下,确实比poi靠谱一些,但是依然不能处理所有格式,比如2021年1月2日会变成01月02日2021年,2021/1/2会变成01/02/2021
nuclear2011 2021-07-02
  • 举报
回复
@nayi_224 我建了一个文档测试 没出现你说的这个问题,2021年1月2日和2021/1/2读出来都是对的,用的版本是3.9.1,不知,哪里出了问题
1条回复
=PNZ=BeijingL 2021-06-29
  • 打赏
  • 举报
回复

没遇到过你的问题, 以前遇到的excel导入数据都是强制要求excel模板中日期单元格格式是指为文本, 然后硬编码转换

nayi_224 2021-06-30
  • 举报
回复
@=PNZ=BeijingL 确实一般都是强制规定格式,或者干脆提供一个下载模板的功能。但有些时候确实做不到这些,就想着能不能写一个公共方法,但是网上找了一大圈也没找到像样的方法

51,411

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧