package org.apache.poi.hssf.usermodel;
-import org.apache.poi.ddf.EscherBitmapBlip;
import org.apache.poi.ddf.EscherBlipRecord;
+import org.apache.poi.ss.usermodel.PictureData;
/**
* Represents binary data stored in the file. Eg. A GIF, JPEG etc...
*
* @author Daniel Noll
*/
-public class HSSFPictureData
+public class HSSFPictureData implements PictureData
{
// MSOBI constants for various formats.
public static final short MSOBI_WMF = 0x2160;
this.blip = blip;
}
- /**
- * Gets the picture data.
- *
- * @return the picture data.
+ /* (non-Javadoc)
+ * @see org.apache.poi.hssf.usermodel.PictureData#getData()
*/
public byte[] getData()
{
return blip.getPicturedata();
}
- /**
- * Suggests a file extension for this image.
- *
- * @return the file extension.
+ /* (non-Javadoc)
+ * @see org.apache.poi.hssf.usermodel.PictureData#suggestFileExtension()
*/
public String suggestFileExtension()
{
--- /dev/null
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+package org.apache.poi.ss.usermodel;
+
+public interface PictureData {}
\ No newline at end of file
--- /dev/null
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+package org.apache.poi.ss.usermodel;
+
+public interface PictureData {
+
+ /**
+ * Gets the picture data.
+ *
+ * @return the picture data.
+ */
+ byte[] getData();
+
+ /**
+ * Suggests a file extension for this image.
+ *
+ * @return the file extension.
+ */
+ String suggestFileExtension();
+
+}
\ No newline at end of file
return this.corePart;
}
- protected PackagePart getPart(PackageRelationship rel) throws InvalidFormatException {
+ /**
+ * Get the PackagePart that is the target of a relationship.
+ *
+ * @param rel The relationship
+ * @return The target part
+ * @throws InvalidFormatException
+ */
+ protected PackagePart getTargetPart(PackageRelationship rel) throws InvalidFormatException {
PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI());
PackagePart part = getPackage().getPart(relName);
if (part == null) {
--- /dev/null
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+package org.apache.poi.xssf.usermodel;
+
+import org.apache.poi.ss.usermodel.PictureData;
+import org.openxml4j.opc.PackagePart;
+
+
+public class XSSFPictureData implements PictureData {
+
+ private PackagePart packagePart;
+
+ public XSSFPictureData(PackagePart packagePart) {
+ this.packagePart = packagePart;
+ }
+
+ public byte[] getData() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String suggestFileExtension() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
package org.apache.poi.xssf.usermodel;
+import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.apache.poi.ss.usermodel.Footer;
import org.apache.poi.ss.usermodel.Header;
import org.apache.poi.ss.usermodel.Patriarch;
+import org.apache.poi.ss.usermodel.PictureData;
import org.apache.poi.ss.usermodel.PrintSetup;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Name;
import org.apache.poi.ss.usermodel.Palette;
+import org.apache.poi.ss.usermodel.PictureData;
import org.apache.poi.ss.usermodel.SharedStringSource;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
private static final String SHARED_STRINGS_RELATIONSHIP = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings";
+ private static final String DRAWING_RELATIONSHIP = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing";
+
+ private static final String IMAGE_RELATIONSHIP = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image";
+
private CTWorkbook workbook;
private List<XSSFSheet> sheets = new LinkedList<XSSFSheet>();
Iterator<PackageRelationship> it = prc.iterator();
if (it.hasNext()) {
PackageRelationship rel = it.next();
- PackagePart part = getPart(rel);
+ PackagePart part = getTargetPart(rel);
this.sharedStringSource = new SharedStringsTable(part);
}
// Load individual sheets
for (CTSheet ctSheet : this.workbook.getSheets().getSheetArray()) {
- PackageRelationship rel = this.getCorePart().getRelationship(ctSheet.getId());
- if (rel == null) {
- log.log(log.WARN, "No relationship found for sheet " + ctSheet.getId());
+ PackagePart part = getPackagePart(ctSheet);
+ if (part == null) {
continue;
}
- PackagePart part = getPart(rel);
WorksheetDocument worksheetDoc = WorksheetDocument.Factory.parse(part.getInputStream());
XSSFSheet sheet = new XSSFSheet(ctSheet, worksheetDoc.getWorksheet(), this);
this.sheets.add(sheet);
protected CTWorkbook getWorkbook() {
return this.workbook;
}
+
+ /**
+ * Get the PackagePart corresponding to a given sheet.
+ *
+ * @param ctSheet The sheet
+ * @return A PackagePart, or null if no matching part found.
+ * @throws InvalidFormatException
+ */
+ private PackagePart getPackagePart(CTSheet ctSheet) throws InvalidFormatException {
+ PackageRelationship rel = this.getCorePart().getRelationship(ctSheet.getId());
+ if (rel == null) {
+ log.log(POILogger.WARN, "No relationship found for sheet " + ctSheet.getId());
+ return null;
+ }
+ return getTargetPart(rel);
+ }
public int addPicture(byte[] pictureData, int format) {
// TODO Auto-generated method stub
return null;
}
- public List getAllPictures() {
- // TODO Auto-generated method stub
- return null;
+ public List<PictureData> getAllPictures() {
+ // In OOXML pictures are referred to in sheets
+ List<PictureData> pictures = new LinkedList<PictureData>();
+ for (CTSheet ctSheet : this.workbook.getSheets().getSheetArray()) {
+ try {
+ PackagePart sheetPart = getPackagePart(ctSheet);
+ if (sheetPart == null) {
+ continue;
+ }
+ PackageRelationshipCollection prc = sheetPart.getRelationshipsByType(DRAWING_RELATIONSHIP);
+ for (PackageRelationship rel : prc) {
+ PackagePart drawingPart = getTargetPart(rel);
+ PackageRelationshipCollection prc2 = drawingPart.getRelationshipsByType(IMAGE_RELATIONSHIP);
+ for (PackageRelationship rel2 : prc2) {
+ PackagePart imagePart = getTargetPart(rel2);
+ XSSFPictureData pd = new XSSFPictureData(imagePart);
+ pictures.add(pd);
+ }
+ }
+ } catch (InvalidFormatException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+ return pictures;
}
public boolean getBackupFlag() {
package org.apache.poi.xssf.io;
import java.io.File;
+import java.util.List;
import junit.framework.TestCase;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.PictureData;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
CellStyle style = cell.getCellStyle();
// assertNotNull(style);
}
+
+ public void testLoadPictures() throws Exception {
+ XSSFWorkbook workbook = new XSSFWorkbook(new File(filename, "picture.xlsx").getAbsolutePath());
+ List<PictureData> pictures = workbook.getAllPictures();
+ assertEquals(1, pictures.size());
+ }
}