POI-60342: handle missing sdtcontentcell in an sdtcell
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1768054 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
d769a03fda
commit
abe0740d3a
@ -1,23 +1,23 @@
|
|||||||
/* ====================================================================
|
/* ====================================================================
|
||||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
contributor license agreements. See the NOTICE file distributed with
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
this work for additional information regarding copyright ownership.
|
this work for additional information regarding copyright ownership.
|
||||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
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 not use this file except in compliance with
|
||||||
the License. You may obtain a copy of the License at
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
See the License for the specific language governing permissions and
|
See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
==================================================================== */
|
==================================================================== */
|
||||||
package org.apache.poi.xwpf.usermodel;
|
package org.apache.poi.xwpf.usermodel;
|
||||||
|
|
||||||
|
|
||||||
import javax.xml.namespace.QName;
|
import javax.xml.namespace.QName;
|
||||||
|
|
||||||
import org.apache.xmlbeans.XmlCursor;
|
import org.apache.xmlbeans.XmlCursor;
|
||||||
import org.apache.xmlbeans.XmlCursor.TokenType;
|
import org.apache.xmlbeans.XmlCursor.TokenType;
|
||||||
@ -32,12 +32,12 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtContentCell;
|
|||||||
*/
|
*/
|
||||||
public class XWPFSDTContentCell implements ISDTContent {
|
public class XWPFSDTContentCell implements ISDTContent {
|
||||||
|
|
||||||
//A full implementation would grab the icells
|
//A full implementation would grab the icells
|
||||||
//that a content cell can contain. This would require
|
//that a content cell can contain. This would require
|
||||||
//significant changes, including changing the notion that the
|
//significant changes, including changing the notion that the
|
||||||
//parent of a cell can be not just a row, but an sdt.
|
//parent of a cell can be not just a row, but an sdt.
|
||||||
//For now we are just grabbing the text out of the text tokentypes.
|
//For now we are just grabbing the text out of the text tokentypes.
|
||||||
|
|
||||||
//private List<ICell> cells = new ArrayList<ICell>().
|
//private List<ICell> cells = new ArrayList<ICell>().
|
||||||
|
|
||||||
private String text = "";
|
private String text = "";
|
||||||
@ -45,9 +45,13 @@ public class XWPFSDTContentCell implements ISDTContent {
|
|||||||
public XWPFSDTContentCell(CTSdtContentCell sdtContentCell,
|
public XWPFSDTContentCell(CTSdtContentCell sdtContentCell,
|
||||||
XWPFTableRow xwpfTableRow, IBody part) {
|
XWPFTableRow xwpfTableRow, IBody part) {
|
||||||
super();
|
super();
|
||||||
|
//sdtContentCell is allowed to be null: minOccurs="0" maxOccurs="1"
|
||||||
|
if (sdtContentCell == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
XmlCursor cursor = sdtContentCell.newCursor();
|
XmlCursor cursor = sdtContentCell.newCursor();
|
||||||
|
|
||||||
//keep track of the following,
|
//keep track of the following,
|
||||||
//and add "\n" only before the start of a body
|
//and add "\n" only before the start of a body
|
||||||
//element if it is not the first body element.
|
//element if it is not the first body element.
|
||||||
@ -55,8 +59,8 @@ public class XWPFSDTContentCell implements ISDTContent {
|
|||||||
//index of cell in row
|
//index of cell in row
|
||||||
int tcCnt = 0;
|
int tcCnt = 0;
|
||||||
//count of body objects
|
//count of body objects
|
||||||
int iBodyCnt = 0;
|
int iBodyCnt = 0;
|
||||||
int depth = 1;
|
int depth = 1;
|
||||||
|
|
||||||
while (cursor.hasNextToken() && depth > 0) {
|
while (cursor.hasNextToken() && depth > 0) {
|
||||||
TokenType t = cursor.toNextToken();
|
TokenType t = cursor.toNextToken();
|
||||||
@ -64,17 +68,17 @@ public class XWPFSDTContentCell implements ISDTContent {
|
|||||||
sb.append(cursor.getTextValue());
|
sb.append(cursor.getTextValue());
|
||||||
} else if (isStartToken(cursor, "tr")) {
|
} else if (isStartToken(cursor, "tr")) {
|
||||||
tcCnt = 0;
|
tcCnt = 0;
|
||||||
iBodyCnt = 0;
|
iBodyCnt = 0;
|
||||||
} else if (isStartToken(cursor, "tc")) {
|
} else if (isStartToken(cursor, "tc")) {
|
||||||
if (tcCnt++ > 0) {
|
if (tcCnt++ > 0) {
|
||||||
sb.append("\t");
|
sb.append("\t");
|
||||||
}
|
}
|
||||||
iBodyCnt = 0;
|
iBodyCnt = 0;
|
||||||
} else if (isStartToken(cursor, "p") ||
|
} else if (isStartToken(cursor, "p") ||
|
||||||
isStartToken(cursor, "tbl") ||
|
isStartToken(cursor, "tbl") ||
|
||||||
isStartToken(cursor, "sdt")) {
|
isStartToken(cursor, "sdt")) {
|
||||||
if (iBodyCnt > 0) {
|
if (iBodyCnt > 0) {
|
||||||
sb.append("\n");
|
sb.append("\n");
|
||||||
}
|
}
|
||||||
iBodyCnt++;
|
iBodyCnt++;
|
||||||
}
|
}
|
||||||
@ -84,7 +88,7 @@ public class XWPFSDTContentCell implements ISDTContent {
|
|||||||
depth--;
|
depth--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
text = sb.toString();
|
text = sb.toString();
|
||||||
cursor.dispose();
|
cursor.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,11 +98,11 @@ public class XWPFSDTContentCell implements ISDTContent {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
QName qName = cursor.getName();
|
QName qName = cursor.getName();
|
||||||
if (qName != null && qName.getLocalPart() != null &&
|
if (qName != null && qName.getLocalPart() != null &&
|
||||||
qName.getLocalPart().equals(string)) {
|
qName.getLocalPart().equals(string)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user