|
版本: |
其它(帖子中说明) |
小版本号: |
|
|
|
数据库: |
Oracle |
服务器操作系统: |
Windows |
应用服务器: |
Tomcat |
客户端操作系统: |
Windows 7 |
浏览器: |
Chrome |
|
|
在导入excel前action(importExcelBeforeAction)的执行后事件中,获得导入的excel和mapping文件,写java遍历excel对考勤姓名相同组进行统计通过判断那天没记录要在该组下面新增加一行显示fGH,fXM,fKQRQ(工号,姓名,考勤日期),再在此组下面新增三行用了统计上班时数,上班天数和补贴天数。代码如下
public class Kqgl2Process {
static List<String> listDate= new ArrayList<String>();
static List listW= new ArrayList();
static{
for(int i=1;i<=6;i++){
listW.add(i);
}
}
Map map = new HashMap();
public static void kqgl2ProcessAfterImportExcelBeforeAction() throws ParseException {
Workbook workBook=(Workbook) ModelUtils.getRequestContext().getActionContext().getParameter("excel");
Sheet sheet=workBook.getSheetAt(0);
List list=new ArrayList();//存放excel鉴别列的数据
Row row3=sheet.getRow(1);
Cell cell3=row3.getCell(0);//根据excel表中第一列数据进行校验
String cellStr=cell3.toString();
Cell fKQRQ3 = row3.getCell(4);
String StrDate= fKQRQ3.toString();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
String subDate=StrDate.substring(0, 7);
Date month =sdf.parse(subDate);
dayReport(month);//向listDate加入本月需要上班日期
List<String> listGh= new ArrayList<String>();
List<String> listKQRQ= new ArrayList<String>();
List<String> listMo= new ArrayList<String>();
List<String> listGs= new ArrayList<String>();
for(int i=1;i<sheet.getLastRowNum();i++){
Row row=sheet.getRow(i);
Cell cell=row.getCell(0);//根据excel表中第一列数据进行校验
String cellStr1=cell.toString();
System.out.println("开始当工号为:"+cellStr1+"sheet.getLastRowNum()为:"+sheet.getLastRowNum()+"行");
listGh.add(cellStr1);
Cell fXM = row.getCell(2);
String fXMStr1=fXM.toString();
Cell fKQRQ = row.getCell(4);
Cell fBM = row.getCell(3);
String fBMStr1=fBM.toString();
Cell fKQSJ = row.getCell(5);
System.out.println("当前考勤时间为fKQSJ为:"+fKQSJ);
Cell fSWSBSJ = row.createCell(6);
Cell fSWXBSJ = row.createCell(7);
Cell fXWSBSJ = row.createCell(8);
Cell fXWXBSJ = row.createCell(9);
Cell fWSSBSJ = row.createCell(10);
Cell fWSXBSJ = row.createCell(11);
Cell fGS = row.createCell(12);
Cell fJBGS = row.createCell(13);
Cell fQJGS = row.createCell(14);
Cell fCD = row.createCell(15);
Cell fCDKK = row.createCell(16);
Cell fJBBT = row.createCell(17);
Cell fQK = row.createCell(18);
Cell fRSDAID = row.createCell(19);
Cell fZTCS = row.createCell(20);
Cell fZTKK = row.createCell(21);
Row rowNext=null;
Cell cellNext=null;
Cell fXMNext=null;
Cell fBMNext=null;
String cellStrNext=null;
String fXMStrNext=null;
String fBMStrNext=null;
String fKQRQStr1= fKQRQ.toString();
System.out.println("当前考勤日期fKQRQStr1为:"+fKQRQStr1);
listKQRQ.add(fKQRQStr1);//把日期添加到listKQRQ集合里
if(i<sheet.getLastRowNum()-1){
rowNext=sheet.getRow(i+1);
cellNext=rowNext.getCell(0);//根据excel表中第一列数据进行校验
cellStrNext=cellNext.toString();
fXMNext= rowNext.getCell(2);
System.out.println("进入i<sheet.getLastRowNum()判断i为:"+i);
System.out.println("进入i<sheet.getLastRowNum()判断fXMNext为:"+fXMNext);
fXMStrNext=fXMNext.toString();
fBMNext = rowNext.getCell(3);
fBMStrNext=fBMNext.toString();
}
//下面代码是用于新增行
Boolean flag3=listGh.contains(cellStrNext)
//判断如果当前行与下一行工号不相等(相当于已经遍历到当前工号组的最后一行)
if(!flag3){
//追加当前行工号未有打卡记录日期
for(int d=0;d<listDate.size();d++){
Boolean flag2=listKQRQ.contains(listDate.get(d));
if(!flag2){
listMo.add(listDate.get(d));
}
listGh.clear();//清除当前工号在集合里所有元素
listGh.add(cellStrNext);//追加已存在的下一行工号
}
System.out.println("listKQRQ有打卡记录日期:"+listKQRQ.toString());
System.out.println("listMo没打卡记录日期:"+listMo.toString());
//在当前行追加当前工号当月某天正常上班未有打卡记录情况
for(int s=0;s<listMo.size();s++){
System.out.println("进入追加当前工号当月某天正常上班未有打卡记录情况");
Sheet sheet1=workBook.getSheetAt(1);
Row row8=sheet1.createRow(i+s+1);
Cell cell8=row8.createCell(0);//根据excel表中第一列数据进行校验
cell8.setCellValue(cellStr1);
Cell fXM8 = row8.createCell(2);
fXM8.setCellValue(fXMStr1);
Cell fBM8 = row8.createCell(3);
fBM8.setCellValue(fBMStr1);
listGh.add(cellStrNext);
Cell fKQRQ8 = row8.createCell(4);
fKQRQ8.setCellValue(listMo.get(s));
}
//在当前行追加上班时数、上班天数、补贴天数
Row row4=sheet.createRow(i+listMo.size()+1);
Cell cell4=row4.createCell(0);//根据excel表中第一列数据进行校验
cell4.setCellValue(cellStr1);
Cell fXM4 = row4.createCell(2);
fXM4.setCellValue(fXMStr1);
Cell fBM4 = row4.createCell(3);
fBM4.setCellValue(fBMStr1);
Cell fKQSJ4 = row4.createCell(5);
fKQSJ4.setCellValue("上班时数");
//在当前行追加上班天数
Row row5=sheet.createRow(i+listMo.size()+2);
Cell cell5=row5.createCell(0);//根据excel表中第一列数据进行校验
cell5.setCellValue(cellStr1);
Cell fXM5 = row5.createCell(2);
fXM5.setCellValue(fXMStr1);
Cell fBM5 = row5.createCell(3);
fBM5.setCellValue(fBMStr1);
Cell fKQSJ5 = row5.createCell(5);
fKQSJ5.setCellValue("上班天数");
//在当前行追加补贴天数
Row row6=sheet.createRow(i+listMo.size()+3);
Cell cell6=row6.createCell(0);//根据excel表中第一列数据进行校验
cell6.setCellValue(cellStr1);
Cell fXM6 = row6.createCell(2);
fXM6.setCellValue(fXMStr1);
Cell fBM6 = row6.createCell(3);
fBM6.setCellValue(fBMStr1);
Cell fKQSJ6 = row6.createCell(5);
fKQSJ6.setCellValue("补贴天数");
i=i+listMo.size()+3;
listMo.clear();
listKQRQ.clear();
}
}
}
//获得当天是星期几
public static int weekDay(Calendar cal) {
int weekday = cal.get(Calendar.DAY_OF_WEEK);
if (weekday == 1)// 西方星期日为第一天,星期一为第二天
weekday = 7;
else
weekday -= 1;
return weekday;
}
//遍历当月日期(除星期天以外)向listDate加入本月需要上班日期
public static void dayReport(Date month) {
Calendar cal = Calendar.getInstance();
cal.setTime(month);//month 为指定月份任意日期
int year = cal.get(Calendar.YEAR);
int m = cal.get(Calendar.MONTH);
int dayNumOfMonth = getDaysByYearMonth(year, m);
cal.set(Calendar.DAY_OF_MONTH, 1);// 从一号开始
for (int i = 0; i <=dayNumOfMonth; i++, cal.add(Calendar.DATE, 1)) { //cal.add(Calendar.DATE, 1)当天日期加一天
Date d = cal.getTime();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String df = simpleDateFormat.format(d);
int w = weekDay(cal);//把日期转化为星期几(1,2,3,4,5,6,7)
//System.out.println(w);
//去除星期天(7)
boolean flag = listW.contains(w);
if(flag){
listDate.add(df);
}
// System.out.println(listDate.toString());
}
}
}
下面是import.mapping.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<mapping>
<default-config>
<sheet all="false" start="1" end="1"/>
<row all="false" start="2" end="10000"/>
</default-config>
<concept name="ZT_KQJL">
<relation name="fGH" value-type="String" cell-number="1"/>
<relation name="fXM" cell-number="3"/>
<relation name="fBM" cell-number="4"/>
<relation name="fKQRQ" value-type="date" date-pattern="yyyy-MM-dd" cell-number="5"/>
<relation name="fKQSJ" cell-number="6"/>
<relation name="fSWSBSJ" cell-number="7"/>
<relation name="fSWXBSJ" cell-number="8"/>
<relation name="fXWSBSJ" cell-number="9"/>
<relation name="fXWXBSJ" cell-number="10"/>
<relation name="fWSSBSJ" cell-number="11"/>
<relation name="fWSXBSJ" cell-number="12"/>
<relation name="fGS" cell-number="13"/>
<relation name="fJBGS" cell-number="14"/>
<relation name="fQJGS" cell-number="15"/>
<relation name="fCD" cell-number="16"/>
<relation name="fCDKK" cell-number="17"/>
<relation name="fJBBT" cell-number="18"/>
<relation name="fQK" cell-number="19"/>
<relation name="fRSDAID" cell-number="20"/>
<relation name="fZTCS" cell-number="21"/>
<relation name="fZTKK" cell-number="22"/>
</concept>
</mapping>
这是没有新增新行情况图片 当然代码是要除去新增行代码才能得到图1
图1
这是新增加新行情况图片
图2
对比图1和图2可以看出姓名王霸天的考勤日期2017-07-18开始的新增5行会覆盖掉李力天的从2017-07-01到2017-07-06间5行数据。
也就是说Row row=sheet.createRow(i+1);这代码新建行是直接会覆盖掉原来i+1这行数据,不同于在Exce表格l里插入一行其他在其下面数据都会下移一行情况。
我现在就想新插入几行,然后被插入地方数据会自动下移几行。不要被新行覆盖。
|
|