Bug 577489: Improve xlsx performance in layoutCells() method
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=577489
Signed-off-by: Denis Nikiforov <denis.nikif@gmail.com>
Change-Id: I0c86f38045185ed012f45c562db992d453b64fed
diff --git a/plugins/org.eclipse.gendoc.document.parser.xlsx/src/org/eclipse/gendoc/document/parser/xlsx/XLSXParser.java b/plugins/org.eclipse.gendoc.document.parser.xlsx/src/org/eclipse/gendoc/document/parser/xlsx/XLSXParser.java
index ba79f9e..100580f 100644
--- a/plugins/org.eclipse.gendoc.document.parser.xlsx/src/org/eclipse/gendoc/document/parser/xlsx/XLSXParser.java
+++ b/plugins/org.eclipse.gendoc.document.parser.xlsx/src/org/eclipse/gendoc/document/parser/xlsx/XLSXParser.java
@@ -358,9 +358,12 @@
int maxCol = 0;
int curRow = 0;
- NodeList rows = getDocument().getElementsByTagName("row");
- for (int i=0; i<rows.getLength(); i++) {
- Element row = (Element)rows.item(i);
+ Node sheetData = getDocument().getElementsByTagName("sheetData").item(0);
+ for (Node node = sheetData.getFirstChild(); node != null; node = node.getNextSibling()) {
+ if (!(node instanceof Element)) {
+ continue;
+ }
+ Element row = (Element) node;
int rowIndex = Integer.valueOf(row.getAttribute("r"))-1;
int rowDiff = getPreviousRowGap(rowIndex);
curRow += rowDiff;
diff --git a/plugins/org.eclipse.gendoc.document.parser.xlsx/src/org/eclipse/gendoc/document/parser/xlsx/cellmarkers/AbstractCellMarker.java b/plugins/org.eclipse.gendoc.document.parser.xlsx/src/org/eclipse/gendoc/document/parser/xlsx/cellmarkers/AbstractCellMarker.java
index d208329..aa1843f 100644
--- a/plugins/org.eclipse.gendoc.document.parser.xlsx/src/org/eclipse/gendoc/document/parser/xlsx/cellmarkers/AbstractCellMarker.java
+++ b/plugins/org.eclipse.gendoc.document.parser.xlsx/src/org/eclipse/gendoc/document/parser/xlsx/cellmarkers/AbstractCellMarker.java
@@ -57,11 +57,8 @@
public List<CellMark> getAppliedMarks(XLSXParser xlsxParser) {
Set<CellMark> res = new HashSet<CellMark>();
try {
- NodeList refs = XPathXlsxUtils.evaluateNodes(xlsxParser.getDocument(),"//:row/:c/gendoc:mark[@id='"+this.mark+"']");
- for (int i=0; i<refs.getLength(); i++) {
- Element markEl = (Element)refs.item(i);
- CellMark m = getCellMark(markEl);
- res.add(m);
+ for (Element cell : getMarkedCells(xlsxParser)) {
+ res.add(getCellMark(cell));
}
} catch (Exception e) {
throw new IllegalArgumentException(e.getMessage(),e);
@@ -128,21 +125,32 @@
@Override
public void cleanup(XLSXParser parser) {
- try {
- unmarkCells(parser);
- } catch (XPathExpressionException e) {
- throw new RuntimeException(e);
- }
+ unmarkCells(parser);
}
- protected void unmarkCells(XLSXParser xlsxParser) throws XPathExpressionException {
- NodeList nl = XPathXlsxUtils.evaluateNodes(xlsxParser.getDocument(),"//:row/:c/gendoc:mark[@id='"+mark+"']");
- for (int i=0; i<nl.getLength(); i++) {
- Node n = nl.item(i);
- n.getParentNode().removeChild(n);
+ protected void unmarkCells(XLSXParser xlsxParser) {
+ for (Element cell : getMarkedCells(xlsxParser)) {
+ cell.getParentNode().removeChild(cell);
}
}
+ private List<Element> getMarkedCells(XLSXParser xlsxParser) {
+ List<Element> res = new ArrayList<Element>();
+ Node sheetData = xlsxParser.getDocument().getElementsByTagName("sheetData").item(0);
+ for (Node row = sheetData.getFirstChild(); row != null; row = row.getNextSibling()) {
+ for (Node cell = row.getFirstChild(); cell != null; cell = cell.getNextSibling()) {
+ for (Node node = cell.getFirstChild(); node != null; node = node.getNextSibling()) {
+ if ("gendoc:mark".equals(node.getNodeName())) {
+ if (mark.equals(((Element) node).getAttribute("id"))) {
+ res.add((Element) node);
+ }
+ }
+ }
+ }
+ }
+ return res;
+ }
+
public Element getTargetElement(XLSXParser xlsxParser, CellMark mark) throws IOException, XPathExpressionException {
String part = mark.xlPart;
String path = mark.path;