因为是项目收尾阶段,需要帮客户录入数据,产品小姐姐发过来的是一个word文档,以前呐,都是解析excel文档然后保存到数据库,这次来个新花样是word文档。😔
只好发挥我一年多面向百度编程的经验一顿查,踩了好多坑最后确定了还是使用Apache poi工具,咱程序员呐,可以当时写不出来但是一定得会面向百度编程🤪🤪。
从网上找了一些POI工具介绍
Apache poi的hwpf模块是专门用来对word doc文件进行读写操作的。在hwpf里面我们使用HWPFDocument来表示一个word doc文档。在HWPFDocument里面有这么几个概念:
使用POI读写Word doc文件
① Range:它表示一个范围,这个范围可以是整个文档,也可以是里面的某一小节(Section),也可以是某一个段落(Paragraph),还可以是拥有共同属性的一段文本(CharacterRun)。
② Section:word文档的一个小节,一个word文档可以由多个小节构成。
③ Paragraph:word文档的一个段落,一个小节可以由多个段落构成。
④ CharacterRun:具有相同属性的一段文本,一个段落可以由多个CharacterRun组成。
⑤ Table:一个表格。
⑥ TableRow:表格对应的行。
⑦ TableCell:表格对应的单元格。
Section、Paragraph、CharacterRun和Table都继承自Range
废不多说,上代码👉
常规操作先引入依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.8</version>
</dependency>
一、解析word文档表格的方法
这是需要解析的word文档
因为是获取所有单元格内容,前面是对应的需要插入数据库的字段名,后面是插入的值,所以要从考场管理分为两个List,前面只需要去1、3、5、7…位置的值就可以,如果不太了解的可以debug然后一点点打印看看。
// 这是controller,其实解析word文档的代码都在这儿,service只是对数据进行处理
@GetMapping("/parsingWord")
public AjaxResult parsingWord() throws Exception {
FileInputStream in = new FileInputStream("C:\\考试点0101\\(双鸭山)考试点信息表(2020.12.30).doc");// 载入文档
POIFSFileSystem pfs = new POIFSFileSystem(in);
HWPFDocument hwpf = new HWPFDocument(pfs);
Range range = hwpf.getRange();// 得到文档的读取范围
TableIterator it = new TableIterator(range);
List<String> list = new ArrayList<>();
StringBuffer errMsg = new StringBuffer();
while (it.hasNext()) {
Table tb = it.next();
// 迭代行,默认从0开始
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);// 取得单元格
// 取得单元格的内容
String s = "";
for (int k = 0; k < td.numParagraphs(); k++) {
Paragraph para = td.getParagraph(k);// 获取第k个段落
s += para.text().trim();
// System.out.println(s);
}
s = s.replace("•", "");
list.add(s);
}
}
}
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("")) {
errMsg.append(list.get(i - 1) + "的下一个数值为空<br/>");
}
}
if (errMsg.toString().equals("")) {
String isSuccess = examCenterService.insertInfo(list);
return AjaxResult.success(isSuccess);
} else {
return AjaxResult.error(errMsg.toString());
}
}
@Override
public String insertInfo(List<String> list) {
List<String> exam_center = new ArrayList<>();
List<String> exam_center_site = new ArrayList<>();
int f = 0;
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
if (s.equals("考场管理")) {
f = i;
}
}
for (int i = 0; i < f; i++) {
exam_center.add(list.get(i));
}
for (int i = f + 5; i < list.size(); i++) {
exam_center_site.add(list.get(i));
}
System.out.println(exam_center);
System.out.println(exam_center_site);
ExamCenter examCenter = new ExamCenter();
examCenter.setCenterName(exam_center.get(1)); // 市中心名称
examCenter.setCenterUid(1L); // 考点的uid 这个先设置默认
examCenter.setName(exam_center.get(3)); // 考点名称
examCenter.setAddrDetail(exam_center.get(5)); // 考点详细地址
examCenter.setLeader(exam_center.get(7)); // 考点负责人
examCenter.setPhone(exam_center.get(9)); // 联系电话
examCenter.setArea(exam_center.get(11)); // 考点面积
examCenter.setAccount(exam_center.get(13)); // 登录账号
examCenter.setPassword(exam_center.get(15)); // 密码
examCenter.setCreateTime(DateUtils.getNowDate());
examCenter.setCreateDept(102);
Integer insert = examCenterMapper.insertExamCenter(examCenter);
if (insert > 0) {
StringBuffer sb = new StringBuffer();
// 根据插入最新Id返回一直有问题 先这样查
Integer id = examCenterMapper.selectLastId();
int l = 0;
if (exam_center_site.size() % 4 == 0) {
l = exam_center_site.size() / 4;
} else {
return "考点信息关键数据缺失";
}
for (int i = 0; i < l; i++) {
List<String> exam_center_site_list = new ArrayList<>();
exam_center_site_list.add(exam_center_site.get(i * 4));
exam_center_site_list.add(exam_center_site.get((i * 4) + 1));
exam_center_site_list.add(exam_center_site.get((i * 4) + 2));
exam_center_site_list.add(exam_center_site.get((i * 4) + 3));
Integer isSuccess = iExamCenterSiteService.insertInfo(exam_center_site_list, id);
if (isSuccess < 1) {
int a = i + 1;
sb.append("考场信息第" + a + "条数据插入失败<br/>");
}
}
return sb.toString();
} else {
return "考点信息插入失败";
}
}
二、解析word文档段落的方法
public static void main(String[] args) throws IOException {
InputStream is;
try {
is = new FileInputStream(new File("E:\\考点信息.doc"));
POIFSFileSystem fs = new POIFSFileSystem(is);
HWPFDocument document = new HWPFDocument(fs);
Range range = document.getRange();
String title = null;int item=0;
for(int i=0;i<range.numParagraphs();i++) {//通过循环读取每一段
Paragraph para1 = range.getParagraph(i);
CharacterRun run1=para1.getCharacterRun(0); //获取每一段的属性
item = i;//item用来记录当前位置
if(run1.getFontSize()==26) {//如果字体符合,说明该段落是小标题
String context = "";
title = para1.text().trim().replaceAll("\r\n", "");//取这一段为当前的title值
for(int j=item+1;j<range.numParagraphs();j++) {//从当前段的下一段开始,查找所有解释段落,
Paragraph para2 = range.getParagraph(j);
CharacterRun run2=para2.getCharacterRun(0);
if(run2.getFontSize()==18) {//如果字体符合,说明该段落是解释段落之一
context = context+para2.text().trim().replaceAll("\r\n", "");//把解释段落合并成一个字符串
}
if(run2.getFontSize()==26) {//如果字体为26,说明到了下一个小标题,则退出循环
break;
}
}
//以下为插入数据库方法
WordDao worddao = new WordDao();
worddao.addData(title, context);
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}