前言

最近本来想写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结尾

java中的word数据导入功能 java导入word文档_apache


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();
	}
}

java中的word数据导入功能 java导入word文档_apache_02


java中的word数据导入功能 java导入word文档_java_03

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