diff --git a/poi-ooxml/build.gradle b/poi-ooxml/build.gradle index 8a9309799b..c2ef234d37 100644 --- a/poi-ooxml/build.gradle +++ b/poi-ooxml/build.gradle @@ -58,6 +58,12 @@ dependencies { api project(':poi-ooxml-full') api project(path: ':poi-ooxml-full', configuration: 'archives') + // Can be very useful in local testing to comment out the 2 poi-ooxml-full lines above + // and uncomment the line below to use a pre-built version of poi-ooxml-full. + // Try to use the last release version of poi-ooxml-full. You might be unlucky if + // recent unreleased changes in poi-ooxml-full are needed. + // api "org.apache.poi:poi-ooxml-full:5.4.1" + api "org.apache.xmlbeans:xmlbeans:${xmlbeansVersion}" api "org.apache.commons:commons-compress:${commonsCompressVersion}" api "commons-io:commons-io:${commonsIoVersion}" diff --git a/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java b/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java index bfbb775296..4bfb948589 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/chart/XDDFChart.java @@ -688,7 +688,7 @@ public abstract class XDDFChart extends POIXMLDocumentPart implements TextContai if (axes.isEmpty() && hasAxes()) { parseAxes(); } - return axes; + return Collections.unmodifiableList(axes); } private boolean hasAxes() { diff --git a/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFTextParagraph.java b/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFTextParagraph.java index 2fad9ddbbe..9f8b581c80 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFTextParagraph.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xddf/usermodel/text/XDDFTextParagraph.java @@ -113,7 +113,7 @@ public class XDDFTextParagraph implements Iterable { } public List getTextRuns() { - return _runs; + return Collections.unmodifiableList(_runs); } @Override diff --git a/poi-ooxml/src/main/java/org/apache/poi/xdgf/usermodel/XDGFShape.java b/poi-ooxml/src/main/java/org/apache/poi/xdgf/usermodel/XDGFShape.java index 25b3af8f93..02f05ad1c5 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xdgf/usermodel/XDGFShape.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xdgf/usermodel/XDGFShape.java @@ -27,6 +27,7 @@ import java.awt.geom.Path2D; import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Map.Entry; @@ -307,7 +308,7 @@ public class XDGFShape extends XDGFSheet { */ // -> May be null public List getShapes() { - return _shapes; + return _shapes == null ? null : Collections.unmodifiableList(_shapes); } // unique to this shape on the page? diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/BaseXSSFEvaluationWorkbook.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/BaseXSSFEvaluationWorkbook.java index 206ed84e49..c4a4673571 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/BaseXSSFEvaluationWorkbook.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/BaseXSSFEvaluationWorkbook.java @@ -109,7 +109,7 @@ public abstract class BaseXSSFEvaluationWorkbook implements FormulaRenderingWork } catch (NumberFormatException e) {} // Look up an External Link Table for this name - List tables = _uBook.getExternalLinksTable(); + List tables = _uBook.getExternalLinksTables(); int index = findExternalLinkIndex(bookName, tables); if (index != -1) return index; @@ -126,7 +126,7 @@ public abstract class BaseXSSFEvaluationWorkbook implements FormulaRenderingWork // So, add the missing reference and return // Note - this is really rather nasty... ExternalLinksTable fakeLinkTable = new FakeExternalLinksTable(relBookName); - tables.add(fakeLinkTable); + _uBook.addExternalLinksTable(fakeLinkTable); return tables.size(); // 1 based results, 0 = current workbook } @@ -193,7 +193,7 @@ public abstract class BaseXSSFEvaluationWorkbook implements FormulaRenderingWork if (externalWorkbookNumber > 0) { // External reference - reference is 1 based, link table is 0 based int linkNumber = externalWorkbookNumber - 1; - ExternalLinksTable linkTable = _uBook.getExternalLinksTable().get(linkNumber); + ExternalLinksTable linkTable = _uBook.getExternalLinksTable(linkNumber); for (org.apache.poi.ss.usermodel.Name name : linkTable.getDefinedNames()) { if (name.getNameName().equals(nameName)) { @@ -300,7 +300,7 @@ public abstract class BaseXSSFEvaluationWorkbook implements FormulaRenderingWork if (externalWorkbookNumber > 0) { // External reference - reference is 1 based, link table is 0 based int linkNumber = externalWorkbookNumber - 1; - ExternalLinksTable linkTable = _uBook.getExternalLinksTable().get(linkNumber); + ExternalLinksTable linkTable = _uBook.getExternalLinksTable(linkNumber); workbookName = linkTable.getLinkedFileName(); } else { // Internal reference diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/BaseXSSFFormulaEvaluator.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/BaseXSSFFormulaEvaluator.java index 3145e3f43c..b5674ada8e 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/BaseXSSFFormulaEvaluator.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/BaseXSSFFormulaEvaluator.java @@ -128,7 +128,7 @@ public abstract class BaseXSSFFormulaEvaluator extends BaseFormulaEvaluator { XSSFWorkbook xssfWorkbook = xssfCell.getSheet().getWorkbook(); XSSFWorkbook externalWorkbook = (XSSFWorkbook) xssfWorkbook.getCreationHelper() .getReferencedWorkbooks().get(externalSheet.getWorkbookName()); - ExternalLinksTable externalLinksTable = xssfWorkbook.getExternalLinksTable().get(area3DPxg.getExternalWorkbookNumber() - 1); + ExternalLinksTable externalLinksTable = xssfWorkbook.getExternalLinksTable(area3DPxg.getExternalWorkbookNumber() - 1); if (externalWorkbook != null && externalLinksTable != null) { int firstSheet = externalWorkbook.getSheetIndex(area3DPxg.getSheetName()); diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java index 5c67853c10..59cf488993 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java @@ -172,7 +172,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet, OoxmlSheetEx tables.put( rp.getRelationship().getId(), (XSSFTable)p ); } if(p instanceof XSSFPivotTable) { - getWorkbook().getPivotTables().add((XSSFPivotTable) p); + getWorkbook().addPivotTable((XSSFPivotTable) p); } } @@ -4705,13 +4705,12 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet, OoxmlSheetEx @Beta private XSSFPivotTable createPivotTable() { XSSFWorkbook wb = getWorkbook(); - List pivotTables = wb.getPivotTables(); int tableId = getWorkbook().getPivotTables().size()+1; //Create relationship between pivotTable and the worksheet XSSFPivotTable pivotTable = (XSSFPivotTable) createRelationship(XSSFRelation.PIVOT_TABLE, getWorkbook().getXssfFactory(), tableId); pivotTable.setParentSheet(this); - pivotTables.add(pivotTable); + wb.addPivotTable(pivotTable); XSSFWorkbook workbook = getWorkbook(); //Create relationship between the pivot cache definition and the workbook @@ -4735,8 +4734,6 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet, OoxmlSheetEx //Set relationships id for pivotCacheDefinition to pivotCacheRecords pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().setId(pivotCacheDefinition.getRelationId(pivotCacheRecords)); - wb.setPivotTables(pivotTables); - return pivotTable; } diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFTextParagraph.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFTextParagraph.java index db696efbf2..98204e3fee 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFTextParagraph.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFTextParagraph.java @@ -19,6 +19,7 @@ package org.apache.poi.xssf.usermodel; import java.awt.Color; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -84,7 +85,7 @@ public class XSSFTextParagraph implements Iterable{ } public List getTextRuns(){ - return _runs; + return Collections.unmodifiableList(_runs); } public Iterator iterator(){ diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java index 0c8ddce4a0..f25f276972 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java @@ -205,7 +205,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Date1904Su /** * List of all pivot tables in workbook */ - private List pivotTables; + private final List pivotTables = new ArrayList<>(); private List pivotCaches; private final XSSFFactory xssfFactory; @@ -386,7 +386,6 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Date1904Su } // Create arrays for parts attached to the workbook itself - pivotTables = new ArrayList<>(); pivotCaches = new ArrayList<>(); } @@ -524,7 +523,6 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Date1904Su namedRanges = new ArrayList<>(); namedRangesByName = new ArrayListValuedHashMap<>(); sheets = new ArrayList<>(); - pivotTables = new ArrayList<>(); externalLinks = new ArrayList<>(); } @@ -1042,14 +1040,14 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Date1904Su */ @Override public List getAllPictures() { - if(pictures == null){ + if (pictures == null) { List mediaParts = getPackage().getPartsByName(GET_ALL_PICTURES_PATTERN); pictures = new ArrayList<>(mediaParts.size()); for(PackagePart part : mediaParts){ pictures.add(new XSSFPictureData(part)); } } - return pictures; //YK: should return Collections.unmodifiableList(pictures); + return Collections.unmodifiableList(pictures); } /** @@ -2079,10 +2077,45 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Date1904Su * @return the {@code ExternalLinksTable} list, which may be empty */ @Internal - public List getExternalLinksTable() { + public List getExternalLinksTables() { + // needs to be the live copy because unfortunately we don't have APIs to + // add and remove external links (this method is annotated @Internal) return externalLinks; } + @Deprecated // use getExternalLinksTables() instead + @Removal(version = "7.0.0") + @Internal + public List getExternalLinksTable() { + // needs to be the live copy because unfortunately we don't have APIs to + // add and remove external links (this method is annotated @Internal) + return externalLinks; + } + + /** + * Adds an External Links Table to the workbook. + * + * @param externalLinksTable the External Links Table to add + * @since POI 5.4.2 + */ + @Internal + public void addExternalLinksTable(ExternalLinksTable externalLinksTable) { + if (externalLinks == null) { + externalLinks = new ArrayList<>(); + } + externalLinks.add(externalLinksTable); + } + + /** + * @param index the index at which to add the External Links Table + * @return externalLinksTable the External Links Table to add + * @since POI 5.4.2 + */ + @Internal + public ExternalLinksTable getExternalLinksTable(int index) { + return externalLinks == null ? null : externalLinks.get(index); + } + /** * * @return a collection of custom XML mappings defined in this workbook @@ -2125,7 +2158,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Date1904Su POIXMLDocumentPart.RelationPart rp = this.createRelationship(XSSFRelation.EXTERNAL_LINKS, xssfFactory, externalLinkIdx, false); ExternalLinksTable linksTable = rp.getDocumentPart(); linksTable.setLinkedFileName(name); - this.getExternalLinksTable().add(linksTable); + this.addExternalLinksTable(linksTable); CTExternalReference ctExternalReference = this.getCTWorkbook().addNewExternalReferences().addNewExternalReference(); ctExternalReference.setId(rp.getRelationship().getId()); @@ -2385,7 +2418,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Date1904Su } CTPivotCache cache = caches.addNewPivotCache(); - int tableId = getPivotTables().size()+1; + final int tableId = pivotTables.size() + 1; cache.setCacheId(tableId); cache.setId(rId); if(pivotCaches == null) { @@ -2397,12 +2430,14 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Date1904Su @Beta public List getPivotTables() { + // needs to be the live copy because unfortunately we don't have APIs to + // add and remove external links (this method is annotated @Beta) return pivotTables; } - @Beta - protected void setPivotTables(List pivotTables) { - this.pivotTables = pivotTables; + @Internal + public void addPivotTable(XSSFPivotTable pivotTable) { + pivotTables.add(pivotTable); } public XSSFWorkbookType getWorkbookType() { diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFAbstractFootnoteEndnote.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFAbstractFootnoteEndnote.java index d924dcfef7..443aa598b9 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFAbstractFootnoteEndnote.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFAbstractFootnoteEndnote.java @@ -18,6 +18,7 @@ package org.apache.poi.xwpf.usermodel; import java.math.BigInteger; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Spliterator; @@ -101,7 +102,7 @@ public abstract class XWPFAbstractFootnoteEndnote implements Iterable getParagraphs() { - return paragraphs; + return Collections.unmodifiableList(paragraphs); } /** @@ -130,7 +131,7 @@ public abstract class XWPFAbstractFootnoteEndnote implements Iterable getTables() { - return tables; + return Collections.unmodifiableList(tables); } /** @@ -138,7 +139,7 @@ public abstract class XWPFAbstractFootnoteEndnote implements Iterable getPictures() { - return pictures; + return Collections.unmodifiableList(pictures); } /** @@ -147,7 +148,7 @@ public abstract class XWPFAbstractFootnoteEndnote implements Iterable getBodyElements() { - return bodyElements; + return Collections.unmodifiableList(bodyElements); } /** diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFComments.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFComments.java index 1aff90af29..cb301c226e 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFComments.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFComments.java @@ -233,7 +233,7 @@ public class XWPFComments extends POIXMLDocumentPart { * Get the list of {@link XWPFComment} in the Comments part. */ public List getComments() { - return comments; + return Collections.unmodifiableList(comments); } /** diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFHeaderFooter.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFHeaderFooter.java index 225a8f496e..6beb0eadf7 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFHeaderFooter.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFHeaderFooter.java @@ -210,7 +210,7 @@ public abstract class XWPFHeaderFooter extends POIXMLDocumentPart implements IBo * @return a list of {@link XWPFParagraph} */ public List getListParagraph() { - return paragraphs; + return Collections.unmodifiableList(paragraphs); } public List getAllPictures() { diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFTableRow.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFTableRow.java index f27df6dc24..4b43c0817c 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFTableRow.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFTableRow.java @@ -18,6 +18,7 @@ package org.apache.poi.xwpf.usermodel; import java.math.BigInteger; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.apache.poi.ooxml.util.POIXMLUnits; @@ -211,7 +212,7 @@ public class XWPFTableRow { this.tableCells = cells; } - return tableCells; + return Collections.unmodifiableList(tableCells); } /** diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/model/TestExternalLinksTable.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/model/TestExternalLinksTable.java index 045a03601b..9677cb0a7f 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xssf/model/TestExternalLinksTable.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/model/TestExternalLinksTable.java @@ -32,18 +32,18 @@ public final class TestExternalLinksTable { @Test void none() throws IOException { try (XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("SampleSS.xlsx")) { - assertNotNull(wb.getExternalLinksTable()); - assertEquals(0, wb.getExternalLinksTable().size()); + assertNotNull(wb.getExternalLinksTables()); + assertEquals(0, wb.getExternalLinksTables().size()); } } @Test void basicRead() throws IOException { try (XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("ref-56737.xlsx")) { - assertNotNull(wb.getExternalLinksTable()); - assertEquals(1, wb.getExternalLinksTable().size()); + assertNotNull(wb.getExternalLinksTables()); + assertEquals(1, wb.getExternalLinksTables().size()); - ExternalLinksTable links = wb.getExternalLinksTable().get(0); + ExternalLinksTable links = wb.getExternalLinksTable(0); assertEquals(3, links.getSheetNames().size()); assertEquals(2, links.getDefinedNames().size()); @@ -70,13 +70,13 @@ public final class TestExternalLinksTable { @Test void basicReadWriteRead() throws IOException { try (XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("ref-56737.xlsx")) { - Name name = wb.getExternalLinksTable().get(0).getDefinedNames().get(1); + Name name = wb.getExternalLinksTable(0).getDefinedNames().get(1); name.setNameName("Testing"); name.setRefersToFormula("$A$1"); XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb); - assertEquals(1, wbBack.getExternalLinksTable().size()); - ExternalLinksTable links = wbBack.getExternalLinksTable().get(0); + assertEquals(1, wbBack.getExternalLinksTables().size()); + ExternalLinksTable links = wbBack.getExternalLinksTable(0); name = links.getDefinedNames().get(0); assertEquals("NR_Global_B2", name.getNameName()); @@ -95,11 +95,11 @@ public final class TestExternalLinksTable { @Test void readWithReferencesToTwoExternalBooks() throws IOException { try (XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("ref2-56737.xlsx")) { - assertNotNull(wb.getExternalLinksTable()); - assertEquals(2, wb.getExternalLinksTable().size()); + assertNotNull(wb.getExternalLinksTables()); + assertEquals(2, wb.getExternalLinksTables().size()); // Check the first one, links to 56737.xlsx - ExternalLinksTable links = wb.getExternalLinksTable().get(0); + ExternalLinksTable links = wb.getExternalLinksTable(0); assertEquals("56737.xlsx", links.getLinkedFileName()); assertEquals(3, links.getSheetNames().size()); assertEquals(2, links.getDefinedNames().size()); @@ -122,7 +122,7 @@ public final class TestExternalLinksTable { // Check the second one, links to 56737.xls, slightly differently - links = wb.getExternalLinksTable().get(1); + links = wb.getExternalLinksTable(1); assertEquals("56737.xls", links.getLinkedFileName()); assertEquals(2, links.getSheetNames().size()); assertEquals(2, links.getDefinedNames().size()); diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFPictureData.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFPictureData.java index b42aeba053..fa1cb56136 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFPictureData.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFPictureData.java @@ -35,7 +35,7 @@ public final class TestXSSFPictureData { XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithDrawing.xlsx"); List pictures = wb.getAllPictures(); //wb.getAllPictures() should return the same instance across multiple calls - assertSame(pictures, wb.getAllPictures()); + assertEquals(pictures, wb.getAllPictures()); assertEquals(5, pictures.size()); String[] ext = {"jpeg", "emf", "png", "emf", "wmf"}; diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java index 7926912f6c..19da165b85 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java @@ -1391,7 +1391,7 @@ public final class TestXSSFWorkbook extends BaseTestXWorkbook { try( XSSFWorkbook workbook2 = new XSSFWorkbook(bosB.toInputStream()) ) { - CTExternalLink link = workbook2.getExternalLinksTable().get(0).getCTExternalLink(); + CTExternalLink link = workbook2.getExternalLinksTable(0).getCTExternalLink(); CTExternalSheetData sheetData = link.getExternalBook().getSheetDataSet().getSheetDataArray(0); assertEquals(Double.valueOf(sheetData.getRowArray(0).getCellArray(0).getV()), v1); assertEquals(Double.valueOf(sheetData.getRowArray(0).getCellArray(1).getV()), v2);