当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

poi读取excel2003文件内的图片

发表于: 2014-01-09   作者:53873039oycg   来源:转载   浏览:
poi
摘要:      poi读取excel内的图片,网上例子很多,本文是网上找的,所用poi版本为poi3.9,代码本人亲测通过,注意,本文所说的图片是jpeg,png等格式的图片,使用excel绘制的图表不再本文所说的图片范围内。      参考原文如下:      http://b

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

    全文完。

 

 

poi读取excel2003文件内的图片

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
网上示例很多,参考过几个,可能是版本或环境的问题,照着做居然报错,今天抽了一点时间自己写了个
package com.poi.world; import java.io.FileInputStream; import org.apache.poi.hwpf.HWPFDocumen
做了个读取Excel表格的功能,结果有的能读,有的不能读,不知道是不是Excel表格中格式的问题,或者E
package com.poi.world; import java.io.FileInputStream; import org.apache.poi.hwpf.HWPFDocumen
在我上一篇文章(http://blog.csdn.net/peterwanghao/article/details/7102397)中提到了通过POI将
我们在做用POI读物 Excel文件时,往往会忽略了Excel的版本,到底是2003还是2007。于是在读取或写入E
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ar
本文想简单介绍一下NSBundle读取图片到视图上,读取plist文件,读取txt文件显示在lable上; 关于bun
实在很抱歉,时间紧张,我只讲怎样从SD卡内读取bin文件(二进制文件),然后现在TFT-LCD上。 准备工
问题描述:java Swing时要用到很多图片,在eclipse项目里用相对路径好好的,一点问题没有,打成jar
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号