利用POI向EXCEL写入日期数据时的问题

发表于:2007-10-12 11:50:03 楼主
在网上看了很多资料都是讨论如何利用POI读EXCEL的,但是没看到几个用POI向EXCEL写入日期数据的贴子,好不容易使通了,但是碰到了两个新问题,希望各位大侠指点:

我向EXCEL写日期数据思路是先用JAVA函数把日期转换成相对1900-1-1 0:00的数字,然后利用POI自定义EXCEL单元格格式为YYYY-MM-DD HH:MM型,我测试了一下程序,这个方法基本上是行的通的,但是其中有两点问题:

1.JAVA日期转换函数的参考日期是1900-1-1 0:00而EXCEL的参考日期是1900-1-0 0:00,因此算出来的数值参了一,这是好处理的,但是EXCEL跟JAVA日期转换函数间的偏差却不只这一处,不知道EXCEL不知道还在哪里少算了一天的时间,大家告诉我为什么会出现这种好吗?我就怕是处理闰年的依据不一样,这样可能会导致后面的日期时间里再出现偏差。
2.JAVA日期转换函数对12点的识别有问题,会识别成0点,如:1994-01-01 12:00会识别成Sat Jan 01 00:00:00 CST 1994大家有碰到这种情况吗?

我的代码是这样的:
<%@ page contentType="text/html;charset=gb2312"% >
<%@ page import="java.io.*,java.lang.*,org.apache.poi.hssf.usermodel.*,org.apache.poi.hssf.usermodel.HSSFCell,org.apache.poi.hssf.usermodel.HSSFCellStyle,org.apache.poi.hssf.usermodel.HSSFDataFormat,org.apache.poi.hssf.usermodel.HSSFFont,org.apache.poi.hssf.usermodel.HSSFRow,org.apache.poi.hssf.usermodel.HSSFSheet,org.apache.poi.hssf.usermodel.HSSFWorkbook,org.apache.poi.hssf.usermodel.HSSFRow,org.apache.poi.hssf.util.HSSFColor" % >
<%@ page import="zs_bx.DataQuery"% >
<%@ page import="java.sql.*"% >
<%@ page import ="java.util.Date"% >
<%@ page import ="java.util.Locale"% >
<%@ page import ="java.text.*"% >
<%
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
HSSFCellStyle dateCellStyle=wb.createCellStyle();
short df=wb.createDataFormat().getFormat("yyyy-mm-dd hh:mm"); 
dateCellStyle.setDataFormat(df);

DateFormat format;
SimpleDateFormat datetemp = new SimpleDateFormat("yyyy-MM-dd hh:mm");
SimpleDateFormat datetemp_test=new SimpleDateFormat("yyyy-MM-dd");
Date temp1 = datetemp.parse("1900-01-01 00:00");
Date temp2=datetemp.parse("1994-01-01 12:00");
double numOfDateTime=0;
numOfDateTime=temp2.getTime()-temp1.getTime();
numOfDateTime=numOfDateTime/24/60/60/1000+1;

HSSFRow row;
HSSFCell cell;
row = sheet.createRow(0);

cell = row.createCell((short)0);
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
cell.setCellValue(numOfDateTime); 
cell.setCellStyle(dateCellStyle);

....
....
 
 
问题点数:10 回复次数:5
 
发表于:2007-10-12 12:38:211楼 得分:0
可以试试先将日期以字符形式写入单元格再设定单元格格式?
 
 
发表于:2007-10-12 14:40:022楼 得分:0
这样不行的,这样做的话输进去了的数据就是字符型数据了,我之所以这么费周章用上面的方法去做就是应该这个方法不行啊,因为我在应用上必须让excel把日期能识别成日期,这样在画图表的时候才会根据时间画出正确的曲线

不过还是谢谢噢
 
 
发表于:2007-10-12 16:35:503楼 得分:0
看了JDK的API终于知道为什么出现这个问题了

SimpleDateFormat datetemp = new SimpleDateFormat("yyyy-MM-dd hh:mm");

在日期格式的定义中格式符是区分大小写的,H代表24小时(0~23),h代表12小时(1~12),所以之前我的12老是被认成是0时了(之前我在里面写的大小写是随意的),上面那句子正确的写法是

SimpleDateFormat datetemp = new SimpleDateFormat("yyyy-MM-DD HH:mm");

谢谢1楼的大哥了:)
 
 
发表于:2007-10-12 17:08:414楼 得分:0
对于第一个问题也查出原因了,这个问题挺有普遍意义的,实际上通常的所有应用里JAVA的Date.getTime()函数获得的时间都会比EXCEL里大,其原因如下:

1.EXCEL的时间参考是1900-1-0 0:00 为1,而java的时间参考是以1900-1-1 0:00 为0,因此java的时间转换出的数值比excel的少1,所以这里要加1;
2.由于EXCEL误以为1900年是闰年(真正的判断法则是:能被4或400整除,但不能被100整除的年份为闰年),所以在这个问题上EXCEL又把天数算多了一天,因此,用JAVA算出来的时间要转化成EXCEL的话要再加多一天,因此是加2

对于闰年的判断我不知道EXCEL是不是只错了1900年,反正从1900到2007EXCEL就错了一回,其它的闰年都算对了,希望这个发现能对各位大侠有帮助吧^_^
 
 
发表于:2007-10-12 17:14:395楼 得分:0
向excel中写入日期数据其实就是写入一个数值。
计算出来添进去,把格式设成日期型就OK了
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用JavaPOI库来读取Excel日期格式的数据。具体步骤如下: 1. 使用POI库中的Workbook类打开Excel文件。 2. 确定要读取的工作表。 3. 遍历工作表的每一行,读取日期格式的单元格。 4. 使用Java中的日期格式化函数将日期数据转换为标准日期格式。 以下是示例代码: ```java import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.Cell; 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.ss.usermodel.WorkbookFactory; public class ReadExcelDate { public static void main(String[] args) { try { FileInputStream file = new FileInputStream(new File("your_file.xls")); //Create Workbook instance holding reference to .xlsx file Workbook workbook = WorkbookFactory.create(file); //Get first/desired sheet from the workbook Sheet sheet = workbook.getSheetAt(0); //Iterate through each rows one by one for (Row row : sheet) { //Iterate through each cell one by one for (Cell cell : row) { //Check the cell type and format accordingly switch (cell.getCellType()) { case Cell.CELL_TYPE_NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { System.out.print(cell.getDateCellValue() + "\t"); } else { System.out.print(cell.getNumericCellValue() + "\t"); } break; case Cell.CELL_TYPE_STRING: System.out.print(cell.getStringCellValue() + "\t"); break; } } System.out.println(""); } file.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 该代码将遍历Excel中的每一个单元格,检查其类并格式化日期数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值