利用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

测试代码:

  1. package com;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.util.ArrayList;
  8. import java.util.HashMap;
  9. import java.util.List;
  10. import java.util.Map;
  11. import org.apache.poi.POIXMLDocumentPart;
  12. import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
  13. import org.apache.poi.hssf.usermodel.HSSFPicture;
  14. import org.apache.poi.hssf.usermodel.HSSFPictureData;
  15. import org.apache.poi.hssf.usermodel.HSSFShape;
  16. import org.apache.poi.hssf.usermodel.HSSFSheet;
  17. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  18. import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
  19. import org.apache.poi.ss.usermodel.PictureData;
  20. import org.apache.poi.ss.usermodel.Sheet;
  21. import org.apache.poi.ss.usermodel.Workbook;
  22. import org.apache.poi.ss.usermodel.WorkbookFactory;
  23. import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
  24. import org.apache.poi.xssf.usermodel.XSSFDrawing;
  25. import org.apache.poi.xssf.usermodel.XSSFPicture;
  26. import org.apache.poi.xssf.usermodel.XSSFShape;
  27. import org.apache.poi.xssf.usermodel.XSSFSheet;
  28. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  29. import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;
  30. /**
  31. * @since 2013-04-22
  32. * @author Gerrard
  33. * 获取excel中 图片,并得到图片位置,支持03 07 多sheet
  34. */
  35. public class GetImgFromExcel {
  36. /**
  37. * @param args
  38. * @throws IOException
  39. * @throws InvalidFormatException
  40. */
  41. public static void main(String[] args) throws InvalidFormatException, IOException {
  42. // 创建文件
  43. File file = new File("model/test.xls");
  44. // 创建流
  45. InputStream input = new FileInputStream(file);
  46. // 获取文件后缀名
  47. String fileExt =  file.getName().substring(file.getName().lastIndexOf(".") + 1);
  48. // 创建Workbook
  49. Workbook wb = null;
  50. // 创建sheet
  51. Sheet sheet = null;
  52. //根据后缀判断excel 2003 or 2007+
  53. if (fileExt.equals("xls")) {
  54. wb = (HSSFWorkbook) WorkbookFactory.create(input);
  55. } else {
  56. wb = new XSSFWorkbook(input);
  57. }
  58. //获取excel sheet总数
  59. int sheetNumbers = wb.getNumberOfSheets();
  60. // sheet list
  61. List<Map<String, PictureData>> sheetList = new ArrayList<Map<String, PictureData>>();
  62. // 循环sheet
  63. for (int i = 0; i < sheetNumbers; i++) {
  64. sheet = wb.getSheetAt(i);
  65. // map等待存储excel图片
  66. Map<String, PictureData> sheetIndexPicMap;
  67. // 判断用07还是03的方法获取图片
  68. if (fileExt.equals("xls")) {
  69. sheetIndexPicMap = getSheetPictrues03(i, (HSSFSheet) sheet, (HSSFWorkbook) wb);
  70. } else {
  71. sheetIndexPicMap = getSheetPictrues07(i, (XSSFSheet) sheet, (XSSFWorkbook) wb);
  72. }
  73. // 将当前sheet图片map存入list
  74. sheetList.add(sheetIndexPicMap);
  75. }
  76. printImg(sheetList);
  77. }
  78. /**
  79. * 获取Excel2003图片
  80. * @param sheetNum 当前sheet编号
  81. * @param sheet 当前sheet对象
  82. * @param workbook 工作簿对象
  83. * @return Map key:图片单元格索引(0_1_1)String,value:图片流PictureData
  84. * @throws IOException
  85. */
  86. public static Map<String, PictureData> getSheetPictrues03(int sheetNum,
  87. HSSFSheet sheet, HSSFWorkbook workbook) {
  88. Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>();
  89. List<HSSFPictureData> pictures = workbook.getAllPictures();
  90. if (pictures.size() != 0) {
  91. for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) {
  92. HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor();
  93. if (shape instanceof HSSFPicture) {
  94. HSSFPicture pic = (HSSFPicture) shape;
  95. int pictureIndex = pic.getPictureIndex() - 1;
  96. HSSFPictureData picData = pictures.get(pictureIndex);
  97. String picIndex = String.valueOf(sheetNum) + "_"
  98. + String.valueOf(anchor.getRow1()) + "_"
  99. + String.valueOf(anchor.getCol1());
  100. sheetIndexPicMap.put(picIndex, picData);
  101. }
  102. }
  103. return sheetIndexPicMap;
  104. } else {
  105. return null;
  106. }
  107. }
  108. /**
  109. * 获取Excel2007图片
  110. * @param sheetNum 当前sheet编号
  111. * @param sheet 当前sheet对象
  112. * @param workbook 工作簿对象
  113. * @return Map key:图片单元格索引(0_1_1)String,value:图片流PictureData
  114. */
  115. public static Map<String, PictureData> getSheetPictrues07(int sheetNum,
  116. XSSFSheet sheet, XSSFWorkbook workbook) {
  117. Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>();
  118. for (POIXMLDocumentPart dr : sheet.getRelations()) {
  119. if (dr instanceof XSSFDrawing) {
  120. XSSFDrawing drawing = (XSSFDrawing) dr;
  121. List<XSSFShape> shapes = drawing.getShapes();
  122. for (XSSFShape shape : shapes) {
  123. XSSFPicture pic = (XSSFPicture) shape;
  124. XSSFClientAnchor anchor = pic.getPreferredSize();
  125. CTMarker ctMarker = anchor.getFrom();
  126. String picIndex = String.valueOf(sheetNum) + "_"
  127. + ctMarker.getRow() + "_" + ctMarker.getCol();
  128. sheetIndexPicMap.put(picIndex, pic.getPictureData());
  129. }
  130. }
  131. }
  132. return sheetIndexPicMap;
  133. }
  134. public static void printImg(List<Map<String, PictureData>> sheetList) throws IOException {
  135. for (Map<String, PictureData> map : sheetList) {
  136. Object key[] = map.keySet().toArray();
  137. for (int i = 0; i < map.size(); i++) {
  138. // 获取图片流
  139. PictureData pic = map.get(key[i]);
  140. // 获取图片索引
  141. String picName = key[i].toString();
  142. // 获取图片格式
  143. String ext = pic.suggestFileExtension();
  144. byte[] data = pic.getData();
  145. FileOutputStream out = new FileOutputStream("D:\\pic" + picName + "." + ext);
  146. out.write(data);
  147. out.close();
  148. }
  149. }
  150. }
  151. }

