问题描述
求好人幫忙,如何同時從EXCEL內讀取圖片和內嵌EXCEL呢,兩個單獨都可實現!代碼如下:importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjavassist.bytecode.Descriptor.Iterator;importorg.apache.poi.hslf.usermodel.SlideShow;importorg.apache.poi.hssf.usermodel.HSSFClientAnchor;importorg.apache.poi.hssf.usermodel.HSSFObjectData;importorg.apache.poi.hssf.usermodel.HSSFPicture;importorg.apache.poi.hssf.usermodel.HSSFPictureData;importorg.apache.poi.hssf.usermodel.HSSFShape;importorg.apache.poi.hssf.usermodel.HSSFSheet;importorg.apache.poi.hssf.usermodel.HSSFWorkbook;importorg.apache.poi.hwpf.HWPFDocument;importorg.apache.poi.poifs.filesystem.DirectoryNode;importorg.apache.poi.poifs.filesystem.POIFSFileSystem;publicclassD{publicstaticvoidmain(String[]args)throwsException{POIFSFileSystemfs=newPOIFSFileSystem(newFileInputStream("E:/images/excel_with_embeded_old.xls"));HSSFWorkbookworkbook=newHSSFWorkbook(fs);inti=0;for(HSSFObjectDataobj:workbook.getAllEmbeddedObjects()){//theOLE2ClassNameoftheobjectStringoleName=obj.getOLE2ClassName();if(oleName.equals("工作表")){DirectoryNodedn=(DirectoryNode)obj.getDirectory();HSSFWorkbookembeddedWorkbook=newHSSFWorkbook(dn,fs,false);FileOutputStreamfileOut=newFileOutputStream("E:/images/embd"+i+".xls");i++;embeddedWorkbook.write(fileOut);fileOut.close();}}try{List<HSSFPictureData>pictures=workbook.getAllPictures();//假設讀取的Excel工作薄中的第一張表HSSFSheetsheet=workbook.getSheetAt(0);Map<Integer,HSSFPictureData>map=newHashMap<Integer,HSSFPictureData>();for(HSSFShapeshape:sheet.getDrawingPatriarch().getChildren()){HSSFClientAnchoranchor=(HSSFClientAnchor)shape.getAnchor();introwIndex=anchor.getRow1();if(shapeinstanceofHSSFPicture){introwmark=rowIndex;HSSFPicturepicture=(HSSFPicture)shape;intpictureIndex=picture.getPictureIndex()-1;HSSFPictureDatapictureData=pictures.get(pictureIndex);map.put(rowmark,pictureData);}}System.out.println(map.size());HSSFPictureDatapictureData=map.get(2);//獲取包含圖片格式的文件字符串Stringext=pictureData.suggestFileExtension();System.out.println(ext);//代表圖片信息的字節數據byte[]data=pictureData.getData();//根據圖片格式將圖片寫出到磁盤if(ext.equals("jpeg")){FileOutputStreamout=newFileOutputStream("E:/images/a.jpg");out.write(data);out.close();}if(ext.equals("png")){FileOutputStreamout=newFileOutputStream("E:/images/a.png");out.write(data);out.close();}}catch(Exceptione){e.printStackTrace();}}}
解决方案
解决方案二:
不能对同一个Excel文件既做读的操作,又做写的操作。楼主只能生成一份临时Excel,先把图片取出来写入到临时Excel中。然后再从临时Excel中取图片写入到原来的Excel
解决方案三:
十分感谢dring321的回复。可能我对问题的描述不精准。我仅仅是从文档读出内容并保存,其内容包括图片和内嵌的对象EXCEL。读图片时需要通过POI函数workbook.getAllPictures()来获取,如果EXCEL内只有图片用这个函数是没问题。但只有内嵌EXCEL对象这个函数就不好使了,它会将内嵌对象也当作图片,而且各个图片位置也会搞错!如果文档内没有图片,用函数workbook.getAllEmbeddedObjects()获取内嵌对象也没问题。还有一个疑问如下:oleName=obj.getOLE2ClassName();oleName有时等于“工作表”,有时等于“worksheet”不知和那个设置有关系?还请指教
解决方案四:
抱歉,因为本人没有使用过poi,所有无法给出正确答案。建议:如果遇到楼主的这种问题,我一般会去查找poi的api。(有则有,无则五,毕竟是第三方的包,未必能满足所有的要求)
解决方案五:
看過POI的API,其中導入內嵌對象部分寫的很簡單,但我已實現了。就是不能同時導入圖片和內嵌對象,坐等高手賜教!
解决方案六:
坐等高手賜教!!