需求如下: excel表格中的信息有姓名和身份证号,同时也有对应的时间戳,对应每个人的简历原文件名。现在要求将简历重命名为"姓名_身份证.pdf"的形式,将文件的名字写入表格的第5列中。要求用Java来实现。
前期准备,需要下载jxl.jar包,添加入文件工程,添加以及配置方法为:https://blog.csdn.net/Golden_soft/article/details/80952243
实现思路:
1. 遍历表格,建立person类,存放个人姓名,id,行号(为之后添加第5列信息作准备,这是最后实现添加需求时补充的)
2. 建立person 和 原文件名的映射
3. 遍历集合,找到原文件,对其进行改名
4. 在遍历集合的循环内同时对表格元素进行修改
需要注意的:
1. 读取表格的流程
结构的关系为 工作簿 workbook- 工作表 sheet - 单元格 cell
单元格 cell.getContents() 获取单元格的内容
File files = new File(pathName);
InputStream inputStream = new FileInputStream(files);
// 新建并获取工作簿
Workbook workbook = Workbook.getWorkbook(inputStream);
// 读取工作表
Sheet sheet = workbook.getSheet(0);
// 按照行数进行读取
int rows = sheet.getRows();
for(int i = 1;i<rows;i++)
{
// Cell代表单元格 分别是读名字,读id,读时间
Cell cell_name = sheet.getCell(1,i);
Cell cell_id = sheet.getCell(3,i);
Cell cell_stamp = sheet.getCell(4,i);
// System.out.println(cell_name.getContents()+" "+cell_id.getContents()+" "+cell_stamp.getContents());
// 建立Person
Person person = new Person(cell_name.getContents(),cell_id.getContents(),i);
String time_stamp = cell_stamp.getContents();
// 建立map
map.put(person,time_stamp);
}
2. 文件改名 先找到文件,利用file.renameto(new File(new_name));
File file_trans = new File(pathName);
// 改名
file_trans.renameTo(new File(newName));
3. 表格中插入新内容
1) 创建读入的工作簿 workbook_r
2) 由于是追加而非覆盖重写,创建写的工作簿对象 workbook_w
3) 创建工作表 sheet
4) 插入的内容 l ,用sheet.addcell(l)
5) 关闭流
改名和插入表格
public static void ChangeName(File files,HashMap<Person, String> map) throws IOException, BiffException, WriteException {
// 工作簿
Workbook workbook_r = Workbook.getWorkbook(files);
// 工作簿对象
WritableWorkbook workbook_w = Workbook.createWorkbook(files,workbook_r);
// 工作表
WritableSheet sheet_w = workbook_w.getSheet(0);
// 对文件进行改名,同时也更新表格
for(Person key:map.keySet())
{
String value = map.get(key);
// 所有pdf的路径
String pathName = "";
String newName = pathName;
String tmp_name = "";
newName = addName(newName,key);
tmp_name = addName(tmp_name,key);
// System.out.println(newName);
// 找到文件
pathName+=value;
File file_trans = new File(pathName);
// 改名
file_trans.renameTo(new File(newName));
// 文件名写到表格的第5列中
// 先获得单元格对象,而后修改内容
// System.out.println(key.name+" "+key.id+" "+key.row+" "+value);
Label l = new Label(5,key.row,tmp_name);
sheet_w.addCell(l);
}
// 关闭流
workbook_w.write();
workbook_w.close();
workbook_r.close();
}
完整代码:
import jxl.Cell;
import jxl.CellType;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.*;
import java.io.*;
import java.sql.SQLOutput;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static Map<Person,String> map = new HashMap<Person,String>();
public static void main(String[] args) throws IOException, BiffException, WriteException {
// 先读取文件
File files = new File("");
ReadColumn(files,1,3,4, (HashMap<Person, String>) map);
ChangeName(files, (HashMap<Person, String>) map);
}
// 建立姓名,身份证号和文件名的映射
public static HashMap ReadColumn(File files,int index1,int index2,int index3,HashMap<Person,String> map) throws IOException, BiffException {
InputStream inputStream = new FileInputStream(files);
// 新建并获取工作簿
Workbook workbook = Workbook.getWorkbook(inputStream);
// 读取工作表
Sheet sheet = workbook.getSheet(0);
// 按照行数进行读取
int rows = sheet.getRows();
//System.out.println(rows),行下标从0开始;
for(int i = 1;i<rows;i++)
{
// Cell代表单元格 分别是读名字,读id,读时间
Cell cell_name = sheet.getCell(1,i);
Cell cell_id = sheet.getCell(3,i);
Cell cell_stamp = sheet.getCell(4,i);
// System.out.println(cell_name.getContents()+" "+cell_id.getContents()+" "+cell_stamp.getContents());
// 建立Person
Person person = new Person(cell_name.getContents(),cell_id.getContents(),i);
String time_stamp = cell_stamp.getContents();
// 建立map
map.put(person,time_stamp);
}
// 验证下集合
for(Person key:map.keySet())
{
String value = map.get(key);
System.out.println(key.name+" "+key.id+" "+key.row+" "+value);
}
return map;
}
// 找到对应的文件,改名,写入表格的第5列
public static void ChangeName(File files,HashMap<Person, String> map) throws IOException, BiffException, WriteException {
// 工作簿
Workbook workbook_r = Workbook.getWorkbook(files);
// 工作簿对象
WritableWorkbook workbook_w = Workbook.createWorkbook(files,workbook_r);
// 工作表
WritableSheet sheet_w = workbook_w.getSheet(0);
// 对文件进行改名,同时也更新表格
for(Person key:map.keySet())
{
String value = map.get(key);
// 所有pdf的路径
String pathName = "";
String newName = pathName;
String tmp_name = "";
newName = addName(newName,key);
tmp_name = addName(tmp_name,key);
// System.out.println(newName);
// 找到文件
pathName+=value;
File file_trans = new File(pathName);
// 改名
file_trans.renameTo(new File(newName));
// 文件名写到表格的第5列中
// 先获得单元格对象,而后修改内容
// System.out.println(key.name+" "+key.id+" "+key.row+" "+value);
Label l = new Label(5,key.row,tmp_name);
sheet_w.addCell(l);
}
// 关闭流
workbook_w.write();
workbook_w.close();
workbook_r.close();
}
// 封装增加路径
public static String addName(String name_primit,Person person)
{
String name_final = name_primit;
name_final+=person.name;
name_final+="_";
name_final+=person.id;
name_final+=".pdf";
return name_final;
}
}
class Person{
String name;
String id;
int row;
public Person(String name,String id,int row){
this.name = name;
this.id = id;
this.row = row;
}
}