poi 读取word 遍历表格和单元格中的图片
背景
项目需要解析word表格

- 需要批量导入系统,并保存每行信息到数据库
- 并且要保存word中的图片,
- 并保持每条信息和图片的对应关系
- 一行数据可能有多条图片
解决办法
没有找到现成的代码,怎么办呐?看源码吧
分享快乐
给出代码
package com.util;
import org.apache.poi.xwpf.usermodel.*;
import org.jeecgframework.core.common.model.json.AjaxJson;
import org.jeecgframework.poi.word.entity.MyXWPFDocument;
import org.jeecgframework.poi.word.parse.excel.ExcelEntityParse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.imageio.stream.FileImageOutputStream;
import java.io.*;
import java.util.Iterator;
import java.util.List;
public class WordImportUtil {
private static final Logger logger = LoggerFactory.getLogger(WordImportUtil.class);
public static MyXWPFDocument getXWPFDocumen(InputStream is) {
try {
MyXWPFDocument doc = new MyXWPFDocument(is);
return doc;
} catch (Exception e) {
logger.error(e.getMessage(), e);
} finally {
try {
is.close();
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
return null;
}
public static AjaxJson parseThisTable(MyXWPFDocument doc){
Iterator<XWPFTable> itTable = doc.getTablesIterator();
XWPFTable table;
while (itTable.hasNext()) {
table = itTable.next();
XWPFTableRow row;
List<XWPFTableCell> cells;
Object listobj;
ExcelEntityParse excelEntityParse = new ExcelEntityParse();
for (int i = 0; i < table.getNumberOfRows(); i++) {
if(i ==0)
continue;
row = table.getRow(i);
cells = row.getTableCells();
for (int j = 0; j < cells.size(); j++) {
XWPFTableCell cell = cells.get(j);
if(j == 10){
getCellImage(cell);
}
//输出当前的单元格的数据
System.out.print(cell.getText() + "\t");
}
}
}
return null;
}
public static String getCellImage(XWPFTableCell cell){
List<XWPFParagraph> xwpfParagraphs = cell.getParagraphs();
if(xwpfParagraphs == null) return null;
for(XWPFParagraph xwpfParagraph:xwpfParagraphs){
List<XWPFRun> xwpfRunList = xwpfParagraph.getRuns();
if(xwpfRunList==null) return null;
for(XWPFRun xwpfRun:xwpfRunList){
List<XWPFPicture> xwpfPictureList = xwpfRun.getEmbeddedPictures();
if(xwpfParagraph==null) return null;
for(XWPFPicture xwpfPicture:xwpfPictureList){
xwpfPicture.getPictureData().getData();
xwpfPicture.getPictureData().getFileName();
byte2image( xwpfPicture.getPictureData().getData(),"d:/"+ xwpfPicture.getPictureData().getFileName());
}
}
}
return "";
}
public static void byte2image(byte[] data,String path){
if(data.length<3||path.equals("")) return;
FileImageOutputStream imageOutput = null;
try{
imageOutput = new FileImageOutputStream(new File(path));
imageOutput.write(data, 0, data.length);
System.out.println("Make Picture success,Please find image in " + path);
} catch(Exception ex) {
System.out.println("Exception: " + ex);
ex.printStackTrace();
}finally {
try {
imageOutput.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception{
MyXWPFDocument myXWPFDocument = getXWPFDocumen(new FileInputStream("d:/园艺作物加工副产物适宜性评价填写.docx"));
parseThisTable(myXWPFDocument);
}
}
poi 读取word 遍历表格和单元格中的图片的更多相关文章
- 如何在excel单元格中插入图片批注
在excel单元格中插入图片批注的方法: 1.选定要插入图片的单元格,然后右键选择插入批注. 2.然后会插入一个批注框,为了不影响图片效果,可以将批注文字都删除.然后鼠标移动到批注框边角再右键. 3. ...
- Aspose.Word 操作word复杂表格 拆分单元格 复制行 插入行 文字颜色
private void button3_Click(object sender, EventArgs e) { object savePathWord =&q ...
- Swift - 给表格的单元格UITableViewCell添加图片,详细文本标签
表格UITableView中,每一单元格都是一个UITableViewCell.其支持简单的自定义,比如在单元格的内部,添加图片和详细文本标签. 注意UITableViewCell的style: (1 ...
- c#在Excel指定单元格中插入图片
方法一: /// 将图片插入到指定的单元格位置,并设置图片的宽度和高度./// 注意:图片必须是绝对物理路径/// </summary>/// <param name="R ...
- POI读取带有公式的Excel单元格-xssf
if(CellType.FORMULA == row.getCell(j).getCellTypeEnum()) { try { cellValue = String.valueOf(row.getC ...
- jQuery,遍历表格每个单元格数据。
<table class="table table-hover table-bordered"> <thead> <tr> <th > ...
- 使用POI创建word表格合并单元格兼容wps
poi创建word表格合并单元格代码如下: /** * @Description: 跨列合并 */ public void mergeCellsHorizontal(XWPFTable table, ...
- 使用POI创建word表格-在表格单元格中创建子表格
要实现的功能如下:表格中的单元格中有子表格 实现代码如下: XWPFParagraph cellPara = row.getCell(j).getParagraphArray(0); //row.ge ...
- 将Word表格中单元格中的文字替换成对应的图片
示例 原文件结构: 替换后文档结构: 软件截图: 代码: using System;using System.Collections.Generic;using System.ComponentMod ...
随机推荐
- AI佳作解读系列(五) - 目标检测二十年技术综述
计算机视觉中的目标检测,因其在真实世界的大量应用需求,比如自动驾驶.视频监控.机器人视觉等,而被研究学者广泛关注. 上周四,arXiv新出一篇目标检测文献<Object Detection ...
- redis添加到linux系统服务
http://blog.csdn.net/justfor3l/article/details/53187795
- Qt5.编译错误.error: C2338: The slot requires more arguments than the signal provides.
1.Qt563x86vs2015,遇到如下 编译错误: error: C2338: The slot requires more arguments than the signal provides. ...
- 在Django中template遇到 "context must be a dict rather
原代码: # 使用模板文件 # 1.加载模板文件,获取一个模板文件 temp = loader.get_template('booktest/index.html') # 2.定义模板上下文:给模板文 ...
- BOOT目录磁盘占用满处理
背景:Ubuntu:16.04 查看已安装启动镜像 dpkg --get-selections |grep linux-image 这里会列出目前已经安装的启动镜像,一般分两种,一种状态为“insta ...
- CentOS7服务器查看相关配置命令
CPU个数:(base) [jiangshan@localhost ~]$ grep 'physical id' /proc/cpuinfo | sort -u | wc -l2CPU核数:(base ...
- MySQL(八)事务的隔离级别
一.事务的并发问题 1.脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据 2.不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并 ...
- [转帖]MySQL的又一神器-锁,MySQL面试必备
MySQL的又一神器-锁,MySQL面试必备 https://segmentfault.com/a/1190000020762791 lock 低一级的是 latch 原文链接:blog.ouya ...
- [转帖]鲁大师Q3季度PC内存排行:DDR3彻底淘汰 DDR5要来了
鲁大师Q3季度PC内存排行:DDR3彻底淘汰 DDR5要来了 https://www.cnbeta.com/articles/tech/902347.htm 10月23日消息,今天鲁大师公布Q3季度P ...
- 使用TypeScript创建Vue项目
Vue的灵活性总是让代码看起来非常洗练,对TypeScript来说也是一种挑战, 好在Vue对TypeScript进行了一次全方位的适配. 相对于React严谨的代码,Redux啰嗦的样板代码,Vue ...