记录上传word读取内容后端实现
controller
@PostMapping(value = "/upload")
@ResponseBody
public List<List<String>> WordRead(@RequestParam(value = "file") MultipartFile file) {
System.out.println("controller");
return wordService.readContent(file);
}
service
@Override
public List<List<String>> readContent(MultipartFile file) {
try {
FileInputStream in = (FileInputStream) file.getInputStream();//载入 文档
// 处理docx格式 即office2007以后版本
if (file.getOriginalFilename().endsWith("docx")) {
//word 2007 图片不会被读取, 表格中的数据会被放在字符串的最后
XWPFDocument xwpf = new XWPFDocument(in);//得到word文档的信息
Iterator<XWPFTable> itpre = xwpf.getTablesIterator();//得到word中的表格
int total = 0;
while (itpre.hasNext()) {
itpre.next();
total += 1;
}
Iterator<XWPFTable> it = xwpf.getTablesIterator();//得到word中的表格
// 设置需要读取的表格 set是设置需要读取的第几个表格,total是文件中表格的总数
int set = 1;
int num = set;
// 过滤前面不需要的表格
for (int i = 0; i < set - 1; i++) {
it.hasNext();
it.next();
}
List<List<String>> tableList = new ArrayList<>();
while (it.hasNext()) {
XWPFTable table = it.next();
//System.out.println("这是第" + num + "个表的数据");
List<XWPFTableRow> rows = table.getRows();
//读取每一行数据
for (int i = 0; i < rows.size(); i++) {
XWPFTableRow row = rows.get(i);
//读取每一列数据
List<XWPFTableCell> cells = row.getTableCells();
List<String> rowList = new ArrayList<>();
for (int j = 0; j < cells.size(); j++) {
XWPFTableCell cell = cells.get(j);
rowList.add(cell.getText());
//输出当前的单元格的数据
//System.out.print(cell.getText()+"["+i+","+j+"]" + "\t");
}
tableList.add(rowList);
//System.out.println();
}
// 过滤多余的表格
while (num < total) {
it.hasNext();
it.next();
num += 1;
}
}
return tableList;
} else {
// 处理doc格式 即office2003版本
POIFSFileSystem pfs = new POIFSFileSystem(in);
HWPFDocument hwpf = new HWPFDocument(pfs);
Range range = hwpf.getRange();//得到文档的读取范围
TableIterator itpre = new TableIterator(range);
;//得到word中的表格
int total = 0;
while (itpre.hasNext()) {
itpre.next();
total += 1;
}
TableIterator it = new TableIterator(range);
// 迭代文档中的表格
// 如果有多个表格只读取需要的一个 set是设置需要读取的第几个表格,total是文件中表格的总数
int set = 1;
int num = set;
for (int i = 0; i < set - 1; i++) {
it.hasNext();
it.next();
}
List<List<String>> tableList = new ArrayList<>();
while (it.hasNext()) {
Table tb = (Table) it.next();
//System.out.println("这是第" + num + "个表的数据");
//迭代行,默认从0开始,可以依据需要设置i的值,改变起始行数,也可设置读取到那行,只需修改循环的判断条件即可
for (int i = 0; i < tb.numRows(); i++) {
List<String> rowList = new ArrayList<>();
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);
}
rowList.add(s);
//System.out.print(s+"["+i+","+j+"]" + "\t");
}
}
tableList.add(rowList);
//System.out.println();
}
// 过滤多余的表格
while (num < total) {
it.hasNext();
it.next();
num += 1;
}
}
return tableList;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}