利用POI获取Excel中图片和图片位置的更多相关文章

  1. 利用POI抽取word中的图片并保存在文件中

    利用POI抽取word中的图片并保存在文件中 poi.apache.org/hwpf/quick-guide.html 1.抽取word doc中的图片 package parse; import j ...

  2. JAVA使用POI获取Excel的列数与行数

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能. 下面这篇文章给大家介 ...

  3. C# 获取Excel中的合并单元格

    C# 获取Excel中的合并单元格 我们在制作表格时,有时经常需要合并及取消合并一些单元格.在取消合并单元格时需要逐个查找及取消,比较麻烦.这里分享一个简单的方法来识别Excel中的合并单元格,识别这 ...

  4. 十九、利用OGNL获取ValueStack中:根栈和contextMap中的数据

    利用OGNL获取ValueStack中:根栈和contextMap中的数据 原则:OGNL表达式如果以#开头,访问的contextMap中的数据 如果不以#开头,是访问的根栈中的对象的属性(List集 ...

  5. Yii中使用PHPexcel获取excel中数据

    1.view中代码如下: <form name="frmBatchSettle" id="" action="" method=&qu ...

  6. POI处理Excel中的日期数据类型

    在POI处理Excel中的日期类型的单元格时,如果仅仅是判断它是否为日期类型的话,最终会以NUMERIC类型来处理. 正确的处理方法是先判断单元格 的类型是否则NUMERIC类型, 然后再判断单元格是 ...

  7. 基于BootStrap的initupload()实现Excel上传和获取excel中的数据

    简单说明:后边要做exl解析(还没做呢),所以先有一个excel的的上传以及获取excel中的数据,展示出来. 代码: //html代码 <div class="btn-group&q ...

  8. 利用PHP获取访客IP、地区位置、浏览器及来源页面等信息

    这篇文章主要介绍了利用PHP获取访客IP.地区位置.浏览器及来源页面等信息的相关资料,文中给出了详细的示例代码供大家参考学习,对大家具有一定的参考借鉴价值,需要的朋友们下面来一起看看吧. 前言 本文中 ...

  9. c# 应用NPOI 获取Excel中的图片,保存至本地的算法

    要求:读取excel中的图片,保存到指定路径 思路:  利用NPOI中 GetAllPictures()方法获取图片信息 步骤: 1.新建一个Windows窗体应用程序 2.桌面新建一个excel,贴 ...

随机推荐

  1. ajax加php实现简单的投票效果

    废话少说,作为一个前端猿,首先上前端的代码. 1.上html代码: <!DOCTYPE html> <html> <head lang="en"> ...

  2. java中的URL InetAddress类

    /* * InetAddress类: * 用于标识网络上的硬件资源,表示互联网协议(ip)地址,是java对ip地址的封装. * 其实例对象包含以数字形式保存的IP地址,主机名. * InetAddr ...

  3. 通过一个表的id同时查询多个表的数据

    'select c.字段名,x.字段名 as 改为新的显示名,x.字段名 from 表名1 b,表名2 c,表名3 x where b.字段id=' . $id . ' and b.`字段id`=c. ...

  4. JQuery笔记(一)jq的使用方法

    我用的jq版本是支持pc版为主的最高1版本里最高的1.124版本 官网的链接是只有最新的3下载,我把我在官网下载的jq代码链接发出来,如下 点我获取jq代码 和js不同的是,jq开发者封装了一些方法 ...

  5. MapReduce库类

    Hadoop除了可以让开发人员自行编写map函数和reduce函数,还提供一些常用函数(mapper.reducer和partitioner)的类库,这些类位于 org.apache.hadoop.m ...

  6. javascript 日期对象

    1.日期对象定义 var Udate=new Date();//获得当前日期 2.Date对象中处理时间和日期的常用方法: 3.返回/设置年份 var mydate=new Date();//当前时间 ...

  7. ORACEL12c求和SUM(a+b)与SUM(a)+SUM(b)结果不一致问题

    今天在oracle12c数据库遇到的问题,下面重现一下: 1.先创建一个临时表 temp.一个数据表bitest_sum; -- Create table create table PEC.BITES ...

  8. JavaScript input框输入实时校验

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  9. Java线程池主线程等待子线程执行完成

    今天讨论一个入门级的话题, 不然没东西更新对不起空间和域名~~ 工作总往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总的产景, 这时候就需要使用线程了. 一 ...

  10. HDU 5831 Rikka with Parenthesis II

    如果左括号数量和右括号数量不等,输出No 进行一次匹配,看匹配完之后栈中还有多少元素: 如果n=2,并且栈中无元素,说明是()的情况,输出No 如果n=2,并且栈中有元素,说明是)(的情况,输出Yes ...