`
53873039oycg
  • 浏览: 843992 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

poi读取excel2003文件内的图片

    博客分类:
  • poi
poi 
阅读更多

     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读取excel文件

    Apache POI提供了丰富的API,可以实现对Excel文件的复杂操作,如合并单元格、设置样式、处理公式等。在Android开发中,这些功能同样适用,但需要注意资源管理,因为Android设备的内存有限。 总的来说,Apache POI是...

    使用POI,实现excel文件导出,图片url导出文件,图片和excel文件导出压缩包

    本文将深入探讨如何使用POI库来实现Excel文件的导出,以及如何将图片URL转换为图片文件并与其他文件一起打包成压缩包。 首先,让我们了解一下Apache POI。POI是Java开发者的开源API,它允许程序创建、修改和显示...

    apache poi 读取Excel文件内容(2003,2007)

    这篇博文主要讲解如何使用Apache POI库来读取Excel文件的内容,无论是2003版的.XLS还是2007版及以后的.XLSX格式。 在Java编程中,Apache POI 提供了丰富的API,使得开发者可以方便地操作Excel文件。首先,我们需要...

    POI向excel中插入图片

    在Excel文件中,图片是以OLE对象的形式存储的。POI提供了HSSFPicture类和XSSFPicture类(分别对应于.HSSF和.XSSF,即Excel 2003和2007以上的版本)来处理这些图片。 **1. 引入依赖** 在Java项目中,你需要在pom.xml...

    使用POI解析excel文件并写入数据库

    使用poi解析excel文件,并将数据写入到数据库 项目说明 这个项目实现的功能是读取excel文件中的数据,解析并写入数据库。 读取的excel文件位于项目目录下的 excel\0805.xlsx 使用IntelliJ IDEA开发此项目 使用MYSQL...

    POI导出Excel文件

    总结起来,Apache POI为Java开发者提供了一种强大且灵活的方式来处理Excel文件,无论是通过Servlet从服务器生成文件,还是在本地通过main方法创建文件。理解如何使用POI库可以帮助你更好地集成Excel功能到你的Java...

    利用POI读取excel写入到word

    2. **读取Excel**:使用XSSFWorkbook(对于.xlsx文件)或HSSFWorkbook(对于.xls文件)类打开Excel文件。然后,通过Sheet对象访问工作表,Row对象访问行,Cell对象访问单元格。例如: ```java File excelFile = ...

    java POI读取excel文件数据

    在这个场景中,我们将详细探讨如何使用Java POI读取Excel文件中的数据,包括获取总行数、列数、单元格内容、合并单元格、行高、列宽以及图片等信息。 首先,确保在项目中已经引入了Apache POI的依赖库。如果你使用...

    Java用poi读取excel文件

    Java 使用 POI 读取 Excel 文件 Java 是一种广泛使用的编程语言,而 Excel 是一种常用的电子表格软件。有时候,我们需要在 Java 程序中读取 Excel 文件的内容,例如将 Excel 表格中的数据导入到数据库中或者进行...

    poi读取excel文件实例(兼容excel2007)

    在“poi读取excel文件实例”中,我们将讨论如何使用Apache POI API来读取和操作Excel 2007文件。以下是一些关键知识点: 1. **创建工作簿对象**:首先,你需要通过`WorkbookFactory`类的`create()`方法打开或创建一...

    poi读取Excel2007文件

    标题中的“poi读取Excel2007文件”指的是使用Apache POI库来读取Microsoft Excel 2007及更高版本(XLSX格式)的文件。Apache POI是Java平台上的一个开源项目,它提供了API来处理Microsoft Office格式的文件,包括...

    POI读取EXCEL教程

    在Java编程环境中,如果你需要读取或写入Excel文件,POI 提供了强大的支持。本教程将深入讲解如何使用POI的HSSF组件来处理Excel 97-2003格式的文件(BIFF8格式)。 一、Excel基础 Excel 97 文件格式,也被称作BIFF8...

    POI读取2007 Excel文件

    标题中的“POI读取2007 Excel文件”指的是使用Apache POI库来解析和操作Microsoft Office Open XML (OOXML)格式的Excel文件,这种格式通常以.xlsx为扩展名。Apache POI是一个流行的Java库,它允许开发人员在Java应用...

    POI读取excel的内容.zip

    本教程将详细讲解如何使用Apache POI库来读取Excel文件的内容。 首先,为了在Java项目中使用Apache POI,我们需要通过Maven进行依赖管理。在`pom.xml`文件中添加以下依赖: ```xml &lt;groupId&gt;org.apache.poi ...

    POI兼容Excel2003和2007

    在本文中,我们将重点讨论如何使用POI库来实现对Excel 2003和2007文件的兼容性操作。Excel 2003使用的是.BIFF(Binary Interchange File Format)格式,而Excel 2007及以上版本则引入了新的.OpenXML(.xlsx)格式,...

    poi读取excel2007和2003兼容工具例子

    在这个"poi读取excel2007和2003兼容工具例子"中,我们将探讨如何使用POI来读取不同版本的Excel文件,特别是Excel 2003(.xls)和Excel 2007及更高版本(.xlsx)。 1. **Apache POI库**:Apache POI是Apache软件基金...

    Java 新版POI 读取excel文件信息返回List<List<String>>对象,包含文件内公式处理

    基于新版本的POI编写的读取Excel文件数据的工具类,可根据绝对路径、File对象、InputSteam对象读取解析Excel文件内容,并返回List&lt;List&lt;String&gt;&gt;格式结果,其中包含对单元格公式的处理。

    POI 读取Excel文件

    - POI 不支持读取 .xls 文件(Excel 97-2003 格式),除非使用 HSSFWorkbook 类,但不推荐,因为 .xlsx 格式更现代且兼容性更好。 - 处理大型文件时,要特别注意内存管理,避免因数据量过大导致 OutOfMemoryError...

    poi解决读取excel大文件内存溢出的代码

    本资源是从之前的资源综合整理出来的代码,之前的代码不全,需要下载两次,为了...本资源解决的难题是导入大文件excel的时候,会报内存溢出的错误。 欢迎各位下载,解决用户的难题是我的宗旨,好的话给个评价,谢谢!

Global site tag (gtag.js) - Google Analytics