实习第一周的工作记录

总体任务是把一堆ecxel和word文档解析到数据库

(这我一想这不简单嘛,poi唰唰就解决了,然而。。。)

  • POI依赖
  • 文档不同类型 docx,doc,xls,xlsx
  • 解析加密文件
  • 格式不同,每个处室的文档格式不同
  • 将配置文件读程Map
  • 样式不同,word中放excel表格,excel中放word样式的文档,根据配置文件件来解析
  • 位置不同,每个文档可能出现每个人调整的情况,根据判断固定点的位置来确定
  • 照片,word中可能有照片也可能没照片,excel中也是一样,需要通过比对把人和照片联系到一起
  • 数据太杂,不知道他们当时是怎么收集数据的,格式都不统一,各种样式写的都有,
  • 还有一些小细节,写这种东西真的考虑的细节太多,比如excel中数据在哪个sheet页里放,w(゚Д゚)w头大
  • 还有一个好用的工具是阿里的EasyExcel,也是一个开源的好东西。
  • 总结

目录

	
	
		dom4j
		dom4j
		1.6.1
	
	
	
		org.slf4j
		slf4j-log4j12
		1.7.25
	
	
	
	
		org.projectlombok
		lombok
		1.18.10
		provided
	
	
	
	
		mysql
		mysql-connector-java
		8.0.15
	
	
	
	
		org.apache.poi
		poi
		4.0.1
	
	
	
	
		org.apache.poi
		poi-scratchpad
		4.0.1
	
	
	
	
		com.alibaba
		easyexcel
		2.0.5
	

目录

