我目前正在处理Excel文件(* .xlsm)和Apache POI,我一直在讨论任务。 我收到一些嵌入了PDF的excel文件,我想提取它们并根据它们所在的行和列重命名它们。 这看起来很奇怪,因为我知道嵌入的对象被表示为图像,它们可以占据多个单元格,从技术上讲它们不是" In"细胞。
以下代码片段让我可以提取嵌入的PDF,但它们被命名为OleObject [1..2..3.etc ..],但它并没有给我任何线索。
inStream = new FileInputStream(file);
XSSFWorkbook workbook = new XSSFWorkbook(inStream);
for (PackagePart pPart : workbook.getAllEmbedds()) {
String contentType = pPart.getContentType();
if (contentType.equals("application/vnd.openxmlformats-officedocument.oleObject")){
POIFSFileSystem fs = new POIFSFileSystem(pPart.getInputStream());
TikaInputStream stream = TikaInputStream.get(fs.createDocumentInputStream("CONTENTS"));
byte[] bytes = IOUtil.toByteArray(stream);
stream.close();
OutputStream outStream = new FileOutputStream(new File(ROOT_DIRECTORY.getAbsolutePath()+"\\PDF"+i+".pdf"));
IOUtil.copy(bytes, outStream);
outStream.close();
}}
我想知道org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet是否会让我看到excell表的xml代码,也许我可以获得我需要的信息。像这样。
<oleObjects><mc:AlternateContent xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"><mc:Choice Requires="x14"><oleObject progId="Acrobat Document" dvAspect="DVASPECT_ICON" shapeId="1028" r:id="rId4"><objectPr defaultSize="0" r:id="rId5"><anchor moveWithCells="1"><from><xdr:col>8</xdr:col><xdr:colOff>0</xdr:colOff><xdr:row>11</xdr:row><xdr:rowOff>0</xdr:rowOff></from><to><xdr:col>8</xdr:col><xdr:colOff>1143000</xdr:colOff><xdr:row>13</xdr:row><xdr:rowOff>171450</xdr:rowOff></to></anchor></objectPr></oleObject></mc:Choice><mc:Fallback><oleObject progId="Acrobat Document" dvAspect="DVASPECT_ICON" shapeId="1028" r:id="rId4"/></mc:Fallback></mc:AlternateContent></oleObjects>
-
<objectPr defaultSize="0" r:id="rId5"><anchor moveWithCells="1"><from><xdr:col>8</xdr:col><xdr:colOff>0</xdr:colOff><xdr:row>11</xdr:row><xdr:rowOff>0</xdr:rowOff></from><to><xdr:col>8</xdr:col><xdr:colOff>1143000</xdr:colOff><xdr:row>13</xdr:row><xdr:rowOff>171450</xdr:rowOff></to></anchor></objectPr>
我想使用锚信息是可能的,但我只是无法找到如何获得它。
希望这些信息可以清楚地说明我想要做什么。
提前致谢。
答案 0 :(得分:0)
我已经查看了您可以在此处找到的当前poi-ooxml-schemas来源jar的源代码:http://repo1.maven.org/maven2/org/apache/poi/ooxml-schemas/1.3/
org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet扩展了org.apache.xmlbeans.XmlObject,它可以使用继承的.toString()方法将XML作为字符串提供。或者,您可以通过在CTWorksheet对象上调用getOleObjects()来快速访问工作表中的OLE对象列表。
/**
* Gets the "oleObjects" element
*/
org.openxmlformats.schemas.spreadsheetml.x2006.main.CTOleObjects getOleObjects();
CTOleObjects本身扩展了org.apache.xmlbeans.XmlObject,你可以再次使用toString()获取XML进行解析,或者获取org.openxmlformats.schemas.spreadsheetml.x2006.main.CTOleObject OLE对象的列表以便迭代使用CTOleObjects.getOleObjectList()。
/**
* Gets a List of "oleObject" elements
*/
java.util.List<org.openxmlformats.schemas.spreadsheetml.x2006.main.CTOleObject> getOleObjectList();
CTOleObject似乎没有getter方法来获取和子XML元素以允许您确定列,所以我认为你需要做一些XML解析,或者字符串搜索来获取这些信息,如果它包含在字符串XML表示中。
希望这有帮助。