利用POI获取Excel中图片和图片位置
利用POI获取Excel中图片和图片位置(支持excel2003or2007多sheet)
转自:http://blog.csdn.net/delongcpp/article/details/8833995
第三方JAR包(apache下载POI即可):
- poi-3.9-20121203.jar
- dom4j-1.6.1.jar
- poi-ooxml-3.9-20121203.jar
- poi-ooxml-schemas-3.9-20121203.jar
- poi-scratchpad-3.9-20121203.jar
- stax-api-1.0.1.jar
- xmlbeans-2.3.0.jar
测试代码:
- package com;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import org.apache.poi.POIXMLDocumentPart;
- import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
- import org.apache.poi.hssf.usermodel.HSSFPicture;
- import org.apache.poi.hssf.usermodel.HSSFPictureData;
- import org.apache.poi.hssf.usermodel.HSSFShape;
- import org.apache.poi.hssf.usermodel.HSSFSheet;
- import org.apache.poi.hssf.usermodel.HSSFWorkbook;
- import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
- import org.apache.poi.ss.usermodel.PictureData;
- import org.apache.poi.ss.usermodel.Sheet;
- import org.apache.poi.ss.usermodel.Workbook;
- import org.apache.poi.ss.usermodel.WorkbookFactory;
- import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
- import org.apache.poi.xssf.usermodel.XSSFDrawing;
- import org.apache.poi.xssf.usermodel.XSSFPicture;
- import org.apache.poi.xssf.usermodel.XSSFShape;
- import org.apache.poi.xssf.usermodel.XSSFSheet;
- import org.apache.poi.xssf.usermodel.XSSFWorkbook;
- import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;
- /**
- * @since 2013-04-22
- * @author Gerrard
- * 获取excel中 图片,并得到图片位置,支持03 07 多sheet
- */
- public class GetImgFromExcel {
- /**
- * @param args
- * @throws IOException
- * @throws InvalidFormatException
- */
- public static void main(String[] args) throws InvalidFormatException, IOException {
- // 创建文件
- File file = new File("model/test.xls");
- // 创建流
- InputStream input = new FileInputStream(file);
- // 获取文件后缀名
- String fileExt = file.getName().substring(file.getName().lastIndexOf(".") + 1);
- // 创建Workbook
- Workbook wb = null;
- // 创建sheet
- Sheet sheet = null;
- //根据后缀判断excel 2003 or 2007+
- if (fileExt.equals("xls")) {
- wb = (HSSFWorkbook) WorkbookFactory.create(input);
- } else {
- wb = new XSSFWorkbook(input);
- }
- //获取excel sheet总数
- int sheetNumbers = wb.getNumberOfSheets();
- // sheet list
- List<Map<String, PictureData>> sheetList = new ArrayList<Map<String, PictureData>>();
- // 循环sheet
- for (int i = 0; i < sheetNumbers; i++) {
- sheet = wb.getSheetAt(i);
- // map等待存储excel图片
- Map<String, PictureData> sheetIndexPicMap;
- // 判断用07还是03的方法获取图片
- if (fileExt.equals("xls")) {
- sheetIndexPicMap = getSheetPictrues03(i, (HSSFSheet) sheet, (HSSFWorkbook) wb);
- } else {
- sheetIndexPicMap = getSheetPictrues07(i, (XSSFSheet) sheet, (XSSFWorkbook) wb);
- }
- // 将当前sheet图片map存入list
- sheetList.add(sheetIndexPicMap);
- }
- printImg(sheetList);
- }
- /**
- * 获取Excel2003图片
- * @param sheetNum 当前sheet编号
- * @param sheet 当前sheet对象
- * @param workbook 工作簿对象
- * @return Map key:图片单元格索引(0_1_1)String,value:图片流PictureData
- * @throws IOException
- */
- public static Map<String, PictureData> getSheetPictrues03(int sheetNum,
- HSSFSheet sheet, HSSFWorkbook workbook) {
- Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>();
- List<HSSFPictureData> pictures = workbook.getAllPictures();
- if (pictures.size() != 0) {
- for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) {
- HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor();
- if (shape instanceof HSSFPicture) {
- HSSFPicture pic = (HSSFPicture) shape;
- int pictureIndex = pic.getPictureIndex() - 1;
- HSSFPictureData picData = pictures.get(pictureIndex);
- String picIndex = String.valueOf(sheetNum) + "_"
- + String.valueOf(anchor.getRow1()) + "_"
- + String.valueOf(anchor.getCol1());
- sheetIndexPicMap.put(picIndex, picData);
- }
- }
- return sheetIndexPicMap;
- } else {
- return null;
- }
- }
- /**
- * 获取Excel2007图片
- * @param sheetNum 当前sheet编号
- * @param sheet 当前sheet对象
- * @param workbook 工作簿对象
- * @return Map key:图片单元格索引(0_1_1)String,value:图片流PictureData
- */
- public static Map<String, PictureData> getSheetPictrues07(int sheetNum,
- XSSFSheet sheet, XSSFWorkbook workbook) {
- Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>();
- for (POIXMLDocumentPart dr : sheet.getRelations()) {
- if (dr instanceof XSSFDrawing) {
- XSSFDrawing drawing = (XSSFDrawing) dr;
- List<XSSFShape> shapes = drawing.getShapes();
- for (XSSFShape shape : shapes) {
- XSSFPicture pic = (XSSFPicture) shape;
- XSSFClientAnchor anchor = pic.getPreferredSize();
- CTMarker ctMarker = anchor.getFrom();
- String picIndex = String.valueOf(sheetNum) + "_"
- + ctMarker.getRow() + "_" + ctMarker.getCol();
- sheetIndexPicMap.put(picIndex, pic.getPictureData());
- }
- }
- }
- return sheetIndexPicMap;
- }
- public static void printImg(List<Map<String, PictureData>> sheetList) throws IOException {
- for (Map<String, PictureData> map : sheetList) {
- Object key[] = map.keySet().toArray();
- for (int i = 0; i < map.size(); i++) {
- // 获取图片流
- PictureData pic = map.get(key[i]);
- // 获取图片索引
- String picName = key[i].toString();
- // 获取图片格式
- String ext = pic.suggestFileExtension();
- byte[] data = pic.getData();
- FileOutputStream out = new FileOutputStream("D:\\pic" + picName + "." + ext);
- out.write(data);
- out.close();
- }
- }
- }
- }
利用POI获取Excel中图片和图片位置的更多相关文章
- 利用POI抽取word中的图片并保存在文件中
利用POI抽取word中的图片并保存在文件中 poi.apache.org/hwpf/quick-guide.html 1.抽取word doc中的图片 package parse; import j ...
- JAVA使用POI获取Excel的列数与行数
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能. 下面这篇文章给大家介 ...
- C# 获取Excel中的合并单元格
C# 获取Excel中的合并单元格 我们在制作表格时,有时经常需要合并及取消合并一些单元格.在取消合并单元格时需要逐个查找及取消,比较麻烦.这里分享一个简单的方法来识别Excel中的合并单元格,识别这 ...
- 十九、利用OGNL获取ValueStack中:根栈和contextMap中的数据
利用OGNL获取ValueStack中:根栈和contextMap中的数据 原则:OGNL表达式如果以#开头,访问的contextMap中的数据 如果不以#开头,是访问的根栈中的对象的属性(List集 ...
- Yii中使用PHPexcel获取excel中数据
1.view中代码如下: <form name="frmBatchSettle" id="" action="" method=&qu ...
- POI处理Excel中的日期数据类型
在POI处理Excel中的日期类型的单元格时,如果仅仅是判断它是否为日期类型的话,最终会以NUMERIC类型来处理. 正确的处理方法是先判断单元格 的类型是否则NUMERIC类型, 然后再判断单元格是 ...
- 基于BootStrap的initupload()实现Excel上传和获取excel中的数据
简单说明:后边要做exl解析(还没做呢),所以先有一个excel的的上传以及获取excel中的数据,展示出来. 代码: //html代码 <div class="btn-group&q ...
- 利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
这篇文章主要介绍了利用PHP获取访客IP.地区位置.浏览器及来源页面等信息的相关资料,文中给出了详细的示例代码供大家参考学习,对大家具有一定的参考借鉴价值,需要的朋友们下面来一起看看吧. 前言 本文中 ...
- c# 应用NPOI 获取Excel中的图片,保存至本地的算法
要求:读取excel中的图片,保存到指定路径 思路: 利用NPOI中 GetAllPictures()方法获取图片信息 步骤: 1.新建一个Windows窗体应用程序 2.桌面新建一个excel,贴 ...
随机推荐
- java自带的监控工具VisualVM(二)远程监控
ps:尝试了网上的几个网友提供的方法,始终不得其法,汇总后,终于尝试成功!将一些需要注意的细节也记录下来以后备用! 我们经常需要对我们的开发的软件做各种测试, 软件对系统资源的使用情况更是不可少, 目 ...
- Atom编辑器之加快React开发的插件汇总
汇总下比较实用的atom插件[偏react开发的]-- 博主发现这个还是比较全面的! atom-react-autocomplete–项目内,组件名及状态的自动补全 autocomplete-js- ...
- ios UIImageView异步加载网络图片
方法1:在UI线程中同步加载网络图片 UIImageView *headview = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 4 ...
- 【Python】0/1背包、动态规划
0/1背包问题:在能承受一定重量的背包中,放入重量不同,价值不同的几件物品,怎样放能让背包中物品的价值最大? 比如,有三件物品重量w,价值v分别是 w=[5,3,2] v=[9,7,8] 包的容量是5 ...
- MySQL data路径为空解决方法
CMD x:\mysql\5.7.12\bin>mysqld --initialize-insecure --user=mysql
- git 客户端提交
01 按照git到本地 02 按照小乌龟操作面板, 03 (git 和小乌龟)自动加载到右键快捷方式
- [河南省ACM省赛-第三届] AMAZING AUCTION (nyoj 251)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=251 规则: 1.若某竞标价唯一,则胜出 2.若不存在唯一竞标价,则投标次数最少竞标价中标 ...
- iOS 最新App提交上架流程及部分问题的解决方案2016.12.21,感谢原博主!!!
内容摘自http://www.cocoachina.com/bbs/3g/read.php?tid=330302,原博特别详细,下面我对部分地方进行了修改,主要是对在打包验证和上传的时候遇到的问题进行 ...
- 推荐几个好的 Maven 常用仓库网址
注意,以下内容转载自:推荐几个好的 Maven 常用仓库网址 Maven 确确实实是个好东西,用来管理项目显得很方便,但是如果是通过 Maven 来远程下载 JAR 包的话,我宿舍的带宽是4兆的,4个 ...
- linux安装bind with DLZ <NIOT>
2015年6月11日 1.sudo wget ftp://ftp.isc.org/isc/bind9/9.10.1/bind-9.10.1.tar.gz 或者 使用“rz”命令 2.tar -zxv ...