精华内容
下载资源
问答
  • excel日期怎么间隔填充 系列或相同日期的自动填充Excel日期 (AutoFill Excel Dates in Series or Same Date) If you're entering dates on an Excel worksheet, you don't have to enter each date individually....

    excel日期怎么间隔填充

    If you're entering dates on an Excel worksheet, you don't have to enter each date individually. Just enter the first date, in the top cell. Then, if there is data in the next column, you can use the Fill handle to quickly enter the rest of the dates. See how to AutoFill Excel dates in series or same date, with just a couple of clicks.

    如果要在Excel工作表上输入日期,则不必分别输入每个日期。 只需在顶部的单元格中输入第一个日期即可。 然后,如果下一列中有数据,则可以使用“填充”手柄快速输入其余日期。 只需单击几下,即可了解如何自动填充Excel系列或同一日期的日期。

    开始约会系列 (Start a Date Series)

    Enter the first date in the date column -- cell A2 in this example. Then point to the Fill handle, which is the small black square at the bottom right corner of the selection.

    在日期列中输入第一个日期-在此示例中为单元格A2。 然后指向“填充”手柄,该手柄是所选内容右下角的黑色小方块。

    When the pointer changes to a small black plus sign, double-click.

    当指针变为黑色小加号时,请双击。

    AutoFillDates01

    日期系列 (Dates Series)

    When you double-click the Fill handle, Excel automatically fills the dates down to the first blank cell in the next column.

    当您双击“填充”手柄时,Excel会自动将日期向下填充到下一列中的第一个空白单元格。

    By default, the dates are entered in a series of 1 day intervals.

    默认情况下,日期以一系列的1天间隔输入。

    AutoFillDates02

    更改为同一日期 (Change to Same Date)

    If you want all the date cells to have the same date, do one more step:

    如果希望所有日期单元格都具有相同的日期,请再执行一步:

    • Keep the range of date cells selected (cells A2:A9 in this example)

      保持选定日期单元格的范围(此示例中的单元格A2:A9)
    • Press Ctrl+D on the keyboard.

      在键盘上按Ctrl + D。

    That is the keyboard shortcut for Fill Down. When you use that shortcut, Excel copies the date from the active cell (cell A2), into all the selected cells below.

    那是Fill Down的键盘快捷键 。 当您使用该快捷方式时,Excel将日期从活动单元格(单元格A2)复制到下面的所有选定单元格中。

    AutoFillDates03

    观看视频 (Watch the Video)

    To see the steps for filling the dates, watch this very short video. The video shows how to create a date series with the Fill handle. Then it shows how to use a keyboard shortcut, to enter the same date in all the selected cells.

    要查看填写日期的步骤,请观看此简短视频。 该视频显示了如何使用“填充”手柄创建日期系列。 然后说明如何使用键盘快捷键在所有选定的单元格中输入相同的日期。

    I created this with the latest version of Camtasia Studio, which has a new feature that captures keyboard shortcuts, and can show the key combinations in the video.

    我使用最新版本的Camtasia Studio创建的,它具有捕捉键盘快捷键并可以在视频中显示按键组合的新功能。

    演示地址

    更多Excel快捷方式 (More Excel Shortcuts)

    See more Excel keyboard shortcut on my Contextures website. There is an interactive list of shortcuts that you can search and filter. You can also download an Excel workbook with a list of shortcuts.

    在我的Contextures网站上查看更多Excel 键盘快捷键 。 有一个交互式的快捷方式列表,您可以搜索和过滤。 您还可以下载带有快捷方式列表的Excel工作簿。

    ______

    ______

    翻译自: https://contexturesblog.com/archives/2010/05/19/autofill-excel-dates-in-series-or-same-date/

    excel日期怎么间隔填充

    展开全文
  • excel表中利用IF函数按最新日期(条件)查询返回不重复的记录
  • excel图表配合下拉菜单 从下拉列表中选择Excel图表日期 (Select Excel Chart Dates From a Drop Down List) Instead of showing all the data in a chart, you can select a specific date range, and show only the...

    excel图表配合下拉菜单

    Instead of showing all the data in a chart, you can select a specific date range, and show only the data from that period. In this example, drop down lists of dates are created with data validation. Select Excel chart dates from a drop down list, and the chart changes to show the new range.

    您可以选择一个特定的日期范围,而仅显示该期间的数据,而不是在图表中显示所有数据。 在此示例中,日期下拉列表是通过数据验证创建的。 从下拉列表中选择Excel图表日期,图表将更改以显示新范围。

    ChartSelectDateRange

    To create this dynamic chart in Excel 2007, you can create a table from the chart data, then create named ranges, and use those names in the chart.

    若要在Excel 2007中创建此动态图表,可以从图表数据中创建一个表,然后创建命名范围,并在图表中使用这些名称。

    为图表数据创建Excel表 (Create an Excel Table for the Chart Data)

    [Note: Please see the post, Problems With Dynamic Charts in Excel and ignore this step -- the Excel Table may cause problems.]

    [ 注意 :请参阅“ Excel中的动态图表问题”一文,而忽略此步骤-Excel表可能会引起问题。]

    1. On the Chart sheet, select a cell in the chart data, e.g. cell A1

      在图表工作表上,在图表数据中选择一个单元格,例如单元格A1
    2. On the Ribbon, click the Insert tab, then click Table

      在功能区上,单击“插入”选项卡,然后单击“表”。
    3. In the Create Table dialog box, click OK, to create the table for the selected range.

      在“创建表”对话框中,单击“确定”,以为所选范围创建表。
    CreateTableOK

    命名开始日期和结束日期单元格 (Name the Start Date and End Date cells)

    1. On the Chart sheet, select the Start Date cell (F17)

      在图表工作表上,选择开始日期单元格(F17)
    2. In the Name box, type StartDate then press Enter, to name the cell

      在“名称”框中,键入StartDate,然后按Enter,以命名该单元格
    3. Select the End Date cell I17, and in the Name Box type EndDate, then press Enter

      选择“结束日期”单元格I17,然后在“名称框”中键入EndDate,然后按Enter。
    RibbonNameBox

    命名图表日期范围 (Name the Chart Date Range)

    [Note: Because you did not create an Excel Table, as advised above, use the following formula in step 3, to create a dynamic range for the ChartDates: =OFFSET(Chart!$A$1,1,0,COUNT(Chart!$A:$A),1)

    [ 注意 :因为没有按照上面的建议创建Excel表,所以在步骤3中使用以下公式为ChartDates创建动态范围:= OFFSET(Chart!$ A $ 1,1,0,COUNT(Chart! $ A:$ A),1)

    1. On the Ribbon, click the Formulas tab, then click Define Name

      在功能区上,单击“公式”选项卡,然后单击“定义名称”
    2. Type ChartDates as the name for the range

      键入ChartDates作为范围的名称
    3. Click in the Refers To box, and select the Chart Dates (A2:A23) on the worksheet.

      单击“引用到”框,然后在工作表上选择“图表日期”(A2:A23)。

      Because this range is in an Excel Table, the reference will automatically change to show the

      由于此范围位于Excel表中,因此引用将自动更改为显示

      table name and column name, Table1[Date]

      表名和列名,Table1 [Date]

    4. Click OK

      点击确定
    NewNameDialog_Table

    创建开始日期和结束日期下拉菜单 (Create the Start Date and End Date dropdowns)

    1. On the Chart sheet, select the Start Date cell (F17)

      在图表工作表上,选择开始日期单元格(F17)
    2. On the Ribbon, click the Data tab, then click Data Validation

      在功能区上,单击“数据”选项卡,然后单击“数据验证”
    3. From the Allow dropdown, select List

      从“允许”下拉列表中,选择“列表”
    4. In the Formula box type: =ChartDates

      在“公式”框中,键入:= ChartDates
    5. Click OK, then repeat these steps to create a dropdown for the End Date.

      单击“确定”,然后重复这些步骤以创建“结束日期”下拉列表。
    DataValStartDates

    定义X和Y值的命名范围: (Define the named ranges for X and Y values:)

    1. On the Ribbon, click the Formulas tab, then click Define Name

      在功能区上,单击“公式”选项卡,然后单击“定义名称”
    2. Type a name for the series: XValues

      键入系列的名称:XValues
    3. From the Scope dropdown, select the data sheet name, Chart

      从范围下拉列表中,选择数据表名称,图表
    4. Type a formula that finds the start and end dates in the data:

      输入一个可在数据中找到开始和结束日期的公式:

      =OFFSET(Chart!$A$2,MATCH(StartDate,ChartDates,0)-1,0,

      = OFFSET(图表!$ A $ 2,MATCH(StartDate,ChartDates,0)-1,0,

      MATCH(EndDate,ChartDates,0)-

      MATCH(EndDate,ChartDates,0)-

      MATCH(StartDate,ChartDates,0)+1,1)

      匹配(StartDate,ChartDates,0)+1,1)

    5. Click OK

      点击确定
    6. Follow the same steps to define the YValues named range, using the following Settings:

      使用以下设置,按照相同的步骤定义YValues命名范围:

      Name: Yvalues

      名称:Yvalues

      Scope: Chart

      范围:图表

      Refers To: =OFFSET(Chart!XValues,0,1)

      引用:= OFFSET(Chart!XValues,0,1)

    DefineName2007Scope

    创建图表 (Create the chart)

    1. Select a cell in the chart data

      在图表数据中选择一个单元格
    2. On the Ribbon, click Insert, then click Line in the Charts group

      在功能区上,单击“插入”,然后在“图表”组中单击“折线”
    3. Click the first Line chart option

      单击第一个折线图选项
    4. To hide the Legend, click the Ribbon's Layout tab, click Legend, and click None

      若要隐藏图例,请单击功能区的“布局”选项卡,单击“图例”,然后单击“无”。
    RibbonLineChart

    使图表动态 (Make the chart dynamic)

    1. Select the chart, and click the line to select it

      选择图表,然后单击线以将其选中
    2. In the formula bar, change the series formula, replacing cell references with range names:

      在公式栏中,更改系列公式,将单元格引用替换为范围名称:

      =SERIES(Chart!$B$1,Chart!XValues,Chart!YValues,1)

      = SERIES(图表!$ B $ 1,图表!XValues,图表!YValues,1)

    ChartSeriesFormulaBar

    测试图表 (Test the chart)

    1. Select a start and end date from the drop down lists, and the chart will display that range

      从下拉列表中选择开始和结束日期,图表将显示该范围

    Warning: If you select the entire range, the series formula will revert to absolute cell references instead of the named ranges. (This doesn't happen in earlier versions of Excel.)

    警告 :如果选择整个范围,则序列公式将恢复为绝对单元格引用,而不是命名范围。 (在早期版本的Excel中不会发生这种情况。)

    下载样本文件 (Download the Sample File)

    You can download the completed Excel 2007 sample file for Dynamic Date Range Charts.

    您可以为动态日期范围图表下载完整的Excel 2007示例文件。

    [Note: Please see the post, Problems With Dynamic Charts in Excel and download that sample file -- the Excel Table may cause problems.] _________________

    [ 注意 :请参阅帖子“ Excel中的动态图表问题”并下载该示例文件-Excel表可能会引起问题。] _________________

    翻译自: https://contexturesblog.com/archives/2009/05/03/select-excel-chart-dates-from-a-drop-down-list/

    excel图表配合下拉菜单

    展开全文
  • Excel 日期时间格式讲解

    千次阅读 2017-11-03 15:24:29
    1.Excel日期时间1.1 存储格式 Excel日期时间以1900-1-1 00:00:00为起点 Excel日期时间格式单元格类型为Numeric,表示Excel日期时间内部以double数值存储 double整数部分表示日期,表示自1900-1-1来的天数 ...

    1.Excel中日期时间

    1.1 存储格式

    • Excel中日期时间格式单元格类型为Numeric,表示Excel日期时间内部以double数值存储
    • Excel中日期时间以浮点值存储,以1900-01-01 00:00:00为起点
    • 浮点值整数部分代表日期,表示自1900-01-01起的天数
    • 浮点值小数部分代表时间
    • 浮点值1.0表示1900-01-01 00:00:00
    • Excel提供了将浮点值d转换为日期时间date的方法
      a. d在区间(-~, 0) 表示无效日期时间
      b. d在区间[0, 1) 转换为 日期时间区间[1899-12-31 00:00:00, 1900-01-01 00:00:00)
      c. d在区间[1, +~) 转换为 日期时间区间[1900-01-01 00:00:00, yyyy-MM-dd HH:mm:ss)

    • Excel提供了将日期时间date转换为浮点值d的方法
      a. date在区间(-~, 1900-01-01 00:00:00) 转换为 d = -1,表示无效日期时间
      b. date = 1900-01-01 00:00:00 转换为 d = 1.0
      c. date在区间(1900-01-01 00:00:00, +~) 转换为 d > 1.0
      这里写图片描述

    1.2 日期时间转double方法

    org.apache.poi.ss.usermodel.DateUtil

    /**
     * 将一个给的的日期转换为一个double类型的数值,代表日期在Excel内部的表现形式
     * double的整数部分表示自1900年1月1日以来的天数,小数表示时分秒
     * @param date : date
     * @param use1904windowing : true-使用1904年的日期窗口,false-使用1900年的日期窗口
     * @return 返回日期的Excel表示(如果错误 -检查小于0.1, 返回-1)
     * */
    public static double getExcelDate(Date date) // 默认使用1900窗口
    public static double getExcelDate(Date date, boolean use1904windowing)

    1.3 日期时间转double实例

    package org.apache.poi.util;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.apache.poi.ss.usermodel.DateUtil;
    
    public class Date2DoubleTest {
    
        public static void main(String[] args) throws Exception {
            System.out.println("小于1900-01-01 00:00:00的日期返回-1");
            System.out.println("日期1800-01-01 00:00:00 转换为double值为: " + formatDouble("1800-01-01 00:00:00"));
            System.out.println("日期1899-01-01 00:00:00 转换为double值为: " + formatDouble("1899-01-01 00:00:00"));
            System.out.println("日期1899-12-31 23:24:25 转换为double值为: " + formatDouble("1899-12-31 23:24:25"));
            System.out.println("日期1900-01-01 00:00:00 转换为double值为: " + formatDouble("1900-01-01 00:00:00"));
            System.out.println("日期1900-01-01 11:11:11 转换为double值为: " + formatDouble("1900-01-01 11:11:11"));
            System.out.println("日期1900-01-01 22:22:22 转换为double值为: " + formatDouble("1900-01-01 22:22:22"));
            System.out.println("日期1900-01-01 23:22:22 转换为double值为: " + formatDouble("1900-01-01 23:22:22"));
            System.out.println("日期1900-01-02 00:00:00 转换为double值为: " + formatDouble("1900-01-02 00:00:00"));
            System.out.println("日期1900-01-03 00:00:00 转换为double值为: " + formatDouble("1900-01-03 00:00:00"));
            System.out.println("日期2017-11-12 13:14:15 转换为double值为: " + formatDouble("2017-11-12 13:14:15"));
        }
    
        public static double formatDouble (String dateStr) throws Exception {
            SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
            Date date = dateFormat2.parse(dateStr); 
            return formatDouble(date);
        }
    
        /**
         * 将java.util.Date转换为double值
         * */
        public static double formatDouble (Date date) {
            double excelDate = DateUtil.getExcelDate(date);
    
            return excelDate;
        }
    }

    执行结果:

    小于1900-01-01 00:00:00的日期返回-1
    日期1800-01-01 00:00:00 转换为double值为: -1.0
    日期1899-01-01 00:00:00 转换为double值为: -1.0
    日期1899-12-31 23:24:25 转换为double值为: -1.0
    日期1900-01-01 00:00:00 转换为double值为: 1.0
    日期1900-01-01 11:11:11 转换为double值为: 1.466099537037037
    日期1900-01-01 22:22:22 转换为double值为: 1.9321990740740742
    日期1900-01-01 23:22:22 转换为double值为: 1.9738657407407407
    日期1900-01-02 00:00:00 转换为double值为: 2.0
    日期1900-01-03 00:00:00 转换为double值为: 3.0
    日期2017-11-12 13:14:15 转换为double值为: 43051.5515625

    这里写图片描述

    1.4 double转日期时间方法

    org.apache.poi.ss.usermodel.DateUtil

    /**
     * 将一个double类型的数值根据Excel内部日期格式转换为一个java.util.Date
     * 
     * 注意:
     * Excel日期和时间存储没有任何时区(TimeZone)信息
     * 如果默认的TimeZone使用了夏令时(Daylight Saving Time),则转换回Excel日期可能不会产生相同的值
     * 
     * @param date Excel内部日期值,一个double类型的数值
     * @param use1904windowing true-使用1904年的日期窗口,false-使用1900年的日期窗口
     * @param tz 对应的时区,如果为null,使用系统默认时区
     * @param roundSeconds 是否round最接近的秒,默认false
     * @return 日期的Java表示形式,如果日期不是有效的Excel日期,则为null
     * */
    public static Date getJavaDate(double date)
    public static Date getJavaDate(double date, boolean use1904windowing)
    public static Date getJavaDate(double date, TimeZone tz) // 使用时区tz去格式化日期
    public static Date getJavaDate(double date, boolean use1904windowing, TimeZone tz)
    public static Date getJavaDate(double date, boolean use1904windowing, TimeZone tz, boolean roundSeconds)

    1.5 double转日期时间实例

    package org.apache.poi.util;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.apache.poi.ss.usermodel.DateUtil;
    
    public class Double2DateTest {
        public static void main(String[] args) {
            /**
             * double转换为java.util.Date
             * */
            System.out.println("double :    -1.0                转换为日期时间为:  " + formatDate(-1));
            System.out.println("double :    0.00000000000001    转换为日期时间为:  " + formatDate(0.00000000000001));
            System.out.println("double :    0.55555555555555    转换为日期时间为:  " + formatDate(0.55555555555555));
            System.out.println("double :    0.77777777777777    转换为日期时间为:  " + formatDate(0.77777777777777));
            System.out.println("double :    1.0                 转换为日期时间为:  " + formatDate(1.0));
            System.out.println("double :    1.466099537037037   转换为日期时间为:  " + formatDate(1.466099537037037));
            System.out.println("double :    1.9321990740740742  转换为日期时间为:  " + formatDate(1.9321990740740742));
            System.out.println("double :    1.9738657407407407  转换为日期时间为:  " + formatDate(1.9738657407407407));
            System.out.println("double :    2.0                 转换为日期时间为:  " + formatDate(2.0));
            System.out.println("double :    3.0                 转换为日期时间为:  " + formatDate(3.0));
            System.out.println("double :    43051.5515625       转换为日期时间为:  " + formatDate(43051.5515625));
        }
    
        /**
         * 将double值转换为java.util.Date
         * 1. 负数               -> 小于0,表示无效日期
         * 2. 1                -> 1900-1-1 00:00:00
         * 3. 43081.5091898148 -> 2017-12-12 12:13:14
         * @param value 
         * */
        public static String formatDate(double value) {
            if (!DateUtil.isValidExcelDate(value)) {
                // value<0表示是无效日期
                return "小于0,表示无效日期";
            }
            // HH表示24进制,hh是12进制
            return formatDate(value, "yyyy-MM-dd HH:mm:ss");
        }
    
        public static String formatDate(double value, String formatString) {
            SimpleDateFormat sdf = new SimpleDateFormat(formatString);
    //      Date date = DateUtil.getJavaDate(value); 
            // 以1900-1-1 00:00::00为起点
            Date date = DateUtil.getJavaDate(value, false);
    
            // 以1900-1-1 00:00::00为起点
    //      Date date = DateUtil.getJavaDate(value, true);
    
            return sdf.format(date);
        }
    }

    执行结果:
    以1900-1-1 00:00:00为起点

    double :    -1.0                转换为日期时间为:  小于0,表示无效日期
    double :    0.00000000000001    转换为日期时间为:  1899-12-31 00:00:00
    double :    0.55555555555555    转换为日期时间为:  1899-12-31 13:20:00
    double :    0.77777777777777    转换为日期时间为:  1899-12-31 18:40:00
    double :    1.0                 转换为日期时间为:  1900-01-01 00:00:00
    double :    1.466099537037037   转换为日期时间为:  1900-01-01 11:11:11
    double :    1.9321990740740742  转换为日期时间为:  1900-01-01 22:22:22
    double :    1.9738657407407407  转换为日期时间为:  1900-01-01 23:22:22
    double :    2.0                 转换为日期时间为:  1900-01-02 00:00:00
    double :    3.0                 转换为日期时间为:  1900-01-03 00:00:00
    double :    43051.5515625       转换为日期时间为:  2017-11-12 13:14:15

    这里写图片描述

    2.Excel日期单元格样式

    • Excel支持日期单元格
    • 日期值对应的是Excel内部日期double值的证书部分,表示自1900-1-1以来的天数

    2.1 Excel日期样式

    使用Excel或WPS设置单元格样式,会看到已经定义了日期样式

    2.1.1 对话框-已定义日期样式

    这里写图片描述

    2.1.2 对话框-自定义日期样式

    这里写图片描述

    2.2 Excel中已定义日期样式

    [$-804]表示国家或地区(语言)编号,一般可以不填。
    如804 汉语 (中国)
    809 英语(英国)
    409 英语(美国)
    如果电脑上没有装相应的语言(可以设),把804改掉都不会影响显示结果。
    
    [$-F800]相对于是 yyyy-m-d"
    [$-F400]相对于是 h:mm:ss
    
    [dbnum1]是将阿拉伯数字转换为汉字,如:123转换为一二三
    [dbbun2]是转换成大写汉字,如:123转换为壹贰叁
    [dbnum3]是转换为全角数字,如:123转换为 123
    d代表日期之中的日,m日期中的月,y日期中的年,h日期中的小时,m日期中的分,s是日期中的秒
    
    [$-F800]dddd, mmmm dd, yyyy
    [DBNum1][$-804]yyyy"年"m"月"d"日";@
    [DBNum1][$-804]yyyy"年"m"月";@
    [DBNum1][$-804]m"月"d"日";@
    yyyy"年"m"月"d"日";@
    yyyy"年"m"月";@
    m"月"d"日";@
    [$-804]aaaa;@
    [$-804]aaa;@
    yyyy/m/d;@
    [$-409]yyyy/m/d h:mm AM/PM;@
    yyyy/m/d h:mm;@
    yy/m/d;@
    m/d;@
    m/d/yy;@
    mm/dd/yy;@
    [$-409]d-mmm;@
    [$-409]d-mmm-yy;@
    [$-409]dd-mmm-yy;@
    [$-409]mmm-yy;@
    [$-409]mmmm-yy;@
    [$-409]mmmm-yy;@
    [$-409]mmmmm;@
    [$-409]mmmmm-yy;@

    2.3 Excel 2007中日期样式存储格式

    2.3.1 当前Sheet日期单元格

    这里写图片描述

    2.3.2 当前Sheet存储XML

    这里写图片描述

    2.3.3 当前Sheet单元格样式存储XML

    这里写图片描述

    2.4 验证日期样式字符串

    org.apache.poi.ss.usermodel.DateUtil提供方法验证

    package org.apache.poi.util;
    
    import org.apache.poi.ss.usermodel.DateUtil;
    
    /**
     * 验证Excel中已定义的日期格式
     * org.apache.poi.ss.usermodel.DateUtil
     * 
     * [$-804]表示国家或地区(语言)编号,一般可以不填。
     * 如804 汉语 (中国)
     *  809 英语(英国)
     *  409 英语(美国)
     * 如果电脑上没有装相应的语言(可以设),把804改掉都不会影响显示结果。
     * 
     * [$-F800]相对于是 yyyy-m-d"
     * [$-F400]相对于是 h:mm:ss
     * 
     * [dbnum1]是将阿拉伯数字转换为汉字,如:123转换为一二三
     * [dbbun2]是转换成大写汉字,如:123转换为壹贰叁
     * [dbnum3]是转换为全角数字,如:123转换为 123
     * d代表日期之中的日,m日期中的月,y日期中的年,h日期中的小时,m日期中的分,s是日期中的秒
     * */
    public class DateFormatTest {
        public static void main(String[] args) {
            System.out.println("字符串 - [$-F800]dddd\\,\\ mmmm\\ dd\\,\\ yyyy  是否是日期格式: " + DateUtil.isADateFormat(176, "[$-F800]dddd\\,\\ mmmm\\ dd\\,\\ yyyy"));
            System.out.println("字符串 - [DBNum1][$-804]yyyy\"年\"m\"月\"d\"日 	 是否是日期格式: " + DateUtil.isADateFormat(177, "[DBNum1][$-804]yyyy\"年\"m\"月\"d\"日"));
            System.out.println("字符串 - [DBNum1][$-804]yyyy\"年\"m\"月\";@  	是否是日期格式: " + DateUtil.isADateFormat(178, "[DBNum1][$-804]yyyy\"年\"m\"月\";@"));
            System.out.println("字符串 - [DBNum1][$-804]m\"月\"d\"日\";@  	是否是日期格式: " + DateUtil.isADateFormat(179, "[DBNum1][$-804]m\"月\"d\"日\";@"));
            System.out.println("字符串 - yyyy\"年\"m\"月\"d\"日\";@       是否是日期格式: " + DateUtil.isADateFormat(180, "yyyy\"年\"m\"月\"d\"日\";@"));
            System.out.println("字符串 - yyyy\"年\"m\"月\";@             是否是日期格式: " + DateUtil.isADateFormat(181, "yyyy\"年\"m\"月\";@"));
            System.out.println("字符串 - m\"月\"d\"日\";@            是否是日期格式: " + DateUtil.isADateFormat(182, "m\"月\"d\"日\";@"));
            System.out.println("字符串 - [$-804]aaaa;@  			是否是日期格式: " + DateUtil.isADateFormat(183, "[$-804]aaaa;@"));
            System.out.println("字符串 - [$-804]aaa;@  			是否是日期格式: " + DateUtil.isADateFormat(184, "[$-804]aaa;@"));
            System.out.println("字符串 - yyyy/m/d;@            是否是日期格式: " + DateUtil.isADateFormat(185, "yyyy/m/d;@"));
            System.out.println("字符串 - [$-409]yyyy/m/d\\ h:mm\\ AM/PM;@    是否是日期格式: " + DateUtil.isADateFormat(186, "[$-409]yyyy/m/d\\ h:mm\\ AM/PM;@"));
            System.out.println("字符串 - yyyy/m/d\\ h:mm;@         是否是日期格式: " + DateUtil.isADateFormat(187, "yyyy/m/d\\ h:mm;@"));
            System.out.println("字符串 - yy/m/d;@              是否是日期格式: " + DateUtil.isADateFormat(188, "yy/m/d;@"));
            System.out.println("字符串 - m/d;@                 是否是日期格式: " + DateUtil.isADateFormat(189, "m/d;@"));
            System.out.println("字符串 - m/d/yy;@              是否是日期格式: " + DateUtil.isADateFormat(190, "m/d/yy;@"));
            System.out.println("字符串 - mm/dd/yy;@            是否是日期格式: " + DateUtil.isADateFormat(191, "mm/dd/yy;@"));
            System.out.println("字符串 - [$-409]d\\-mmm;@  			是否是日期格式: " + DateUtil.isADateFormat(192, "[$-409]d\\-mmm;@"));
            System.out.println("字符串 - [$-409]d\\-mmm\\-yy;@  		是否是日期格式: " + DateUtil.isADateFormat(193, "[$-409]d\\-mmm\\-yy;@"));
            System.out.println("字符串 - [$-409]dd\\-mmm\\-yy;@  		是否是日期格式: " + DateUtil.isADateFormat(194, "[$-409]dd\\-mmm\\-yy;@"));
            System.out.println("字符串 - [$-409]mmm\\-yy;@  		是否是日期格式: " + DateUtil.isADateFormat(195, "[$-409]mmm\\-yy;@"));
            System.out.println("字符串 - [$-409]mmmm\\-yy;@  		是否是日期格式: " + DateUtil.isADateFormat(196, "[$-409]mmmm\\-yy;@"));
            System.out.println("字符串 - [$-409]mmmmm;@  			是否是日期格式: " + DateUtil.isADateFormat(197, "[$-409]mmmmm;@"));
            System.out.println("字符串 - [$-409]mmmmm\\-yy;@  		是否是日期格式: " + DateUtil.isADateFormat(198, "[$-409]mmmmm\\-yy;@"));
        }
    }

    执行结果:

    字符串 - [$-F800]dddd\,\ mmmm\ dd\,\ yyyy  是否是日期格式: true
    字符串 - [DBNum1][$-804]yyyy"年"m"月"d"日     是否是日期格式: true
    字符串 - [DBNum1][$-804]yyyy"年"m"月";@     是否是日期格式: true
    字符串 - [DBNum1][$-804]m"月"d"日";@    是否是日期格式: true
    字符串 - yyyy"年"m"月"d"日";@         是否是日期格式: true
    字符串 - yyyy"年"m"月";@             是否是日期格式: true
    字符串 - m"月"d"日";@            是否是日期格式: true
    字符串 - [$-804]aaaa;@            是否是日期格式: false
    字符串 - [$-804]aaa;@             是否是日期格式: false
    字符串 - yyyy/m/d;@            是否是日期格式: true
    字符串 - [$-409]yyyy/m/d\ h:mm\ AM/PM;@    是否是日期格式: true
    字符串 - yyyy/m/d\ h:mm;@          是否是日期格式: true
    字符串 - yy/m/d;@              是否是日期格式: true
    字符串 - m/d;@                 是否是日期格式: true
    字符串 - m/d/yy;@              是否是日期格式: true
    字符串 - mm/dd/yy;@            是否是日期格式: true
    字符串 - [$-409]d\-mmm;@              是否是日期格式: true
    字符串 - [$-409]d\-mmm\-yy;@          是否是日期格式: true
    字符串 - [$-409]dd\-mmm\-yy;@         是否是日期格式: true
    字符串 - [$-409]mmm\-yy;@         是否是日期格式: true
    字符串 - [$-409]mmmm\-yy;@        是否是日期格式: true
    字符串 - [$-409]mmmmm;@           是否是日期格式: true
    字符串 - [$-409]mmmmm\-yy;@       是否是日期格式: true

    这里写图片描述

    3. Excel 时间单元格样式

    • Excel单元格也支持时间单元格
    • 时间值对应的是Excel内部时间double值的小数部分

    3.1 Excel时间样式

    使用Excel或WPS设置单元格样式,会看到已经定义了时间样式,我们主要讲解的就是这些时间样式:

    3.1.1 对话框-已定义时间样式

    这里写图片描述

    3.1.2 对话框-自定义时间样式

    这里写图片描述

    3.2 Excel中已定义时间样式

    两种设置时间样式一共有19种已经定义的时间样式,内置的时间样式索引小于50,自定义样式索引从164开始:

     - 索引         时间样式字符串
     - 18,       "h:mm AM/PM"  
     - 19,       "h:mm:ss AM/PM"  
     - 20,       "h:mm"  
     - 21,       "h:mm:ss"  
     - 22,       "m/d/yy h:mm"  
     - 45,       "mm:ss"  
     - 46,       "[h]:mm:ss"  
     - 47,       "mm:ss.0" 
     - 
     - 176    [DBNum1][$-804]上午/下午h"时"mm"分";@
     - 177    [DBNum1][$-804]h"时"mm"分";@
     - 178    [$-409]h:mm:ss\ AM/PM;@
     - 179    [$-409]h:mm\ AM/PM;@
     - 180    [$-F400]h:mm:ss\ AM/PM
     - 181    h:mm;@
     - 182    h:mm:ss;@
     - 183    h"时"mm"分";@
     - 184    h"时"mm"分"ss"秒";@
     - 185    上午/下午h"时"mm"分";@
     - 186    上午/下午h"时"mm"分"ss"秒";@ 

    3.3 Excel 2007中时间样式存储格式

    3.3.1 当前Sheet时间单元格

    这里写图片描述

    3.3.2 当前Sheet存储XML

    这里写图片描述

    3.3.3 当前Sheet单元格样式存储XML

    这里写图片描述

    3.4 验证时间样式字符串

    提供方法实现验证一个单元格是否为一个时间单元格:
    - 时间单元格原始值为double
    - 时间单元格样式为时间字符串
    这里提供方法解析单元格样式字符串,验证其是否为时间样式字符串,工具类:

    package org.apache.poi.util;
    
    import java.util.regex.Pattern;
    
    /**
     * 主要用于处理导入excel中日期时间格式, 
     * 参考org.apache.poi.ss.usermodel.DateUtil
     * */
    public class DateTimeUtil {
    
        protected DateTimeUtil() {
            // no instances of this class
        }
    
        // 描述无效的日期
    //  private static final int BAD_DATE = -1;
    
        public static final int SECONDS_PER_MINUTE = 60;
        public static final int MINUTES_PER_HOUR = 60;
        public static final int HOURS_PER_DAY = 24;
        // 一天等于86400秒
        public static final int SECONDS_PER_DAY = (HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE);
    
        // 一天等于86400 * 1000毫秒
        public static final long DAY_MILLISECONDS = SECONDS_PER_DAY * 1000L;
    
    //  private static final Pattern TIME_SEPARATOR_PATTERN = Pattern.compile(":");
    
        /**
         * 符号. : 匹配除换行符 \n 之外的任何单字符
         * 符号* : 匹配前面的子表达式零次或多次
         * 符号+ : 匹配前面的子表达式一次或多次
         * 符号? : 匹配前面的子表达式零次或一次
         * 
         * *、 +限定符都是贪婪的,因为它们会尽可能多的匹配文字
         * 通过在 *、 + 或 ? 限定符之后放置 ?(*?、 +?、 ??),该表达式从"贪心"表达式转换为"非贪心"表达式或者最小匹配
         * */
    
        // ^[\$\-.*?] : 匹配以[$-开头,中间为除换行符 \n 之外的任何单字符,结尾为]的字符串,非贪心匹配
        private static final Pattern date_ptrn1 = Pattern.compile("^\\[\\$\\-.*?\\]");
    
        /**
         * 红色 : \u7ea2\u8272
         * 黑色 :\u9ed1\u8272
         * 黄色 :  \u9ec4\u8272
         * 绿色 : \u7eff\u8272
         * 白色 : \u9ed1\u8272
         * 蓝色 : \u84dd\u8272
         * 青色 : \u9752\u8272
         * 洋红 : \u6d0b\u7ea2
         * */
        // ^[[a-zA-Z]+] : 匹配以[开头, ]结尾, 中间至少一个字母的字符串,如颜色
        private static final Pattern date_ptrn2 = Pattern.compile("^\\[[a-zA-Z\u7ea2\u9ed1\u9ec4\u7eff\u84dd\u9752\u6d0b\u7ea2\u8272]+\\]");
    
        // [yYmMdDhHsS] : 匹配中括号里任一字母, 匹配一个
        private static final Pattern date_ptrn3a = Pattern.compile("[mhHsS]");
    
        /**
         * 为中文/日文日期格式添加Unicode编码:如2017 \u5e74 2 \u6708 7 \u65e5
         * Unicode编码  : 中文
         *    \u5e74 : 年
         *    \u6708 : 月
         *    \u65e5 : 日
         *    \u4e0a : 上
         *    \u4e0b : 下
         *    \u5348 : 午
         *    
         * ^[\[\]mhHsS\-T/时分秒(上午/下午),. :"\\]+0*[ampAMP/]*$
         * */
        private static final Pattern date_ptrn3b = Pattern.compile("^[\\[\\]yYmMdDhHsS\\-T/\u65f6\u5206\u79d2(\u4e0a\u5348/\u4e0b\u5348),. :\"\\\\]+0*[ampAMP/]*$");
    
        // ^\[([hH]+|[mM]+|[sS]+)] : 匹配以[开头, 以]结尾, 中间为时、分或秒的时间字符
        private static final Pattern date_ptrn4 = Pattern.compile("^\\[([hH]+|[mM]+|[sS]+)\\]");
    
        // 匹配以[DBNum1]、[DBNum2]或[DBNum3]开头的中文日期
        private static final Pattern date_ptrn5 = Pattern.compile("^\\[DBNum(1|2|3)\\]");
    
        /**
         * 性能优化的变量:
         * 如果一个相同的日期格式字符串被多次传递,避免重复检查DataUtil.isADateFormat(int, String)
         * https://issues.apache.org/bugzilla/show_bug.cgi?id=55611
         * */
        private static ThreadLocal<Integer> lastFormatIndex = new ThreadLocal<Integer>() {
            protected Integer initialValue() {
                return -1;
            }
        };
        private static ThreadLocal<String> lastFormatString = new ThreadLocal<String>();
        private static ThreadLocal<Boolean> lastCachedResult = new ThreadLocal<Boolean>();
    
        /**
         * 当前格式是否缓存过
         * @param formatString 格式化字符串
         * @param formatIndex 格式化索引
         * */
        private static boolean isCached(String formatString, int formatIndex) {
            String cachedFormatString = lastFormatString.get();
            return cachedFormatString != null && 
                         formatIndex == lastFormatIndex.get() && 
                         formatString.equals(cachedFormatString);
        }
    
        /**
         * 缓存当前格式
         * @param formatString 格式化字符串
         * @param formatIndex 格式化索引
         * @param cached 是否已经缓存过
         * */
        private static void cache(String formatString, int formatIndex, boolean cached) {
            lastFormatIndex.set(formatIndex);
            lastFormatString.set(formatString);
            lastCachedResult.set(Boolean.valueOf(cached));
        }
    
        /**
         * 检查给定格式ID及其格式String是否表示时间格式。
         * 1. 调用此方法之前org.apache.poi.ss.usermodel.DateUtil.isADateFormat(formatIndex, formatString)
         *      首先确保是一个日期格式
         * 2. 再检查是否为时间格式
         *
         * @param formatIndex 格式索引
         * @param formatString 格式字符串
         */
        public static boolean isADateTimeFormat(int formatIndex, String formatString) {
            if(isInternalDateTimeFormat(formatIndex)) {
                cache(formatString, formatIndex, true);
                return true;
            }
    
            if(formatString == null || formatString.length() == 0) {
                return false;
            }
    
            // 检查是否缓存过,提高性能
            if (isCached(formatString, formatIndex)) {
                return lastCachedResult.get();
            }
    
            String fs = formatString;
            final int length = fs.length();
            StringBuilder sb = new StringBuilder(length);
            for (int i = 0; i < length; i++) {
                char c = fs.charAt(i);
                if (i < length - 1) {
                    char nc = fs.charAt(i + 1);
                    if (c == '\\') {// 处理转义字符
                        switch (nc) {
                            case '-': // \-表示
                            case ',':
                            case '.':
                            case ' ':
                            case '\\':
                                // skip current '\' and continue to the next char
                                continue;
                        }
                    } else if (c == ';' && nc == '@') {// 跳过;@
                        i++;
                        continue;
                    }
                }
                sb.append(c);
            }
            fs = sb.toString();
    
            // short-circuit if it indicates elapsed time: [h], [m] or [s]
            if(date_ptrn4.matcher(fs).matches()){
                cache(formatString, formatIndex, true);
                return true;
            }
    
            // 处理以[DBNum1]、 [DBNum2]或[DBNum3]开头的时间格式:[DBNum1][$-804]h"时"mm"分";@
            fs = date_ptrn5.matcher(fs).replaceAll("");
    
            // 处理匹配[$-...]的时间格式:[$-F400]h:mm:ss\ AM/PM
            fs = date_ptrn1.matcher(fs).replaceAll("");
    
            // 匹配以[开头, ]结尾, 中间至少一个字母的字符串,如带颜色的时间格式:[Yellow]h:mm:ss AM/PM
            fs = date_ptrn2.matcher(fs).replaceAll("");
    
            // 日期格式为dd / mm / yy; [red] dd / mm / yy,只处理第一个
            final int separatorIndex = fs.indexOf(';');
            if(0 < separatorIndex && separatorIndex < fs.length()-1) {
                fs = fs.substring(0, separatorIndex);
            }
    
            // 处理时间格式
            if (! date_ptrn3a.matcher(fs).find()) {
                return false;
            }
    
            /**
             * 到了这里,检查它只是由以下组成:  m h s - \ /,。 :[] T
             * 可选地跟随AM / PM
             * */
            boolean result = date_ptrn3b.matcher(fs).matches();
            cache(formatString, formatIndex, result);
            return result;
        }
    
        /**
         * 给定的日期格式索引是否为Excel内置日期时间格式
         * @param format 日期格式索引
         */
        public static boolean isInternalDateTimeFormat(int format) {
            switch(format) {
                // Excel内部时间格式
                //          0x12,       "h:mm AM/PM"  
                //          0x13,       "h:mm:ss AM/PM"  
                //          0x14,       "h:mm"  
                //          0x15,       "h:mm:ss"  
                //          0x16,       "m/d/yy h:mm"  
                //          0x2d,       "mm:ss"  
                //          0x2e,       "[h]:mm:ss"  
                //          0x2f,       "mm:ss.0"  
                case 0x12:
                case 0x13:
                case 0x14:
                case 0x15:
                case 0x16:
                case 0x2d:
                case 0x2e:
                case 0x2f:
                    return true;
            }
            return false;
        }
    
        /**
         * 检查给定的double数值是否是有效的Excel日期
         * value>=0,表示是有效日期
         */
        public static boolean isValidExcelDate(double value) {
            return (value > -Double.MIN_VALUE);
        }
    
        /************************ 以下是org.apache.poi.ss.usermodel.DateUtil常用方法   ******************************/
    
        /**
         * 将一个给的的日期转换为一个double类型的数值,代表日期在Excel内部的表现形式
         * double的整数部分表示自1900年1月1日以来的天数,小数表示时分秒
         * @param date : date
         * @param use1904windowing : true-使用1904年的日期窗口,false-使用1900年的日期窗口
         * @return 返回日期的Excel表示(如果错误 -检查小于0.1, 返回-1)
         * */
    //  public static double getExcelDate(Date date) // 默认使用1900窗口
    //  public static double getExcelDate(Date date, boolean use1904windowing)
    
        /**
         * 将一个double类型的数值根据Excel内部日期格式转换为一个java.util.Date
         * 
         * 注意:
         * Excel日期和时间存储没有任何时区(TimeZone)信息
         * 如果默认的TimeZone使用了夏令时(Daylight Saving Time),则转换回Excel日期可能不会产生相同的值
         * 
         * @param date Excel内部日期值,一个double类型的数值
         * @param use1904windowing true-使用1904年的日期窗口,false-使用1900年的日期窗口
         * @param tz 对应的时区,如果为null,使用系统默认时区
         * @param roundSeconds 是否round最接近的秒,默认false
         * @return 日期的Java表示形式,如果日期不是有效的Excel日期,则为null
         * */
    //  public static Date getJavaDate(double date)
    //  public static Date getJavaDate(double date, boolean use1904windowing)
    //  public static Date getJavaDate(double date, TimeZone tz) // 使用时区tz去格式化日期
    //  public static Date getJavaDate(double date, boolean use1904windowing, TimeZone tz)
    //  public static Date getJavaDate(double date, boolean use1904windowing, TimeZone tz, boolean roundSeconds)
    
        /**
         * 将一个格式为HH:MM或HH:MM:SS的时间字符串转换为Excel日期格式的double数值,一个小数
         * @param timeStr 如12:12、 12:12:12,timeStr长度小于4或大于8都会抛出异常
         * @return 返回一个0~1之间的数
         */
    //  public static double convertTime(String timeStr)
    //  private static double convertTimeInternal(String timeStr)
    }

    测试类:

    package org.apache.poi.util;
    
    /**
     * 
     * 索引         时间样式字符串
     * 18,       "h:mm AM/PM"  
     * 19,       "h:mm:ss AM/PM"  
     * 20,       "h:mm"  
     * 21,       "h:mm:ss"  
     * 22,       "m/d/yy h:mm"  
     * 45,       "mm:ss"  
     * 46,       "[h]:mm:ss"  
     * 47,       "mm:ss.0" 
     * 
     * 176    [DBNum1][$-804]上午/下午h"时"mm"分";@
     * 177    [DBNum1][$-804]h"时"mm"分";@
     * 178    [$-409]h:mm:ss\ AM/PM;@
     * 179    [$-409]h:mm\ AM/PM;@
     * 180    [$-F400]h:mm:ss\ AM/PM
     * 181    h:mm;@
     * 182    h:mm:ss;@
     * 183    h"时"mm"分";@
     * 184    h"时"mm"分"ss"秒";@
     * 185    上午/下午h"时"mm"分";@
     * 186    上午/下午h"时"mm"分"ss"秒";@ 
     * */
    public class TimeFormatTest {
        public static void main(String[] args) {
            System.out.println("Excel已定义时间格式字符串: ");
            System.out.println("字符串 - h:mm AM/PM                             是否是时间格式: " + DateTimeUtil.isADateTimeFormat(18, "h:mm AM/PM"));
            System.out.println("字符串 - h:mm:ss AM/PM                          是否是时间格式: " + DateTimeUtil.isADateTimeFormat(19, "h:mm:ss AM/PM"));
            System.out.println("字符串 - h:mm                                   是否是时间格式: " + DateTimeUtil.isADateTimeFormat(20, "h:mm"));
            System.out.println("字符串 - h:mm:ss                                是否是时间格式: " + DateTimeUtil.isADateTimeFormat(21, "h:mm:ss"));
            System.out.println("字符串 - m/d/yy h:mm                            是否是时间格式: " + DateTimeUtil.isADateTimeFormat(22, "m/d/yy h:mm"));
            System.out.println("字符串 - mm:ss                                  是否是时间格式: " + DateTimeUtil.isADateTimeFormat(45, "mm:ss"));
            System.out.println("字符串 - [h]:mm:ss                              是否是时间格式: " + DateTimeUtil.isADateTimeFormat(46, "[h]:mm:ss"));
            System.out.println("字符串 - mm:ss.0                                                                                           是否是时间格式: " + DateTimeUtil.isADateTimeFormat(47, "mm:ss.0"));
            System.out.println("字符串 - [DBNum1][$-804]上午/下午h\"时\"mm\"分\";@  是否是时间格式: " + DateTimeUtil.isADateTimeFormat(176, "[DBNum1][$-804]上午/下午h\"时\"mm\"分\";@"));
            System.out.println("字符串 - [DBNum1][$-804]h\"时\"mm\"分\";@          是否是时间格式: " + DateTimeUtil.isADateTimeFormat(177, "[DBNum1][$-804]h\"时\"mm\"分\";@"));
            System.out.println("字符串 - [$-409]h:mm:ss\\ AM/PM;@               是否是时间格式: " + DateTimeUtil.isADateTimeFormat(178, "[$-409]h:mm:ss\\ AM/PM;@"));
            System.out.println("字符串 - [$-409]h:mm\\ AM/PM;@                  是否是时间格式: " + DateTimeUtil.isADateTimeFormat(179, "[$-409]h:mm\\ AM/PM;@"));
            System.out.println("字符串 - [$-F400]h:mm:ss\\ AM/PM                是否是时间格式: " + DateTimeUtil.isADateTimeFormat(180, "[$-F400]h:mm:ss\\ AM/PM"));
            System.out.println("字符串 - h:mm;@                                 是否是时间格式: " + DateTimeUtil.isADateTimeFormat(181, "h:mm;@"));
            System.out.println("字符串 - h:mm:ss;@                              是否是时间格式: " + DateTimeUtil.isADateTimeFormat(182, "h:mm:ss;@"));
            System.out.println("字符串 - h\"时\"mm\"分\";@                        是否是时间格式: " + DateTimeUtil.isADateTimeFormat(183, "h\"时\"mm\"分\";@"));
            System.out.println("字符串 - h\"时\"mm\"分\"ss\"秒\";@                是否是时间格式: " + DateTimeUtil.isADateTimeFormat(184, "h\"时\"mm\"分\"ss\"秒\";@"));
            System.out.println("字符串 - 上午/下午h\"时\"mm\"分\";@                 是否是时间格式: " + DateTimeUtil.isADateTimeFormat(185, "上午/下午h\"时\"mm\"分\";@"));
            System.out.println("字符串 - 上午/下午h\"时\"mm\"分\"ss\"秒\";@          是否是时间格式: " + DateTimeUtil.isADateTimeFormat(186, "上午/下午h\"时\"mm\"分\"ss\"秒\";@"));
    
            System.out.println();
            System.out.println("Excel自定义时间格式字符串:");
            System.out.println("字符串 - [红色]上午/下午h\"时\"mm\"分\"ss\"秒\";@          是否是时间格式: " + DateTimeUtil.isADateTimeFormat(187, "[红色]上午/下午h\"时\"mm\"分\"ss\"秒\";@"));
            System.out.println("字符串 - [绿色]yyyy/mm/dd hh:mm          是否是时间格式: " + DateTimeUtil.isADateTimeFormat(188, "[绿色]yyyy/mm/dd hh:mm"));
        }
    }

    执行结果:

    Excel已定义时间格式字符串: 
    字符串 - h:mm AM/PM                            是否是时间格式: true
    字符串 - h:mm:ss AM/PM                         是否是时间格式: true
    字符串 - h:mm                                  是否是时间格式: true
    字符串 - h:mm:ss                               是否是时间格式: true
    字符串 - m/d/yy h:mm                           是否是时间格式: true
    字符串 - mm:ss                                 是否是时间格式: true
    字符串 - [h]:mm:ss                             是否是时间格式: true
    字符串 - mm:ss.0                                                                                           是否是时间格式: true
    字符串 - [DBNum1][$-804]上午/下午h"时"mm"分";@  是否是时间格式: true
    字符串 - [DBNum1][$-804]h"时"mm"分";@          是否是时间格式: true
    字符串 - [$-409]h:mm:ss\ AM/PM;@              是否是时间格式: true
    字符串 - [$-409]h:mm\ AM/PM;@                 是否是时间格式: true
    字符串 - [$-F400]h:mm:ss\ AM/PM               是否是时间格式: true
    字符串 - h:mm;@                               是否是时间格式: true
    字符串 - h:mm:ss;@                            是否是时间格式: true
    字符串 - h"时"mm"分";@                         是否是时间格式: true
    字符串 - h"时"mm"分"ss"秒";@                   是否是时间格式: true
    字符串 - 上午/下午h"时"mm"分";@                 是否是时间格式: true
    字符串 - 上午/下午h"时"mm"分"ss"秒";@           是否是时间格式: true
    
    Excel自定义时间格式字符串:
    字符串 - [红色]上午/下午h"时"mm"分"ss"秒";@      是否是时间格式: true
    字符串 - [绿色]yyyy/mm/dd hh:mm                是否是时间格式: true

    这里写图片描述

    4.注意

    4.1 只有时间

    • 在Excel一个Sheet单元格中输入:11:12:13
    • 设置单元格样式为时间:h:mm:ss;@
    • 11:12:13单元格为Numeric类型,以double值存储,不是一个字符串单元格
      因为只有时间,而没有日期,所以double只有小数,整部部分为0,存储的值是一个小于1的数。
      当前Sheet的时间单元格:
      这里写图片描述
      存储:
      这里写图片描述
      这里写图片描述

    4.2 日期小于1900-1-1

    • 一个单元格为:1899/12/31,一个为:1900/1/1
    • 设置单元格样式为日期:yyyy”年”m”月”d”日”;@
    • 1899/12/31会以字符串存储,日期样式不起效
    • 1900/1/1会以double值存储,日期样式起效,显示为1900年1月1日
      这里写图片描述
    • sheet1.xml存储Sheet单元格信息
      这里写图片描述
    • SharedStrings.xml存储Excel中所有Sheet字符型单元格的文本值
      这里写图片描述
    • styles.xml存储Excel中所有Sheet的所有单元格样式信息
      这里写图片描述
    展开全文
  • 三行数据都是日期,第一行是文本,第二行和第三行都是文本格式。 对比: 条件格式: 通过设置条件格式筛选重复值, 结果:可以看到第二行和第三行被认为相同的值。即,条件格式筛选重复值认为单元格内数值...

    我是月球挖掘机,这是一篇带有疑惑的文章。如果你有好的见解,欢迎与我交流,邮箱:wxy@wxy.ink


    数据源:

    三行数据都是日期,第一行是文本,第二行和第三行都是文本格式。

    对比:

    条件格式:

    通过设置条件格式筛选重复值,

    结果:可以看到第二行和第三行被认为相同的值。即,条件格式筛选重复值认为单元格内数值相同的即为重复值。

    高级筛选:

    通过数据-筛选-高级筛选,勾选仅显示唯一值。

    结果:数据只剩余两行,说明筛选重复值,第二行和第三行被认为相同的值。即,高级筛选重复值认为单元格内数值相同的即为重复值。

    删除重复值:

    数据-删除重复值

    结果:提示没有重复值。也就是删除重复值是对比单元格显示数据和单元格格式数据,两者都一致,才认为是重复值。

    我的试验结果与官方的说明不同,所以比较疑惑。官方解释如下:

    了解如何筛选唯一值或删除重复值

    筛选唯一值和删除重复值是两个类似的任务,因为目标是显示唯一值的列表。 但是,有一个关键区别:筛选唯一值时,重复值仅暂时隐藏。 但是,删除重复值意味着要永久删除重复值。

    重复值是一个重复值,其中至少一行的所有值都等同于另一行的所有值。 重复值的比较取决于单元格中显示的值,而不是单元格中存储的基础值。 例如,如果不同单元格中的日期值相同,一个单元格的格式设置为"2006 年 3 月 8 日",另一个单元格设置为"2006 年 3 月 8 日",则值是唯一的。

    筛选唯一值或删除重复值 - Excel (microsoft.com)

    我的Office版本:Version2008(Build 13127.21506)


    如果你有不同的见解,欢迎评论交流。

     

    展开全文
  • DataTable dataTable = ExcelHelper.ExcelImport(filePath); RemoveEmpty(dataTable);//去除空格 //部门 DataT...
  • excel表头重复打印

    2007-10-12 15:28:00
    轻松设置即可让Excel的表头重复打印 [ 来源:网络收集 | 更新日期:2007-9-30 14:37:53 | 评论 0 条 | 我要投稿 ] .Uoq482 { display:none; } 在Word 2000和Excel 2000中,对跨页或多页的表格,其表头在每页...
  • excel日期函数的应用

    万次阅读 2012-06-18 06:05:40
    excel日期函数的应用    1、SOS,如何解决EXCEL日期的2000年问题 各位老大,我想对一段数字进行编辑改成日期形式,如011211,前两位作为年,中间两位作为月份,最后两位作为日,...
  • Sub lqxs() Dim Arr, i&, x, y, z Dim d, k, t Set d = CreateObject("Scripting.Dictionary") Set s = CreateObject("Scripting.Dictionary") Sheet1.Activate [f:g].ClearContents ...Arr = [a1].CurrentRegio
  • 在一个EXCEL工作簿中,我有两张工作表,一张“日记”,一张“周记”。 如果,现在我已经对“周记”里的内容进行上色了,同一个大时间轴用一种背景色,而当天如果放假,字体为红色,如果上课则设为黑色。 现在...
  • 利用Excel高级筛选选择不重复的记录.rar,如示例的数据列表中存在着大量的重复数据。使用高级筛选的“选择不重复的记录”功能,可以快速将重复的筛除,并将符合筛选条件且不重复的记录复制到指定的区域。
  • 1、使用Tab键进行移动 使用TAB移动:写姓名、地址、电话号码、身份证号码,这四个栏目,根据这四个栏目填充数据,如果数据写到最后了,按下enter键,可以返回下一行的第一个,极其...4、提取身份证号码的出生日期...
  • Excel使用过程中,有很多场合都需要获取一组数据的不重复值。获取不重复值的方法有很多,例如高级筛选法、透视表法、基础操作法和公式法。本例分别向大家介绍这四种方法如何使用。 工具/原料 Excel 高级筛选...
  • 之前在这个岗位的同事,每天至少要花好几个小时去折腾Excel,用数据透视表、vlookup等等各类函数去做出一份有3000多个数据的日报。如果领导临时安排什么工作的话,那就要加班从无穷无尽的数据里找领导要的东西了。 ...
  • Excel VBA高级编程 -根据日期查找数据

    千次阅读 2020-08-11 22:43:20
    关注公众号:万能的Excel 并回复【日期搜索】获取源文件! 功能说明: 打印出货单的时候,经常会需要从数据库中查询一段时间内的所有数据 本工作表使用VBA实现了如下功能: 1、实时统计重复项 2、重复项数据...
  • EXCEL 删除重复项并保留最大最小值

    千次阅读 2014-05-04 19:42:00
    自定义排序 框选需要主次排序的区域 开始—排序和筛选—自定义排序 添加筛选条件 若要获取最小值则...删除A列的重复项后,B列留下了最小值 转载于:https://www.cnblogs.com/ytyt2002ytyt/p/3707782.html...
  • 比如reshape,可以根据自己的需求对数组进行重构 isequal,可以用来确定两个数组是否相等 datenum,datestr相信大家比较熟悉,可以将日期转换成序列值和字符,平时在处理时间相关数据的时候,还可以考虑用years,...
  • 昨天(2020/12/29)业务上出了bug,排查之后发现是某张sheet里某个列名重复了,而且都是日期(2020/12/29)我???? 举个例子:A1/B1/C1都是日期类型且值都是2020/12/30 用一段代码读取: def pro2(file_name): ...
  • Excel 统计符合条件不重复的个数

    万次阅读 2017-11-09 13:32:09
    iamlaosong文 要求从货运明细中统计各省某日发货点数量,公式如下: =SUMPRODUCT((Sheet1!$L$2:$L$1747=B6) * (Sheet1!$M$2:$M1747=$A$1) / COUNTIF(Sheet1!$U$2:$U$1747,Sheet1!...M列是发货日期,A1是...
  • 1.日期时间拆分提取部分 =INT(D2) //函数:提取年月日,同时要设置单元格格式为"日期"; 例如: =MOD(D2,1) //函数:提取时间,同时要设置单元格格式为"时间"; 例如: 2.计算相邻两行时间差值 在有必要...
  • 重复值是行中的所有值与另一个行中的所有值完全匹配的值,筛选唯一值时,将临时隐藏重复的值,但删除重复值时,则会永久删除重复值。最好先筛选唯一值或对其应用条件格式,以便在删除...在 Microsoft Office Excel 20
  • 参考:pandas找出重复行后取均值并合并 import pandas as pd import numpy as np import matplotlib as mpl %matplotlib inline from ggplot import * theme_bw() ggplot麻烦的很,内部用的是老pandas的东西,比如...
  • 在做excel计划表的时候,需要输入时间,手动输入实在麻烦,就做了一个VBA的宏来实现   1、新建excel表格,打开“控件工具箱”,点左下角的“其他控件”按钮,找到“日历控件11.0”; 2、拖动日历控件,调整合适大小...
  • EXCEL

    2011-12-14 21:23:13
    excel教程 难得的excel教程集珍藏版,简单明了,包你学会,欢迎转载! 照片名称:自动筛选 照片名称:在Excel中字符替换 照片名称:在Excel中直接编辑“宏” 照片名称:在Excel...
  • Excel查询某列不重复项个数

    千次阅读 2018-11-15 15:29:04
    =SUMPRODUCT(1/COUNTIF(A2:A1021,A2:A1021))
  • excel数据快速输入 数据快速输入快捷键。 Tab键:横向向右切换一个单元格。 Enter键:向下切换一个单元格。 上下左右四个切换选中的单元格。 日期输入问题:日期只识别2020/1/12或2020-11-1。也就是说,日期只识别...
  • Excel函数应用之文本/日期/时间函数

    千次阅读 2007-12-07 22:00:00
    编者语:Excel是办公室自动化中非常重要的一款软件,很多巨型国际企业都是依靠Excel进行数据管理。它不仅仅能够方便的处理表格和进行图形分析,其更强大的功能体现在对数据的自动处理和计算,然而很多缺少理工科背景...
  • 1.将源数据按关键列值排序(如列1、列2(列2降序)) 列1 列2 列3 A 2021/7/13 ...2.使用VLookUp去取已排序的数据(默认就是取第一条,第一条为最新日期数据) 列1 列2 列3 A.
  • 对于上面Excel表格的日期项,怎么使用python统计不同的日期出现的次数,统计完成后删除重复日期项并记录到‘次数’列。就像下面的示例: [img=https://img-bbs.csdn.net/upload/202007/22/1595403539_269412.png]...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,772
精华内容 6,708
热门标签
关键字:

excel重复日期