public static String readWord(String path) {
        String buffer = "";
        try {
            if (path.endsWith(".doc")) {
            	Biff8EncryptionKey.setCurrentUserPassword("123456");  
                InputStream is = new FileInputStream(new File(path));
                WordExtractor ex = new WordExtractor(is);
                buffer = ex.getText();//获取文档中的所有内容
                ex.close();
             // 处理doc格式 即office2003版本
				POIFSFileSystem pfs = new POIFSFileSystem(new FileInputStream(new File(path)));   
				HWPFDocument hwpf = new HWPFDocument(pfs);   
				Range range = hwpf.getRange();//得到文档的读取范围
				TableIterator it = new TableIterator(range);
				// 迭代文档中的表格
			System.out.println("获取文档中的表格--------------------------------");
				while (it.hasNext()) {   
					Table tb = (Table) it.next();   
					System.out.println("这是第" + 1 + "个表的数据");
					//迭代行,默认从0开始,可以依据需要设置i的值,改变起始行数,也可设置读取到那行,只需修改循环的判断条件即可
					for (int i = 0; i < tb.numRows(); i++) {   
						TableRow tr = tb.getRow(i);   
						//迭代列,默认从0开始
						for (int j = 0; j < tr.numCells(); j++) {   
							TableCell td = tr.getCell(j);//取得单元格
							//取得单元格的内容
							for(int k = 0; k < td.numParagraphs(); k++){   
								Paragraph para = td.getParagraph(k); 
								String s = para.text();
								//去除后面的特殊符号
								if(null != s && !"".equals(s)){
									s = s.substring(0, s.length()-1);
								}
								System.out.print(s + "\t");
							}
						}
						System.out.println();
					} 
				}

                
                
            } else if (path.endsWith("docx")) {
                OPCPackage opcPackage = POIXMLDocument.openPackage(path);
                POIXMLTextExtractor extractor = new XWPFWordExtractor(opcPackage);
                buffer = extractor.getText();
                extractor.close();
            } else {
                System.out.println("此文件不是word文件!");
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return buffer;
    }

目录

1. 通过poi针对不同的文件后缀进行不同类型的解析 根据不同的文件后缀创建不同的解析对象

1.1 doc文件

// 处理doc格式 即office2003版本
POIFSFileSystem pfs = new POIFSFileSystem(in);   
HWPFDocument hwpf = new HWPFDocument(pfs);   
Range range = hwpf.getRange();//得到文档的读取范围
TableIterator it = new TableIterator(range);

1.2 docx文件

// 处理docx格式 即office2007以后版本
//word 2007 图片不会被读取, 表格中的数据会被放在字符串的最后   
XWPFDocument xwpf = new XWPFDocument(in);//得到word文档的信息
Iterator<XWPFTable> it = xwpf.getTablesIterator();//得到word中的表格

1.3 xls文件和xlsx文件

if(file.getName().endsWith("xls")) {
	wb=new HSSFWorkbook(is);//创建了一个工作簿        	
}else if (file.getName().endsWith("xlsx")) {
	wb = new XSSFWorkbook(is);
}

目录

1. 通过给每个科室写不同的配置文件来获取指定位置的值,通过判断指定位置是否为某个值来确定是否需要换配置文件,还有一种思路是通过给定的key和value之间的间距来获取value
姓名=1,1
性别=1,4
出生年月=1,6
照片=1,8
民族=2,1
籍贯=2,4
出生地=2,6
党派及加入时间=3,1
参加工作时间=3,4
健康状况=3,6
专业技术职务=4,1
熟悉专业有何专长=4,5
学历学位-全日制教育-毕业院校及专业=5,6
学历学位-在职教育-毕业院校及专业=6,6
现任职务及主要社会兼职=7,2
简历=8,1
主要成绩及奖惩情况=9,1
近三年参加统战系统培训情况=10,1
通讯地址=18,1
邮政编码=18,6
办公电话=19,1
电子邮件=19,6
手机=20,1
传真=20,6
##家庭主要成员或国内外亲属中的知名人士
。。。

目录

/**
 * 读取配置文件
 * 
 * @param filePath
 */
public void loadProperties(String filePath) {
	Properties prop = new Properties();
	try {
		InputStream in = this.getClass().getResourceAsStream(filePath);
		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
		prop.load(bufferedReader);
		Set<Entry<Object, Object>> set = prop.entrySet();
		Iterator<Map.Entry<Object, Object>> it = set.iterator();
		String key = null, value = null;
		// 循环取出key-value
		while (it.hasNext()) {
			Entry<Object, Object> entry = it.next();
			key = String.valueOf(entry.getKey());
			value = String.valueOf(entry.getValue());
			// 将key-value放入map中
			configMap.put(key, value);
		}
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

目录

这个是把文档中有的直接一个对象一个照片对应的放入数据库中,当文档中不存在照片时将照片和照片的文件名作为一条数据存入数据库中,然后利用名字和对象的名字对应来确定,存图片的时候要先将图片转程二进制流再存入数据库中。
  1. 将图片转程byte数组的方法
	 //图片到byte数组
    public static byte[] image2byte(File filePath){
     byte[] data = null;
      FileImageInputStream input = null;
      try {
        input = new FileImageInputStream(filePath);
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        byte[] buf = new byte[1024];
        int numBytesRead = 0;
       while ((numBytesRead = input.read(buf)) != -1) {
       output.write(buf, 0, numBytesRead);
       }
       data = output.toByteArray();
       output.close();
       input.close();
     }
     catch (FileNotFoundException ex1) {
       ex1.printStackTrace();
     }
     catch (IOException ex1) {
       ex1.printStackTrace();
     }
     return data;
   }

目录

刚开始是想通过easyexcel直接解析excel文档,但是文件格式并不统一,不如poi来的方便,但是poi处理结构化强一点的没有easyexcel快所以,采用两者结合,刚开始一直捉摸怎么把得到的java解析出来放入内存中的对象存入数据库,一直在想通过mybatis这种直接存对象的,但是像这种脚本果然还是通过JDBC来的实在。还有一点是,像这种没有规律的非松散文档,可以通过一个中间表,将所有数据存入结构化的数据库中,再经过多层次加工得到最终的数据。反正这种写脚本的工作还是挺耗费时间的毕竟文件格式太松散,考虑的点太多,需要多次尝试。

你可能感兴趣的:(工作)