前言
最近本来想写linux的 但是工作太忙一直腾不出手学习. 所以我打算最近出:1.
shiro 一个权限模块定制化很强的安全框架。2.
elasticSearch 全文检索, 分词分片.3.
Linux 身为java开发工程师不得不会的一个系统.4.
docker 自动化部署容器
2021-2-18 21.55: 俺食言了 具体听我狡辩一番:
linux当时我会了 当没来得及时间贴出来 因为要开始新项目了。。加班 。
docker 俺还不会 只知道他是个可以自动化部署的好东西. 最近学学 过年在家没得空调 手冷不想搞(就是懒)。
好了兄弟们
关于elasticsearch太简单了 我上次搞了一下…可能是我还是皮毛 但我们做项目的时候用的也是那些,暂没深入研究。入门还是比较简单。暂不出文章了.
最近二十天会记录上面所有内容和坑.
到时候我会将所有源码和坑分享出来, 以百度网盘zip的形势。
言归正传:
我们今天是来写用poi导入word文档的。 准备一个普通格式的文档.类似这样.前端我就不贴了 无非就是选择一个文件然后上传到后台. 我这里只贴核心代码
word2003 和2007的区别就是 2003是doc结尾 2007是docx结尾
maven:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.15</version>
</dependency>
public class TestImportWord {
/**
*
* @param file
* 文件绝对路径的文件
* @throws DCPException
* 全局异常
* @throws IOException
* IO 异常
* @remark
* 读取word有表标题得表格
* @return List<String>
*/
@SuppressWarnings("resource")
static public void readWordTitleTable(String file) throws DCPException, IOException {
FileInputStream in = null;
POIFSFileSystem pfs = null;
// word 2003
if (file.endsWith(".doc") ||file.endsWith(".wps")) {
try {
in = new FileInputStream(file);
pfs = new POIFSFileSystem(in);
HWPFDocument hwpf = new HWPFDocument(pfs);
Range range = hwpf.getRange();
TableIterator it = new TableIterator(range);
while (it.hasNext()) {
Table tb = (Table) it.next();
wordTableText.setTableName(String.valueOf(countTable++));
int trCount = 0;
for (int i = 0; i < tb.numRows(); i++) {
TableRow tr = tb.getRow(i);
for (int j = 0; j < tr.numCells(); j++) {
String str = deleteSpace(tr.getCell(j).text().toString());;
System.out.println(str);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
assert pfs != null;
pfs.close();
in.close();
}
} else if (file.endsWith(".docx")) {
readTitleCheck(file);
} else {
throw newException("不支持的文件");
}
}
// word 2007
@SuppressWarnings("resource")
static private void readTitleCheck(String file) throws IOException {
XWPFDocument document = new XWPFDocument(new FileInputStream(file));
List<XWPFTable> tables = document.getTables();
for (XWPFTable table : tables) {
List<XWPFTableRow> rows = table.getRows();
for (XWPFTableRow row : rows) {
// 获取表格的每个单元格
List<XWPFTableCell> tableCells = row.getTableCells();
for (int i = 0; i < tableCells.size(); i++) {
String str = deleteSpace(tableCells.get(i).getText());
System.out.println(str);
}
}
}
}
// 去除空格
static private String deleteSpace(String tableStr) {
tableStr = tableStr.replace("", "");
StringBuilder replaceStr = new StringBuilder();
if (tableStr.contains("\r")) {
replaceStr = new StringBuilder(tableStr.replace("\r", ""));
} else if (tableStr.contains("\t")) {
replaceStr = new StringBuilder(tableStr.replace("\t", ""));
} else if (tableStr.contains(" ")) {
String [] str = tableStr.split(" ");
for (String s : str) {
replaceStr.append(s);
}
} else {
replaceStr = new StringBuilder(tableStr);
}
return replaceStr.toString();
}
}
poi读是有顺序的, 先读第一行第一列再是第一行第二列, 因此 只要我们word的表格是固定的, 我们就可以读出来存对象 再按比例分割, 然后我们就可以知道第一行第一列就是姓名头,第二行第一列就是姓名内容
。
/**
* @remark 忽略空值
* @param splitNum 按第几个分
* @param list
* @return 返回一个等比例的数组[[]]
*/
public static <T> List<List<T>> getSplitList(int splitNum, List<T> list) {
List<List<T>> splitList = new java.util.LinkedList<>();
int groupFlag = list.size() % splitNum == 0 ? (list.size() / splitNum) : (list.size() / splitNum + 1);
for (int j = 1; j <= groupFlag; j++) {
if ((j * splitNum) <= list.size()) {
splitList.add(list.subList(j * splitNum - splitNum, j * splitNum));
} else if ((j * splitNum) > list.size()) {
splitList.add(list.subList(j * splitNum - splitNum, list.size()));
}
}
return splitList;
}
其他你就可以写你的业务逻辑了。
感谢阅读
至此 我们就结束了哦
2020-12-21 10: 48