前提
年度到了,需要上交自己的个人工作量excel文件了,因为一年来干的事情太多太细了,所以准备使用java
来将这一年的工作记录总结到excel中
过程
1、从周报或者月报中复制个人记录
2、整理成txt文件,每行开头和结尾皆不需要特殊处理,只保留工作内容即可
如:
今天摸鱼
今日划水
今日专心工作
3、思考excel的版面及一些固定信息
如下:
1)红色是固定格式不需要填写,excel下拉即可全部复制
2)绿色是需要填写的工作内容,【上面的今日摸鱼等信息】
4、java代码开发
整体思路如下:
1.将这一年的工作日整理出列表【节假日不写工作内容】
2. 读取提交准备好的工作内容txt文件
3. 从指定的excel文件中写入循环第二步的内容【节假日跳过】
5、代码献上
只要文件都准备好,可直接运行~😊
package person.keino.OperatExcelPrac;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @Classname OperaExcel
* @Description TODO
* @Date 2021-06-07 11:30
* @Created by keino
*/
public class OperaExcel {
//提前自定义的一些日期,比如每年五一、国庆等不属于周六周日但是依旧是休息日的多个日期
final static String[] commonHolidays = {"20211001","20211002","20211003","20211004","20211005","20211006","20211007"};
//将定义好的日期 放入 holidaySet
final static HashSet<String> holidaySet = new HashSet<String>(Arrays.asList(commonHolidays));
//工作日集合
final static HashSet<String> workdaySet = new HashSet<>();
final static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
/**
* 统计从【date】开始,之后【length】天中的工作日
* @param date
* @param length
*/
public static void getWorkDays(String date,int length){
Calendar calendar = Calendar.getInstance();
try {
Date beginDay = sdf.parse(date);
calendar.setTime(beginDay);
for(int i=0;i<length;i++){
calendar.add(Calendar.DAY_OF_WEEK,1); // 每次累加一天
int day = calendar.get(Calendar.DAY_OF_WEEK); // 获取当天是周几
String tmp_day = sdf.format(calendar.getTime());
//如果当天是1和7或者属于自定义日期 则属于休息日 剩余的则是工作日
if((day!=1 && day!=7) && (!holidaySet.contains(tmp_day))){
workdaySet.add(tmp_day);//将工作日添加到workdaySet
}
}
} catch (ParseException e) {
e.printStackTrace();
}
}
public static ArrayList<String> getLines(String path) throws IOException {
ArrayList<String> lines = new ArrayList<>();
BufferedReader br = new BufferedReader(new FileReader(path));
String str = "";
while((str = br.readLine())!=null) {
if(str.length()>2){
lines.add("1."+str);
}
}
return lines;
}
/**
*
* @param writeBegin 开始写记录的初始位置
* @param writeEnd 结束写记录的位置
* @param worksNotes 工作记录,可以以txt文件为载体,总是需要提前写好每一条工作记录【可以从日报或者周报获取】
* @param path 【年度工作总结】excel文件的本地地址
* @param writePos01 需要插入的excel的列1
* @param writePos02 需要插入的excel的列2
* @throws IOException
*/
public void writeReports(int writeBegin,int writeEnd,ArrayList<String> worksNotes,String path,int writePos01,int writePos02) throws IOException {
XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(path));
XSSFSheet sheet = workbook.getSheet("日工作量清单-数据平台部");
int recordNum = 0; // 日志记录中对应的行数
for(int i=writeBegin-1;i<=writeEnd-1;i++){
XSSFRow row = sheet.getRow(i);
//获取该行日期
String date = sdf.format(row.getCell(0).getDateCellValue());
if(workdaySet.contains(date)){
//创建填充shell位置,并且填充数据
XSSFCell cell = row.createCell(writePos01);
cell.setCellValue(worksNotes.get(recordNum)); //从日志记录 第0行开始,递增
XSSFCell cell2 = row.createCell(writePos02);
cell2.setCellValue(worksNotes.get(recordNum++)); //从日志记录 第0行开始 递增
}else{
continue;
}
}
FileOutputStream fos = new FileOutputStream("/Users/keino/Desktop/workNote.xlsx");
workbook.write(fos);
workbook.close();
fos.close();
workbook.close();
}
public static void main(String[] args) throws IOException {
getWorkDays("20210531", 360);
OperaExcel excel = new OperaExcel();
excel.writeReports(180,363,getLines("/Users/keino/Desktop/工作记录.txt"),"/Users/keino/Desktop/年度工作量总结.xlsx",5,6);
}
}