diff --git a/src/main/java/com/supwisdom/dlpay/atte/controller/CustAtteController.java b/src/main/java/com/supwisdom/dlpay/atte/controller/CustAtteController.java
index 32d1fef..152087f 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/controller/CustAtteController.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/controller/CustAtteController.java
@@ -35,10 +35,7 @@
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @Controller
 @RequestMapping("/atte")
@@ -1249,6 +1246,8 @@
             ExportParams params = new ExportParams("考勤报表", "考勤报表", ExcelType.XSSF);
 //		params.setFreezeCol(2);
             List<ExcelReport> data=new ArrayList<>();
+            Date startdates=DateUtil.getSpecifyDate(searchBean.getStartdate(),"yyyyMMdd");
+            Integer days=getDaysOfMonth(startdates);
             for(AtteReport at:list){
                 ExcelReport er=new ExcelReport();
                 er.setCustname(at.getCustname());
@@ -1319,12 +1318,18 @@
                 er.setP27(getState(at.getP27()));
                 er.setA28(getState(at.getA28()));
                 er.setP28(getState(at.getP28()));
-                er.setA29(getState(at.getA29()));
-                er.setP29(getState(at.getP29()));
-                er.setA30(getState(at.getA30()));
-                er.setP30(getState(at.getP30()));
-                er.setA31(getState(at.getA31()));
-                er.setP31(getState(at.getP31()));
+                if(days>=28){
+                    er.setA29(getState(at.getA29()));
+                    er.setP29(getState(at.getP29()));
+                }
+                if(days>=30){
+                    er.setA30(getState(at.getA30()));
+                    er.setP30(getState(at.getP30()));
+                }
+                if(days>=31){
+                    er.setA31(getState(at.getA31()));
+                    er.setP31(getState(at.getP31()));
+                }
                 data.add(er);
             }
 
@@ -1339,7 +1344,11 @@
             map.put("result", "导出excel文件失败");
         }
     }
-
+    public static int getDaysOfMonth(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
+    }
     public String getState(Integer num){
         if(num==null) {
             return "未排班";
diff --git a/src/main/resources/templates/atte/newreport/index.html b/src/main/resources/templates/atte/newreport/index.html
index d489ac1..1d845e4 100644
--- a/src/main/resources/templates/atte/newreport/index.html
+++ b/src/main/resources/templates/atte/newreport/index.html
@@ -511,37 +511,37 @@
                     <el-table-column
                             prop="a29"
                             label="29(上午)"
-                            :formatter="stateTypeform">
+                            :formatter="stateTypeform29">
 
                     </el-table-column>
                     <el-table-column
                             prop="p29"
                             label="29(下午)"
-                            :formatter="stateTypeform">
+                            :formatter="stateTypeform29">
 
                     </el-table-column>
                     <el-table-column
                             prop="a30"
                             label="30(上午)"
-                            :formatter="stateTypeform">
+                            :formatter="stateTypeform30">
 
                     </el-table-column>
                     <el-table-column
                             prop="p30"
                             label="30(下午)"
-                            :formatter="stateTypeform">
+                            :formatter="stateTypeform30">
 
                     </el-table-column>
                     <el-table-column
                             prop="a31"
                             label="31(上午)"
-                            :formatter="stateTypeform">
+                            :formatter="stateTypeform31">
 
                     </el-table-column>
                     <el-table-column
                             prop="p31"
                             label="31(下午)"
-                            :formatter="stateTypeform">
+                            :formatter="stateTypeform31">
 
                     </el-table-column>
 
@@ -647,31 +647,28 @@
                 this.dialogFormVisible = false
             },sumdays:function (row,column, cellValue){
                 return row.cnt1+row.cnt3+row.cnt7+row.cnt8+row.cnt9;
+            },stateTypeform29:function(row,column,cellValue){
+                var days=getdays(this);
+                if(29>days){
+                    return '';
+                }
+               return  formatstat(row,column,cellValue);
+            },stateTypeform30:function(row,column,cellValue){
+                var days=getdays(this);
+                if(30>days){
+                    return '';
+                }
+                return  formatstat(row,column,cellValue);
+            },stateTypeform31:function(row,column,cellValue){
+                var days=getdays(this);
+                if(31>days){
+                    return '';
+                }
+                return  formatstat(row,column,cellValue);
             },
             stateTypeform:function(row, column, cellValue){
               //  alert(cellValue)
-                if(cellValue == 0){
-                    return '未打卡';
-                }else if(cellValue == 1){
-                    return '正常';
-                }else if(cellValue == 2){
-                    return '异常';
-                }else if(cellValue == 3){
-                    return '正常';
-                }else if(cellValue == 4){
-                    return '未打卡';
-                }else if(cellValue == 5){
-                    return '异常';
-                }else if(cellValue == 7){
-                    return '正常';
-                }else if(cellValue == 8){
-                    return '正常';
-                }else if(cellValue == 9){
-                    return '正常';
-                }else {
-                    return '未排班';
-                }
-
+              return  formatstat(row,column,cellValue);
             },
         },
         created:function(){
@@ -720,9 +717,37 @@
 
     })
 
+    function getdays(that){
+        var sel=that.preportform.startdate;
 
+        var d = new Date(sel.getFullYear(),sel.getMonth()+1,0);
+        var days=d.getDate();
+        return days;
+    }
 
-
+    function formatstat(row,column,cellValue) {
+        if(cellValue == 0){
+            return '未打卡';
+        }else if(cellValue == 1){
+            return '正常';
+        }else if(cellValue == 2){
+            return '异常';
+        }else if(cellValue == 3){
+            return '正常';
+        }else if(cellValue == 4){
+            return '未打卡';
+        }else if(cellValue == 5){
+            return '异常';
+        }else if(cellValue == 7){
+            return '正常';
+        }else if(cellValue == 8){
+            return '正常';
+        }else if(cellValue == 9){
+            return '正常';
+        }else {
+            return '未排班';
+        }
+    }
 
 
     function class_Formatdate(date){
