2008-04-05 13:49:06 -04:00
|
|
|
/* ====================================================================
|
|
|
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
|
|
contributor license agreements. See the NOTICE file distributed with
|
|
|
|
this work for additional information regarding copyright ownership.
|
|
|
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
|
|
(the "License"); you may not use this file except in compliance with
|
|
|
|
the License. You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
==================================================================== */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* DateUtil.java
|
|
|
|
*
|
|
|
|
* Created on January 19, 2002, 9:30 AM
|
|
|
|
*/
|
|
|
|
package org.apache.poi.ss.usermodel;
|
|
|
|
|
|
|
|
import java.util.Calendar;
|
|
|
|
import java.util.Date;
|
|
|
|
import java.util.GregorianCalendar;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Contains methods for dealing with Excel dates.
|
|
|
|
*
|
|
|
|
* @author Michael Harhen
|
|
|
|
* @author Glen Stampoultzis (glens at apache.org)
|
|
|
|
* @author Dan Sherman (dsherman at isisph.com)
|
|
|
|
* @author Hack Kampbjorn (hak at 2mba.dk)
|
|
|
|
* @author Alex Jacoby (ajacoby at gmail.com)
|
|
|
|
* @author Pavel Krupets (pkrupets at palmtreebusiness dot com)
|
|
|
|
*/
|
|
|
|
|
|
|
|
public class DateUtil
|
|
|
|
{
|
|
|
|
protected DateUtil()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
private static final int BAD_DATE =
|
|
|
|
-1; // used to specify that date is invalid
|
|
|
|
private static final long DAY_MILLISECONDS = 24 * 60 * 60 * 1000;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Given a Date, converts it into a double representing its internal Excel representation,
|
|
|
|
* which is the number of days since 1/1/1900. Fractional days represent hours, minutes, and seconds.
|
|
|
|
*
|
|
|
|
* @return Excel representation of Date (-1 if error - test for error by checking for less than 0.1)
|
|
|
|
* @param date the Date
|
|
|
|
*/
|
|
|
|
public static double getExcelDate(Date date) {
|
|
|
|
return getExcelDate(date, false);
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Given a Date, converts it into a double representing its internal Excel representation,
|
|
|
|
* which is the number of days since 1/1/1900. Fractional days represent hours, minutes, and seconds.
|
|
|
|
*
|
|
|
|
* @return Excel representation of Date (-1 if error - test for error by checking for less than 0.1)
|
|
|
|
* @param date the Date
|
|
|
|
* @param use1904windowing Should 1900 or 1904 date windowing be used?
|
|
|
|
*/
|
|
|
|
public static double getExcelDate(Date date, boolean use1904windowing) {
|
|
|
|
Calendar calStart = new GregorianCalendar();
|
|
|
|
calStart.setTime(date); // If date includes hours, minutes, and seconds, set them to 0
|
|
|
|
return internalGetExcelDate(calStart, use1904windowing);
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Given a Date in the form of a Calendar, converts it into a double
|
|
|
|
* representing its internal Excel representation, which is the
|
|
|
|
* number of days since 1/1/1900. Fractional days represent hours,
|
|
|
|
* minutes, and seconds.
|
|
|
|
*
|
|
|
|
* @return Excel representation of Date (-1 if error - test for error by checking for less than 0.1)
|
|
|
|
* @param date the Calendar holding the date to convert
|
|
|
|
* @param use1904windowing Should 1900 or 1904 date windowing be used?
|
|
|
|
*/
|
|
|
|
public static double getExcelDate(Calendar date, boolean use1904windowing) {
|
|
|
|
// Don't alter the supplied Calendar as we do our work
|
|
|
|
return internalGetExcelDate( (Calendar)date.clone(), use1904windowing );
|
|
|
|
}
|
|
|
|
private static double internalGetExcelDate(Calendar date, boolean use1904windowing) {
|
|
|
|
if ((!use1904windowing && date.get(Calendar.YEAR) < 1900) ||
|
|
|
|
(use1904windowing && date.get(Calendar.YEAR) < 1904))
|
|
|
|
{
|
|
|
|
return BAD_DATE;
|
|
|
|
} else {
|
|
|
|
// Because of daylight time saving we cannot use
|
|
|
|
// date.getTime() - calStart.getTimeInMillis()
|
|
|
|
// as the difference in milliseconds between 00:00 and 04:00
|
|
|
|
// can be 3, 4 or 5 hours but Excel expects it to always
|
|
|
|
// be 4 hours.
|
|
|
|
// E.g. 2004-03-28 04:00 CEST - 2004-03-28 00:00 CET is 3 hours
|
|
|
|
// and 2004-10-31 04:00 CET - 2004-10-31 00:00 CEST is 5 hours
|
|
|
|
double fraction = (((date.get(Calendar.HOUR_OF_DAY) * 60
|
|
|
|
+ date.get(Calendar.MINUTE)
|
|
|
|
) * 60 + date.get(Calendar.SECOND)
|
|
|
|
) * 1000 + date.get(Calendar.MILLISECOND)
|
|
|
|
) / ( double ) DAY_MILLISECONDS;
|
|
|
|
Calendar calStart = dayStart(date);
|
|
|
|
|
|
|
|
double value = fraction + absoluteDay(calStart, use1904windowing);
|
|
|
|
|
|
|
|
if (!use1904windowing && value >= 60) {
|
|
|
|
value++;
|
|
|
|
} else if (use1904windowing) {
|
|
|
|
value--;
|
|
|
|
}
|
|
|
|
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Given an Excel date with using 1900 date windowing, and
|
|
|
|
* converts it to a java.util.Date.
|
|
|
|
*
|
|
|
|
* NOTE: If the default <code>TimeZone</code> in Java uses Daylight
|
|
|
|
* Saving Time then the conversion back to an Excel date may not give
|
|
|
|
* the same value, that is the comparison
|
|
|
|
* <CODE>excelDate == getExcelDate(getJavaDate(excelDate,false))</CODE>
|
|
|
|
* is not always true. For example if default timezone is
|
|
|
|
* <code>Europe/Copenhagen</code>, on 2004-03-28 the minute after
|
|
|
|
* 01:59 CET is 03:00 CEST, if the excel date represents a time between
|
|
|
|
* 02:00 and 03:00 then it is converted to past 03:00 summer time
|
|
|
|
*
|
|
|
|
* @param date The Excel date.
|
|
|
|
* @return Java representation of the date, or null if date is not a valid Excel date
|
|
|
|
* @see java.util.TimeZone
|
|
|
|
*/
|
|
|
|
public static Date getJavaDate(double date) {
|
|
|
|
return getJavaDate(date, false);
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Given an Excel date with either 1900 or 1904 date windowing,
|
|
|
|
* converts it to a java.util.Date.
|
|
|
|
*
|
|
|
|
* NOTE: If the default <code>TimeZone</code> in Java uses Daylight
|
|
|
|
* Saving Time then the conversion back to an Excel date may not give
|
|
|
|
* the same value, that is the comparison
|
|
|
|
* <CODE>excelDate == getExcelDate(getJavaDate(excelDate,false))</CODE>
|
|
|
|
* is not always true. For example if default timezone is
|
|
|
|
* <code>Europe/Copenhagen</code>, on 2004-03-28 the minute after
|
|
|
|
* 01:59 CET is 03:00 CEST, if the excel date represents a time between
|
|
|
|
* 02:00 and 03:00 then it is converted to past 03:00 summer time
|
|
|
|
*
|
|
|
|
* @param date The Excel date.
|
|
|
|
* @param use1904windowing true if date uses 1904 windowing,
|
|
|
|
* or false if using 1900 date windowing.
|
|
|
|
* @return Java representation of the date, or null if date is not a valid Excel date
|
|
|
|
* @see java.util.TimeZone
|
|
|
|
*/
|
|
|
|
public static Date getJavaDate(double date, boolean use1904windowing) {
|
|
|
|
if (isValidExcelDate(date)) {
|
|
|
|
int startYear = 1900;
|
|
|
|
int dayAdjust = -1; // Excel thinks 2/29/1900 is a valid date, which it isn't
|
|
|
|
int wholeDays = (int)Math.floor(date);
|
|
|
|
if (use1904windowing) {
|
|
|
|
startYear = 1904;
|
|
|
|
dayAdjust = 1; // 1904 date windowing uses 1/2/1904 as the first day
|
|
|
|
}
|
|
|
|
else if (wholeDays < 61) {
|
|
|
|
// Date is prior to 3/1/1900, so adjust because Excel thinks 2/29/1900 exists
|
|
|
|
// If Excel date == 2/29/1900, will become 3/1/1900 in Java representation
|
|
|
|
dayAdjust = 0;
|
|
|
|
}
|
|
|
|
GregorianCalendar calendar = new GregorianCalendar(startYear,0,
|
|
|
|
wholeDays + dayAdjust);
|
|
|
|
int millisecondsInDay = (int)((date - Math.floor(date)) *
|
|
|
|
DAY_MILLISECONDS + 0.5);
|
|
|
|
calendar.set(GregorianCalendar.MILLISECOND, millisecondsInDay);
|
|
|
|
return calendar.getTime();
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Given a format ID and its format String, will check to see if the
|
|
|
|
* format represents a date format or not.
|
|
|
|
* Firstly, it will check to see if the format ID corresponds to an
|
|
|
|
* internal excel date format (eg most US date formats)
|
|
|
|
* If not, it will check to see if the format string only contains
|
|
|
|
* date formatting characters (ymd-/), which covers most
|
|
|
|
* non US date formats.
|
|
|
|
*
|
|
|
|
* @param formatIndex The index of the format, eg from ExtendedFormatRecord.getFormatIndex
|
|
|
|
* @param formatString The format string, eg from FormatRecord.getFormatString
|
|
|
|
* @see #isInternalDateFormat(int)
|
|
|
|
*/
|
|
|
|
public static boolean isADateFormat(int formatIndex, String formatString) {
|
|
|
|
// First up, is this an internal date format?
|
|
|
|
if(isInternalDateFormat(formatIndex)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// If we didn't get a real string, it can't be
|
|
|
|
if(formatString == null || formatString.length() == 0) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
String fs = formatString;
|
|
|
|
|
|
|
|
// Translate \- into just -, before matching
|
|
|
|
fs = fs.replaceAll("\\\\-","-");
|
|
|
|
// And \, into ,
|
|
|
|
fs = fs.replaceAll("\\\\,",",");
|
|
|
|
// And '\ ' into ' '
|
|
|
|
fs = fs.replaceAll("\\\\ "," ");
|
|
|
|
|
|
|
|
// If it end in ;@, that's some crazy dd/mm vs mm/dd
|
|
|
|
// switching stuff, which we can ignore
|
|
|
|
fs = fs.replaceAll(";@", "");
|
|
|
|
|
Merged revisions 638786-638802,638805-638811,638813-638814,638816-639230,639233-639241,639243-639253,639255-639486,639488-639601,639603-639835,639837-639917,639919-640056,640058-640710,640712-641156,641158-641184,641186-641795,641797-641798,641800-641933,641935-641963,641965-641966,641968-641995,641997-642230,642232-642562,642564-642565,642568-642570,642572-642573,642576-642736,642739-642877,642879,642881-642890,642892-642903,642905-642945,642947-643624,643626-643653,643655-643669,643671,643673-643830,643832-643833,643835-644342,644344-644472,644474-644508,644510-645347,645349-645351,645353-645559,645561-645565,645568-645951,645953-646193,646195-646311,646313-646404,646406-646665,646667-646853,646855-646869,646871-647151,647153-647185,647187-647277,647279-647566,647568-647573,647575,647578-647711,647714-647737,647739-647823,647825-648155,648157-648202,648204-648273,648275,648277-648302,648304-648333,648335-648588,648590-648622,648625-648673,648675-649141,649144,649146-649556,649558-649795,649799,649801-649910,649912-649913,649915-650128,650131-650132,650134-650137,650140-650914,650916-651991,651993-652284,652286-652287,652289,652291,652293-652297,652299-652328,652330-652425,652427-652445,652447-652560,652562-652933,652935,652937-652993,652995-653116,653118-653124,653126-653483,653487-653519,653522-653550,653552-653607,653609-653667,653669-653674,653676-653814,653817-653830,653832-653891,653893-653944,653946-654055,654057-654355,654357-654365,654367-654648,654651-655215,655217-655277,655279-655281,655283-655911,655913-656212,656214,656216-656251,656253-656698,656700-656756,656758-656892,656894-657135,657137-657165,657168-657179,657181-657354,657356-657357,657359-657701,657703-657874,657876-658032,658034-658284,658286,658288-658301,658303-658307,658309-658321,658323-658335,658337-658348,658351,658353-658832,658834-658983,658985,658987-659066,659068-659402,659404-659428,659430-659451,659453-659454,659456-659461,659463-659477,659479-659524,659526-659571,659574-660890 via svnmerge from
https://svn.apache.org/repos/asf/poi/trunk
........
r659575 | nick | 2008-05-23 16:55:08 +0100 (Fri, 23 May 2008) | 1 line
Help for bug #44840 - Improved handling of HSSFObjectData, especially for entries with data held not in POIFS
........
r660256 | josh | 2008-05-26 19:02:23 +0100 (Mon, 26 May 2008) | 1 line
Follow-on fix for bug 42564 (r653668). Array elements are stored internally column by column.
........
r660263 | josh | 2008-05-26 19:25:02 +0100 (Mon, 26 May 2008) | 1 line
Small fix for FormulaParser. Need case-insentive match for IF function name
........
r660280 | josh | 2008-05-26 20:36:56 +0100 (Mon, 26 May 2008) | 1 line
Added test cases for parsing IF expressions. Segregated IF test cases into a new class
........
r660344 | josh | 2008-05-27 01:57:23 +0100 (Tue, 27 May 2008) | 1 line
Changed class hierarchy of Ptg to improve 'operand class' transformation.
........
r660474 | nick | 2008-05-27 12:44:49 +0100 (Tue, 27 May 2008) | 1 line
X, Y, Width and Height getters/setters on HSSFChart
........
r660828 | josh | 2008-05-28 07:19:31 +0100 (Wed, 28 May 2008) | 1 line
Fix for 45060 (and 45041) - Improved token class transformation during formula parsing
........
r660834 | yegor | 2008-05-28 07:50:35 +0100 (Wed, 28 May 2008) | 1 line
bump 3.1-beta2 announcement
........
r660889 | nick | 2008-05-28 11:03:00 +0100 (Wed, 28 May 2008) | 1 line
Fix bug #45087 - Correctly detect date formats like [Black]YYYY as being date based
........
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@660905 13f79535-47bb-0310-9956-ffa450edef68
2008-05-28 07:06:34 -04:00
|
|
|
// If it starts with [$-...], then could be a date, but
|
2008-04-05 13:49:06 -04:00
|
|
|
// who knows what that starting bit is all about
|
Merged revisions 638786-638802,638805-638811,638813-638814,638816-639230,639233-639241,639243-639253,639255-639486,639488-639601,639603-639835,639837-639917,639919-640056,640058-640710,640712-641156,641158-641184,641186-641795,641797-641798,641800-641933,641935-641963,641965-641966,641968-641995,641997-642230,642232-642562,642564-642565,642568-642570,642572-642573,642576-642736,642739-642877,642879,642881-642890,642892-642903,642905-642945,642947-643624,643626-643653,643655-643669,643671,643673-643830,643832-643833,643835-644342,644344-644472,644474-644508,644510-645347,645349-645351,645353-645559,645561-645565,645568-645951,645953-646193,646195-646311,646313-646404,646406-646665,646667-646853,646855-646869,646871-647151,647153-647185,647187-647277,647279-647566,647568-647573,647575,647578-647711,647714-647737,647739-647823,647825-648155,648157-648202,648204-648273,648275,648277-648302,648304-648333,648335-648588,648590-648622,648625-648673,648675-649141,649144,649146-649556,649558-649795,649799,649801-649910,649912-649913,649915-650128,650131-650132,650134-650137,650140-650914,650916-651991,651993-652284,652286-652287,652289,652291,652293-652297,652299-652328,652330-652425,652427-652445,652447-652560,652562-652933,652935,652937-652993,652995-653116,653118-653124,653126-653483,653487-653519,653522-653550,653552-653607,653609-653667,653669-653674,653676-653814,653817-653830,653832-653891,653893-653944,653946-654055,654057-654355,654357-654365,654367-654648,654651-655215,655217-655277,655279-655281,655283-655911,655913-656212,656214,656216-656251,656253-656698,656700-656756,656758-656892,656894-657135,657137-657165,657168-657179,657181-657354,657356-657357,657359-657701,657703-657874,657876-658032,658034-658284,658286,658288-658301,658303-658307,658309-658321,658323-658335,658337-658348,658351,658353-658832,658834-658983,658985,658987-659066,659068-659402,659404-659428,659430-659451,659453-659454,659456-659461,659463-659477,659479-659524,659526-659571,659574-660890 via svnmerge from
https://svn.apache.org/repos/asf/poi/trunk
........
r659575 | nick | 2008-05-23 16:55:08 +0100 (Fri, 23 May 2008) | 1 line
Help for bug #44840 - Improved handling of HSSFObjectData, especially for entries with data held not in POIFS
........
r660256 | josh | 2008-05-26 19:02:23 +0100 (Mon, 26 May 2008) | 1 line
Follow-on fix for bug 42564 (r653668). Array elements are stored internally column by column.
........
r660263 | josh | 2008-05-26 19:25:02 +0100 (Mon, 26 May 2008) | 1 line
Small fix for FormulaParser. Need case-insentive match for IF function name
........
r660280 | josh | 2008-05-26 20:36:56 +0100 (Mon, 26 May 2008) | 1 line
Added test cases for parsing IF expressions. Segregated IF test cases into a new class
........
r660344 | josh | 2008-05-27 01:57:23 +0100 (Tue, 27 May 2008) | 1 line
Changed class hierarchy of Ptg to improve 'operand class' transformation.
........
r660474 | nick | 2008-05-27 12:44:49 +0100 (Tue, 27 May 2008) | 1 line
X, Y, Width and Height getters/setters on HSSFChart
........
r660828 | josh | 2008-05-28 07:19:31 +0100 (Wed, 28 May 2008) | 1 line
Fix for 45060 (and 45041) - Improved token class transformation during formula parsing
........
r660834 | yegor | 2008-05-28 07:50:35 +0100 (Wed, 28 May 2008) | 1 line
bump 3.1-beta2 announcement
........
r660889 | nick | 2008-05-28 11:03:00 +0100 (Wed, 28 May 2008) | 1 line
Fix bug #45087 - Correctly detect date formats like [Black]YYYY as being date based
........
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@660905 13f79535-47bb-0310-9956-ffa450edef68
2008-05-28 07:06:34 -04:00
|
|
|
fs = fs.replaceAll("^\\[\\$\\-.*?\\]", "");
|
|
|
|
|
|
|
|
// If it starts with something like [Black] or [Yellow],
|
|
|
|
// then it could be a date
|
|
|
|
fs = fs.replaceAll("^\\[[a-zA-Z]+\\]", "");
|
2008-04-05 13:49:06 -04:00
|
|
|
|
|
|
|
// Otherwise, check it's only made up, in any case, of:
|
|
|
|
// y m d h s - / , . :
|
Merged revisions 638786-638802,638805-638811,638813-638814,638816-639230,639233-639241,639243-639253,639255-639486,639488-639601,639603-639835,639837-639917,639919-640056,640058-640710,640712-641156,641158-641184,641186-641795,641797-641798,641800-641933,641935-641963,641965-641966,641968-641995,641997-642230,642232-642562,642564-642565,642568-642570,642572-642573,642576-642736,642739-642877,642879,642881-642890,642892-642903,642905-642945,642947-643624,643626-643653,643655-643669,643671,643673-643830,643832-643833,643835-644342,644344-644472,644474-644508,644510-645347,645349-645351,645353-645559,645561-645565,645568-645951,645953-646193,646195-646311,646313-646404,646406-646665,646667-646853,646855-646869,646871-647151,647153-647185,647187-647277,647279-647566,647568-647573,647575,647578-647711,647714-647737,647739-647823,647825-648155,648157-648202,648204-648273,648275,648277-648302,648304-648333,648335-648588,648590-648622,648625-648673,648675-649141,649144,649146-649556,649558-649795,649799,649801-649910,649912-649913,649915-650128,650131-650132,650134-650137,650140-650914,650916-651991,651993-652284,652286-652287,652289,652291,652293-652297,652299-652328,652330-652425,652427-652445,652447-652560,652562-652933,652935,652937-652993,652995-653116,653118-653124,653126-653483,653487-653519,653522-653550,653552-653607,653609-653667,653669-653674,653676-653814,653817-653830,653832-653891,653893-653944,653946-654055,654057-654355,654357-654365,654367-654648,654651-655215,655217-655277,655279-655281,655283-655911,655913-656212,656214,656216-656251,656253-656698,656700-656756,656758-656892,656894-657135,657137-657165,657168-657179,657181-657354,657356-657357,657359-657701,657703-657874,657876-658032,658034-658284,658286,658288-658301,658303-658307,658309-659484 via svnmerge from
https://svn.apache.org:443/repos/asf/poi/trunk
........
r658322 | nick | 2008-05-20 17:37:15 +0100 (Tue, 20 May 2008) | 1 line
Fix bug #44977 - Support for AM/PM in excel date formats
........
r658336 | nick | 2008-05-20 17:51:49 +0100 (Tue, 20 May 2008) | 1 line
Test which seems to show that bug #44996 is invalid, but not completely sure
........
r658349 | nick | 2008-05-20 17:57:20 +0100 (Tue, 20 May 2008) | 1 line
Patch from bug #45001 - Partial fix for HWPF Range.insertBefore() and Range.delete() with unicode characters
........
r658350 | nick | 2008-05-20 18:12:08 +0100 (Tue, 20 May 2008) | 1 line
Put abstract write(OutputStream) method on POIDocument
........
r658352 | nick | 2008-05-20 18:17:16 +0100 (Tue, 20 May 2008) | 1 line
Patch from bug #45003 - Support embeded HDGF visio documents
........
r658833 | josh | 2008-05-21 20:57:40 +0100 (Wed, 21 May 2008) | 1 line
improved toString and refactored toFormulaString on Area(3D)Ptg
........
r658984 | josh | 2008-05-22 04:00:29 +0100 (Thu, 22 May 2008) | 1 line
Fixed compiler errors. Other improvements for type safety and immutability.
........
r658986 | josh | 2008-05-22 04:26:25 +0100 (Thu, 22 May 2008) | 1 line
Follow on from bug 44675 - regenerated functionMetadata.txt from new ooo excelfileformat.odt
........
r659067 | nick | 2008-05-22 10:51:44 +0100 (Thu, 22 May 2008) | 1 line
Example for finding hslf sounds from Yegor
........
r659403 | josh | 2008-05-23 04:56:31 +0100 (Fri, 23 May 2008) | 1 line
Fix for 45066 - sheet encoding size mismatch problems
........
r659429 | josh | 2008-05-23 06:28:54 +0100 (Fri, 23 May 2008) | 1 line
Fix for bug 45046 - allowed DEFINEDNAME records without EXTERNALBOOK records
........
r659452 | josh | 2008-05-23 07:43:51 +0100 (Fri, 23 May 2008) | 1 line
Bug 45041 - improved FormulaParser parse error messages
........
r659455 | josh | 2008-05-23 07:54:46 +0100 (Fri, 23 May 2008) | 1 line
Bug 45025 - improved FormulaParser parse error messages (r659452 had wrong bug number)
........
r659462 | josh | 2008-05-23 08:42:14 +0100 (Fri, 23 May 2008) | 1 line
Marked out test failure which was fixed by patch for bug 39903
........
r659478 | josh | 2008-05-23 09:55:48 +0100 (Fri, 23 May 2008) | 1 line
Fix for bug 35925 - Missing HSSFColor.TAN from HashTables returned by getIndexHash() and getTripletHash()
........
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@659485 13f79535-47bb-0310-9956-ffa450edef68
2008-05-23 05:48:23 -04:00
|
|
|
// optionally followed by AM/PM
|
|
|
|
// optionally followed by AM/PM
|
Merged revisions 638786-638802,638805-638811,638813-638814,638816-639230,639233-639241,639243-639253,639255-639486,639488-639601,639603-639835,639837-639917,639919-640056,640058-640710,640712-641156,641158-641184,641186-641795,641797-641798,641800-641933,641935-641963,641965-641966,641968-641995,641997-642230,642232-642562,642564-642565,642568-642570,642572-642573,642576-642736,642739-642877,642879,642881-642890,642892-642903,642905-642945,642947-643624,643626-643653,643655-643669,643671,643673-643830,643832-643833,643835-644342,644344-644472,644474-644508,644510-645347,645349-645351,645353-645559,645561-645565,645568-645951,645953-646193,646195-646311,646313-646404,646406-646665,646667-646853,646855-646869,646871-647151,647153-647185,647187-647277,647279-647566,647568-647573,647575,647578-647711,647714-647737,647739-647823,647825-648155,648157-648202,648204-648273,648275,648277-648302,648304-648333,648335-648588,648590-648622,648625-648673,648675-649141,649144,649146-649556,649558-649795,649799,649801-649910,649912-649913,649915-650128,650131-650132,650134-650137,650140-650914,650916-651991,651993-652284,652286-652287,652289,652291,652293-652297,652299-652328,652330-652425,652427-652445,652447-652560,652562-652933,652935,652937-652993,652995-653116,653118-653124,653126-653483,653487-653519,653522-653550,653552-653607,653609-653667,653669-653674,653676-653814,653817-653830,653832-653891,653893-653944,653946-654055,654057-654355,654357-654365,654367-654648,654651-655215,655217-655277,655279-655281,655283-655911,655913-656212,656214,656216-656251,656253-656698,656700-656756,656758-656892,656894-657135,657137-657165,657168-657179,657181-657354,657356-657357,657359-657701,657703-657874,657876-658032,658034-658284,658286,658288-658301,658303-658307,658309-658321,658323-658335,658337-658348,658351,658353-658832,658834-658983,658985,658987-659066,659068-659402,659404-659428,659430-659451,659453-659454,659456-659461,659463-659477,659479-659524,659526-659571,659574,659576-660255,660257-660262,660264-660279,660281-660343,660345-660473,660475-660827,660829-660833,660835-660888,660890-663321,663323-663435,663437-663764,663766-663854,663856-664219,664221-664489,664494-664514,664516-668013,668015-668142,668144-668152,668154,668156-668256,668258,668260-669139,669141-669455,669457-669657,669659-669808,669810-670189,670191-671321,671323-672229,672231-672549,672551-672552,672554-672561,672563-672566,672568,672571-673049,673051-673852,673854-673862,673864-673986,673988-673996,673998-674347,674349-674890,674892-674910,674912-674936,674938-674952,674954-675078,675080-675085,675087-675217,675219-675660,675662-675670,675672-675716,675718-675726,675728-675733,675735-675775,675777-675782,675784,675786-675791,675794-675852,675854-676200,676202,676204,676206-676220,676222-676309,676311-676456,676458-676994,676996-677027,677030-677040,677042-677056,677058-678287 via svnmerge from
https://svn.apache.org:443/repos/asf/poi/trunk
........
r677376 | josh | 2008-07-16 19:47:13 +0100 (Wed, 16 Jul 2008) | 1 line
Patch 45410 - removed dependency on commons beanutils, collections and lang
........
r677969 | nick | 2008-07-18 18:02:29 +0100 (Fri, 18 Jul 2008) | 1 line
Patch from Jukka from bug #45394 - tidy up examples bit of build
........
r677972 | nick | 2008-07-18 18:11:51 +0100 (Fri, 18 Jul 2008) | 1 line
Update homepage for 3.5.1 beta 1
........
r677974 | nick | 2008-07-18 18:16:50 +0100 (Fri, 18 Jul 2008) | 1 line
Patch from bug #45398 - Support detecting date formats containing "am/pm" as date times
........
r677995 | nick | 2008-07-18 19:40:11 +0100 (Fri, 18 Jul 2008) | 1 line
Patch from bug #45414 - Don't add too many UncalcedRecords to sheets with charts in them
........
r678287 | nick | 2008-07-20 18:18:07 +0100 (Sun, 20 Jul 2008) | 1 line
Apply, with some tweaks, the patch from bug #45404 - New class, hssf.usermodel.HSSFDataFormatter, for formatting numbers and dates in the same way that Excel does
........
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@678288 13f79535-47bb-0310-9956-ffa450edef68
2008-07-20 13:44:06 -04:00
|
|
|
if(fs.matches("^[yYmMdDhHsS\\-/,. :]+[ampAMP/]*$")) {
|
2008-04-05 13:49:06 -04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Given a format ID this will check whether the format represents
|
|
|
|
* an internal excel date format or not.
|
|
|
|
* @see #isADateFormat(int, java.lang.String)
|
|
|
|
*/
|
|
|
|
public static boolean isInternalDateFormat(int format) {
|
|
|
|
boolean retval =false;
|
|
|
|
|
|
|
|
switch(format) {
|
|
|
|
// Internal Date Formats as described on page 427 in
|
|
|
|
// Microsoft Excel Dev's Kit...
|
|
|
|
case 0x0e:
|
|
|
|
case 0x0f:
|
|
|
|
case 0x10:
|
|
|
|
case 0x11:
|
|
|
|
case 0x12:
|
|
|
|
case 0x13:
|
|
|
|
case 0x14:
|
|
|
|
case 0x15:
|
|
|
|
case 0x16:
|
|
|
|
case 0x2d:
|
|
|
|
case 0x2e:
|
|
|
|
case 0x2f:
|
|
|
|
retval = true;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
retval = false;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check if a cell contains a date
|
|
|
|
* Since dates are stored internally in Excel as double values
|
|
|
|
* we infer it is a date if it is formatted as such.
|
|
|
|
* @see #isADateFormat(int, String)
|
|
|
|
* @see #isInternalDateFormat(int)
|
|
|
|
*/
|
|
|
|
public static boolean isCellDateFormatted(Cell cell) {
|
|
|
|
if (cell == null) return false;
|
|
|
|
boolean bDate = false;
|
|
|
|
|
|
|
|
double d = cell.getNumericCellValue();
|
|
|
|
if ( DateUtil.isValidExcelDate(d) ) {
|
|
|
|
CellStyle style = cell.getCellStyle();
|
2008-04-05 14:01:05 -04:00
|
|
|
if(style == null) return false;
|
|
|
|
|
2008-04-05 13:49:06 -04:00
|
|
|
int i = style.getDataFormat();
|
|
|
|
String f = style.getDataFormatString();
|
|
|
|
bDate = isADateFormat(i, f);
|
|
|
|
}
|
|
|
|
return bDate;
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Check if a cell contains a date, checking only for internal
|
|
|
|
* excel date formats.
|
|
|
|
* As Excel stores a great many of its dates in "non-internal"
|
|
|
|
* date formats, you will not normally want to use this method.
|
|
|
|
* @see #isADateFormat(int,String)
|
|
|
|
* @see #isInternalDateFormat(int)
|
|
|
|
*/
|
|
|
|
public static boolean isCellInternalDateFormatted(Cell cell) {
|
|
|
|
if (cell == null) return false;
|
|
|
|
boolean bDate = false;
|
|
|
|
|
|
|
|
double d = cell.getNumericCellValue();
|
|
|
|
if ( DateUtil.isValidExcelDate(d) ) {
|
|
|
|
CellStyle style = cell.getCellStyle();
|
|
|
|
int i = style.getDataFormat();
|
|
|
|
bDate = isInternalDateFormat(i);
|
|
|
|
}
|
|
|
|
return bDate;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Given a double, checks if it is a valid Excel date.
|
|
|
|
*
|
|
|
|
* @return true if valid
|
|
|
|
* @param value the double value
|
|
|
|
*/
|
|
|
|
|
|
|
|
public static boolean isValidExcelDate(double value)
|
|
|
|
{
|
|
|
|
return (value > -Double.MIN_VALUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Given a Calendar, return the number of days since 1900/12/31.
|
|
|
|
*
|
|
|
|
* @return days number of days since 1900/12/31
|
|
|
|
* @param cal the Calendar
|
|
|
|
* @exception IllegalArgumentException if date is invalid
|
|
|
|
*/
|
|
|
|
|
|
|
|
protected static int absoluteDay(Calendar cal, boolean use1904windowing)
|
|
|
|
{
|
|
|
|
return cal.get(Calendar.DAY_OF_YEAR)
|
|
|
|
+ daysInPriorYears(cal.get(Calendar.YEAR), use1904windowing);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return the number of days in prior years since 1900
|
|
|
|
*
|
|
|
|
* @return days number of days in years prior to yr.
|
|
|
|
* @param yr a year (1900 < yr < 4000)
|
|
|
|
* @param use1904windowing
|
|
|
|
* @exception IllegalArgumentException if year is outside of range.
|
|
|
|
*/
|
|
|
|
|
|
|
|
private static int daysInPriorYears(int yr, boolean use1904windowing)
|
|
|
|
{
|
|
|
|
if ((!use1904windowing && yr < 1900) || (use1904windowing && yr < 1900)) {
|
|
|
|
throw new IllegalArgumentException("'year' must be 1900 or greater");
|
|
|
|
}
|
|
|
|
|
|
|
|
int yr1 = yr - 1;
|
|
|
|
int leapDays = yr1 / 4 // plus julian leap days in prior years
|
|
|
|
- yr1 / 100 // minus prior century years
|
|
|
|
+ yr1 / 400 // plus years divisible by 400
|
|
|
|
- 460; // leap days in previous 1900 years
|
|
|
|
|
|
|
|
return 365 * (yr - (use1904windowing ? 1904 : 1900)) + leapDays;
|
|
|
|
}
|
|
|
|
|
|
|
|
// set HH:MM:SS fields of cal to 00:00:00:000
|
|
|
|
private static Calendar dayStart(final Calendar cal)
|
|
|
|
{
|
|
|
|
cal.get(Calendar
|
|
|
|
.HOUR_OF_DAY); // force recalculation of internal fields
|
|
|
|
cal.set(Calendar.HOUR_OF_DAY, 0);
|
|
|
|
cal.set(Calendar.MINUTE, 0);
|
|
|
|
cal.set(Calendar.SECOND, 0);
|
|
|
|
cal.set(Calendar.MILLISECOND, 0);
|
|
|
|
cal.get(Calendar
|
|
|
|
.HOUR_OF_DAY); // force recalculation of internal fields
|
|
|
|
return cal;
|
|
|
|
}
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------------------------------------
|
|
|
|
}
|