poi读取excel内的图片,网上例子很多,本文是网上找的,所用poi版本为poi3.9,代码本人亲测通过,注意,本文所说的图片是jpeg,png等格式的图片,使用excel绘制的图表不再本文所说的图片范围内。
参考原文如下:
http://blog.csdn.net/delongcpp/article/details/8833995 http://www.cnblogs.com/dingmy/archive/2013/03/11/2954217.html
poi 3.9读取excel 2003内的图片:
/** * 获取Excel2003图片 * * @param sheetNum * 当前sheet编号 * @param sheet * 当前sheet对象 * @param workbook * 工作簿对象 * @return Map key:图片单元格索引(sheet(id)_[row1,col1]_[row2,col2])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) { HSSFPatriarch hssPatriarch = sheet.getDrawingPatriarch(); if (hssPatriarch != null) { for (HSSFShape shape : hssPatriarch.getChildren()) { HSSFClientAnchor anchor = (HSSFClientAnchor) shape .getAnchor(); if (shape instanceof HSSFPicture) { HSSFPicture pic = (HSSFPicture) shape; int pictureIndex = pic.getPictureIndex() - 1; HSSFPictureData picData = pictures.get(pictureIndex); //行列下标都是从0开始的, //这里行数加+1,第一张图片信息行数不准确,测试下就知道了 String picIndex = "sheet" + String.valueOf(sheetNum) + "_[" + String.valueOf(anchor.getRow1()+1)+"," + String.valueOf(anchor.getCol1()) + "]_["+ String.valueOf(anchor.getRow2()+1)+"," + String.valueOf(anchor.getCol2())+"]"; sheetIndexPicMap.put(picIndex, picData); } } } return sheetIndexPicMap; } else { return null; } }
保存读取的图片代码为:
public static void printImg(List<Map<String, PictureData>> sheetList, String filePath) 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(filePath + picName + "." + ext); out.write(data); out.close(); } } }
对于poi 3.9在读取excel 2007的图片,网上搜了下,只能一次全部读取出来,拿不到图片的具体信息,比如图片所在的sheet,图片位置(行,列)信息。poi可能有相关API,没找到,有知道的,请指教,谢谢。
poi读取excel 2007图片代码如下:
public static void getSheetPic07(String filePath, XSSFSheet sheet, XSSFWorkbook workbook) throws Exception { List<XSSFPictureData> pictures = workbook.getAllPictures(); Map<String, XSSFPictureData> map = new HashMap<String, XSSFPictureData>(); for (int i = 0; i < pictures.size(); i++) { XSSFPictureData pictureData = pictures.get(i); byte[] data = pictureData.getData(); String ext = pictureData.suggestFileExtension(); FileOutputStream out = new FileOutputStream(filePath + "img_" + i + "." + ext); out.write(data); out.close(); } }
测试方法为:
public static void main(String[] args) throws Exception { // 创建文件 File file = new File("f:/saveFile/testpic2003.xls"); // 创建流 InputStream input = new FileInputStream(file); // 获取文件后缀名 String fileExt = file.getName().substring( file.getName().lastIndexOf(".") + 1); // 创建Workbook Workbook wb = null; // 创建sheet Sheet sheet = null; // 根据后缀判断03,07 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>>(); if (fileExt.equals("xls")) { // 循环sheet for (int i = 0; i < sheetNumbers; i++) { sheet = wb.getSheetAt(i); // map等待存储excel图片 Map<String, PictureData> sheetIndexPicMap = null; sheetIndexPicMap = getSheetPictrues03(i, (HSSFSheet) sheet, (HSSFWorkbook) wb); // 将当前sheet图片map存入list sheetList.add(sheetIndexPicMap); } printImg(sheetList, "f:/saveFile/pic/"); } else { getSheetPic07("f:/saveFile/pic/", (XSSFSheet) sheet, (XSSFWorkbook) wb); } }
全文完。
相关推荐
Java用poi读取excel文件Java用poi读取excel文件Java用poi读取excel文件
POI 读取Excel文件 POI 读取Excel文件
使用poi解析excel文件,并将数据写入到数据库 项目说明 这个项目实现的功能是读取excel文件中的数据,解析并写入数据库。 读取的excel文件位于项目目录下的 excel\0805.xlsx 使用IntelliJ IDEA开发此项目 使用MYSQL...
最新版poi 相关6个jar包 for java。Java读取Excel表格数据时(.xls、.xlsx 格式),需要引用的jar包 亲测as上可以读取到2010excel内容,内附读取源码
POI处理Excel大文件的问题和解决方法 来自 http://itindex.net/detail/52291-poi-excel-%E6%96%87%E4%BB%B6
本案例中利用Apache Poi读取Excel用法,源码注释详细基本用法!
本资源是从之前的资源综合整理出来的代码,之前的代码不全,需要下载两次,为了...本资源解决的难题是导入大文件excel的时候,会报内存溢出的错误。 欢迎各位下载,解决用户的难题是我的宗旨,好的话给个评价,谢谢!
将excel文件中的内容通过java文件读取出来,包括总行数,列数,单元格内容,合并单元格,行高,列宽,图片等信息。
基于新版本的POI编写的读取Excel文件数据的工具类,可根据绝对路径、File对象、InputSteam对象读取解析Excel文件内容,并返回List<List<String>>格式结果,其中包含对单元格公式的处理。
NULL 博文链接:https://wxb-j2ee.iteye.com/blog/1489526
实现了JAVA 窗口,读取EXCEL文件,用poi读取EXCEL内容只是一个小例子
阐述如何用POI来读取/写入完整的Excel文件。
之前用jxl发现不支持excel2007,不得以就去用poi实现excel的读取了!本人亲测的一个实例,支持excel2007!
POI处理Excel大文件的问题和解决方法,测试excel文件大小4.5M,14万条数据,没有问题。 将excel文件的内容转换成cvs格式文件
Java用poi读取excel文件.pdf
使用poi读取写入复杂excel内容包括样式,工具类
SpringBoot整合poi实现Excel文件的导入和导出,其中单独分装出一个ExcelFormatUtil工具类来实现对单元格数据格式进行判断。
为更方便的使用POI的API来操作Excel(2003)文件,对POI中针对Excel文件的读写进行了简单封装。此类中包含以下功能: 1.根据模板创建Excel文件 2.获取及更新Excel文件内容 3.创建、复制Sheet 4.设置Sheet名称 ... ...
poi 操作excel模板,读取数据后,讲数据填充到新生成的文件中且提供下载
使用Poi读取大数据量excel的方法 支持2003和2007的版本