Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -138,10 +138,24 @@ private void buildRunsInOrderFromXml(XmlObject object) {
if (o instanceof CTSdtBlock) {
XWPFSDT cc = new XWPFSDT((CTSdtBlock) o, part);
iruns.add(cc);
CTSdtContentBlock content = ((CTSdtBlock)o).getSdtContent();
if (content != null) {
for (CTP ctp : content.getPList()) {
processCTRs(ctp.getRList());
}
}
}
if (o instanceof CTSdtRun) {
XWPFSDT cc = new XWPFSDT((CTSdtRun) o, part);
iruns.add(cc);
XWPFSDT cc = new XWPFSDT((CTSdtRun)o, part);
iruns.add(cc);

CTSdtContentRun sdtContent = ((CTSdtRun)o).getSdtContent();
if (sdtContent != null)
{
processCTRs(sdtContent.getRList());
}

processSdtRuns();
}
if (o instanceof CTRunTrackChange) {
final CTRunTrackChange parentRecord = (CTRunTrackChange) o;
Expand All @@ -164,6 +178,33 @@ private void buildRunsInOrderFromXml(XmlObject object) {
}
}

private void processCTRs(List<CTR> ctrs) {
if (ctrs == null) {
return;
}
for (CTR ctr : ctrs) {
if (ctr.getRPr() != null) {
runs.add(new XWPFRun(ctr, (IRunBody)this));
}
}
}

private void processSdtRuns() {
try (XmlCursor cursor = getCTP().newCursor()) {
cursor.selectPath("child::*");

while (cursor.toNextSelection()) {
XmlObject xmlObject = cursor.getObject();
if (xmlObject instanceof CTSdtRun) {
CTSdtContentRun content = ((CTSdtRun)xmlObject).getSdtContent();
if (content != null) {
processCTRs(content.getRList());
}
}
}
}
}

@Internal
public CTP getCTP() {
return paragraph;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,15 @@ Licensed to the Apache Software Foundation (ASF) under one or more
import org.apache.poi.ooxml.util.POIXMLUnits;
import org.apache.poi.util.Internal;
import org.apache.poi.util.Units;
import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlObject;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBorder;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDecimalNumber;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJcTable;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtContentRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTString;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblBorders;
Expand Down Expand Up @@ -168,24 +172,59 @@ public XWPFTable(CTTbl table, IBody part, boolean initRow) {
createEmptyTable(table);
}

for (CTRow row : table.getTrList()) {
StringBuilder rowText = new StringBuilder();
XWPFTableRow tabRow = new XWPFTableRow(row, this);
tableRows.add(tabRow);
for (CTTc cell : row.getTcList()) {
for (CTP ctp : cell.getPList()) {
XWPFParagraph p = new XWPFParagraph(ctp, part);
if (rowText.length() > 0) {
rowText.append('\t');
try (XmlCursor cursor = table.newCursor()) {
cursor.selectPath("./*");
while (cursor.toNextSelection()) {
XmlObject xmlObject = cursor.getObject();
if (xmlObject instanceof CTRow) {
processCTRow((CTRow)xmlObject);
}
else if (xmlObject instanceof CTSdtRow) {
List<CTRow> rows = new ArrayList<>();
collectCTRowsInnerSdtRow((CTSdtRow)xmlObject, rows);
for (CTRow row : rows)
{
processCTRow(row);
}
rowText.append(p.getText());
}
}
if (rowText.length() > 0) {
this.text.append(rowText);
this.text.append('\n');
}
}

private void processCTRow(CTRow row) {
StringBuilder rowText = new StringBuilder();
XWPFTableRow tableRow = new XWPFTableRow(row, this);
tableRows.add(tableRow);
for (CTTc cell : row.getTcList()) {
for (CTP ctp : cell.getPList()) {
XWPFParagraph p = new XWPFParagraph(ctp, part);
if (rowText.length() > 0) {
rowText.append('\t');
}
rowText.append(p.getText());
}
}
if (rowText.length() > 0) {
this.text.append(rowText);
this.text.append('\n');
}
}

private void collectCTRowsInnerSdtRow(CTSdtRow sdtRow, List<CTRow> rows) {
CTSdtContentRow sdtContent = sdtRow.getSdtContent();
if (sdtContent == null) {
return;
}

List<CTRow> rowsInnerSdtContent = sdtContent.getTrList();
if (!rowsInnerSdtContent.isEmpty()) {
rows.addAll(rowsInnerSdtContent);
return;
}

for (CTSdtRow innerSdt : sdtContent.getSdtList()) {
collectCTRowsInnerSdtRow(innerSdt, rows);
}
}

private void createEmptyTable(CTTbl table) {
Expand Down