前几天室友不小心把老师的硬盘的资料弄不见了,后来请人数据恢复找回来大部分资料,但有4000个doc和docx文档恢复时原名称已经不见了。所以帮他做了一个小程序,自动打开文本,获取文档第一行有效文字,将其作为文档重命名时的新名称。
流程:
1.准备工作:POI包导入,doc,docx文件打开需要导入相关的依赖包(好像只需要以下几个就可以了,不过我全导进去了)ra
然后add to buildpath。
下载以下的源文件就好了。
2.对文档重名工具:(可以使用好压对文档进行批量重命名)
先选中文件(crtl +A)—》右键—》其它压缩命令—》批量重命名。
3.上代码:如果要运行需要改循环数字+文件的路径。除了打开文件的方式不同,大部分代码是相同的。
以下是修改docx的代码:
public class readdocx {
public static void main(String[] args) {
try {
for(int i =2001; i<=2007; i++){ //以数字命名文件名,方便获取
String lll="zxcvbnmlkjhgfdsaqwertyuiopQWERTYUIOPASDFGHJKLZXCVBNM1234567890";
//由Random生成随机数
Random random=new Random();
StringBuffer sb=new StringBuffer();
String randomKey = null;
for(int j=0; j<3; ++j){
int number=random.nextInt(62);
sb.append(lll.charAt(number));
randomKey = sb.toString();
}
String filepath = "E:\\Document\\" + String.valueOf(i)+ ".docx";//
File file = new File(filepath);
//检查文件是否存在,如不存在,则跳到下一个文件查找
if(!file.exists()){
continue;
}
OPCPackage opcPackage = POIXMLDocument.openPackage(filepath);
POIXMLTextExtractor extractor = new XWPFWordExtractor(opcPackage);
String[] name = extractor.getText().split("\n");
String str =null;
String str1 =null;
//做判断,找到有字符的一行数组
for(int k=0;k<name.length; ++k){
String str2 = name[k].replaceAll("\\s*", "");
if(str2.length()==0){
continue;
}else{
str = str2;
System.out.println(str);
//剔除重命名非法字符
str.replaceAll("\\p{Punct}","");
Pattern p = Pattern.compile("\\s*|\t|\r|\n|:|");
Matcher m = p.matcher(str);
str1 = m.replaceAll("");
str1=str1.replaceAll(":", "");
str1=str1.replaceAll("\\?", "");
str1=str1.replaceAll("/", "");
break;
}
}
String filename = null;
if(str1==null){
continue;
}else if(str1.length()>35){
filename = str1.substring(0, 30);
}else {
filename = str1;
}
filename=filename+ sb.toString() +".docx"; //将承载的字符转换成字符串
System.out.println(filename);
opcPackage.close();
File file2= new File(filepath); //指定文件名及路径
System.out.println(file2);
String path=file2.getAbsolutePath();
//System.out.println(path);
if(path.indexOf("\\")>=0){
path= path.substring(0,path.lastIndexOf("\\"))+"\\";
//System.out.println(path);
}
file.renameTo(new File(path+filename));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
以下是doc文档的代码:
public class readdoc {
public static void main(String[] args) {
try {
for(int i =1059; i<=3000; i++){
//以数字命名文件名,方便获取
String lll="zxcvbnmlkjhgfdsaqwertyuiopQWERTYUIOPASDFGHJKLZXCVBNM1234567890";
//由Random生成随机数
Random random=new Random();
String randomKey = null;
StringBuffer sb=new StringBuffer();
for(int j=0; j<3; ++j){
int number=random.nextInt(62);
sb.append(lll.charAt(number));//将产生的数字通过length次承载到sb中
randomKey = sb.toString();
}
String filepath = "E:\\Document\\" + String.valueOf(i)+ ".doc";//
File file = new File(filepath);
//检查文件是否存在,如不存在,则跳到下一个文件查找
if(!file.exists()){
continue;
}
InputStream is = new FileInputStream(new File(filepath));
WordExtractor extractor = new WordExtractor(is);
//以分割符号获取每一行的数字转换成字符串数组
String[] name = extractor.getText().split("\r");
String str =null;
String str1 =null;
//做判断,找到有字符的一行数组
for(int k=0;k<name.length; ++k){
String str2 = name[k].replaceAll("\\s*", "");
if(str2.length()==0){
continue;
}else{
str = str2;
System.out.println(str);
//剔除字符串时遇到的非法字符
str.replaceAll("\\p{Punct}","");
Pattern p = Pattern.compile("\\s*|\t|\r|\n|:|");
Matcher m = p.matcher(str);
str1 = m.replaceAll("");
str1=str1.replaceAll(":", "");
str1=str1.replaceAll("\\?", "");
str1=str1.replaceAll("/", "");
break;
}
}
String filename = null;
if(str1==null){
continue; //退出循环,空文件或者是图片文件
}else if(str1.length()>35){
filename = str1.substring(0, 30);
}else {
filename = str1;
}
filename=filename+ randomKey +".doc"; //将承载的字符转换成字符串
System.out.println(filename);
File file2= new File(filepath); //指定文件名及路径
System.out.println(file2);
String path=file2.getAbsolutePath();
//System.out.println(path);
if(path.indexOf("\\")>=0){
path= path.substring(0,path.lastIndexOf("\\"))+"\\";
//System.out.println(path);
}
file.renameTo(new File(path+filename));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
5.代码还不够完善,但是运行时错误是3/1000,所以能应对大部分文件了,若报错,请直接跳过该文件继续运行。
测试结果如下:
新手一枚,而且第一次发博,文章有错望指教。