bug 59795: add method to synchronize start and stop cell references with CTTable
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1751368 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
4a438b1bbd
commit
31efeb44b7
@ -34,6 +34,7 @@ import org.apache.poi.openxml4j.opc.PackageRelationship;
|
|||||||
import org.apache.poi.ss.usermodel.Table;
|
import org.apache.poi.ss.usermodel.Table;
|
||||||
import org.apache.poi.ss.util.CellReference;
|
import org.apache.poi.ss.util.CellReference;
|
||||||
import org.apache.poi.xssf.usermodel.helpers.XSSFXmlColumnPr;
|
import org.apache.poi.xssf.usermodel.helpers.XSSFXmlColumnPr;
|
||||||
|
import org.apache.poi.util.Internal;
|
||||||
import org.apache.poi.util.StringUtil;
|
import org.apache.poi.util.StringUtil;
|
||||||
import org.apache.xmlbeans.XmlException;
|
import org.apache.xmlbeans.XmlException;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTable;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTable;
|
||||||
@ -113,6 +114,10 @@ public class XSSFTable extends POIXMLDocumentPart implements Table {
|
|||||||
out.close();
|
out.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the underlying CTTable XML bean
|
||||||
|
*/
|
||||||
|
@Internal
|
||||||
public CTTable getCTTable() {
|
public CTTable getCTTable() {
|
||||||
return ctTable;
|
return ctTable;
|
||||||
}
|
}
|
||||||
@ -262,15 +267,12 @@ public class XSSFTable extends POIXMLDocumentPart implements Table {
|
|||||||
* (see Open Office XML Part 4: chapter 3.5.1.2, attribute ref)
|
* (see Open Office XML Part 4: chapter 3.5.1.2, attribute ref)
|
||||||
*
|
*
|
||||||
* Does not track updates to underlying changes to CTTable
|
* Does not track updates to underlying changes to CTTable
|
||||||
|
* To synchronize with changes to the underlying CTTable,
|
||||||
|
* call {@link #updateReferences()}.
|
||||||
*/
|
*/
|
||||||
public CellReference getStartCellReference() {
|
public CellReference getStartCellReference() {
|
||||||
if (startCellReference==null) {
|
if (startCellReference==null) {
|
||||||
String ref = ctTable.getRef();
|
setCellReferences();
|
||||||
if (ref != null) {
|
|
||||||
String[] boundaries = ref.split(":");
|
|
||||||
String from = boundaries[0];
|
|
||||||
startCellReference = new CellReference(from);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return startCellReference;
|
return startCellReference;
|
||||||
}
|
}
|
||||||
@ -280,22 +282,53 @@ public class XSSFTable extends POIXMLDocumentPart implements Table {
|
|||||||
* (see Open Office XML Part 4: chapter 3.5.1.2, attribute ref)
|
* (see Open Office XML Part 4: chapter 3.5.1.2, attribute ref)
|
||||||
*
|
*
|
||||||
* Does not track updates to underlying changes to CTTable
|
* Does not track updates to underlying changes to CTTable
|
||||||
|
* To synchronize with changes to the underlying CTTable,
|
||||||
|
* call {@link #updateReferences()}.
|
||||||
*/
|
*/
|
||||||
public CellReference getEndCellReference() {
|
public CellReference getEndCellReference() {
|
||||||
if (endCellReference==null) {
|
if (endCellReference==null) {
|
||||||
String ref = ctTable.getRef();
|
setCellReferences();
|
||||||
String[] boundaries = ref.split(":");
|
|
||||||
String from = boundaries[1];
|
|
||||||
endCellReference = new CellReference(from);
|
|
||||||
}
|
}
|
||||||
return endCellReference;
|
return endCellReference;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since POI 3.15 beta 3
|
||||||
|
*/
|
||||||
|
private void setCellReferences() {
|
||||||
|
String ref = ctTable.getRef();
|
||||||
|
if (ref != null) {
|
||||||
|
String[] boundaries = ref.split(":", 2);
|
||||||
|
String from = boundaries[0];
|
||||||
|
String to = boundaries[1];
|
||||||
|
startCellReference = new CellReference(from);
|
||||||
|
endCellReference = new CellReference(to);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears the cached values set by {@link #getStartCellReference()}
|
||||||
|
* and {@link #getEndCellReference()}.
|
||||||
|
* The next call to {@link #getStartCellReference()} and
|
||||||
|
* {@link #getEndCellReference()} will synchronize the
|
||||||
|
* cell references with the underlying <code>CTTable</code>.
|
||||||
|
* Thus, {@link #updateReferences()} is inexpensive.
|
||||||
|
*
|
||||||
|
* @since POI 3.15 beta 3
|
||||||
|
*/
|
||||||
|
public void updateReferences() {
|
||||||
|
startCellReference = null;
|
||||||
|
endCellReference = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the total number of rows in the selection. (Note: in this version autofiltering is ignored)
|
* @return the total number of rows in the selection. (Note: in this version autofiltering is ignored)
|
||||||
*
|
*
|
||||||
* Does not track updates to underlying changes to CTTable
|
* Does not track updates to underlying changes to CTTable
|
||||||
|
* To synchronize with changes to the underlying CTTable,
|
||||||
|
* call {@link #updateReferences()}.
|
||||||
*/
|
*/
|
||||||
public int getRowCount() {
|
public int getRowCount() {
|
||||||
CellReference from = getStartCellReference();
|
CellReference from = getStartCellReference();
|
||||||
@ -303,6 +336,7 @@ public class XSSFTable extends POIXMLDocumentPart implements Table {
|
|||||||
|
|
||||||
int rowCount = -1;
|
int rowCount = -1;
|
||||||
if (from!=null && to!=null) {
|
if (from!=null && to!=null) {
|
||||||
|
// FIXME: shouldn't this be to-from+1?
|
||||||
rowCount = to.getRow()-from.getRow();
|
rowCount = to.getRow()-from.getRow();
|
||||||
}
|
}
|
||||||
return rowCount;
|
return rowCount;
|
||||||
@ -312,6 +346,10 @@ public class XSSFTable extends POIXMLDocumentPart implements Table {
|
|||||||
* Synchronize table headers with cell values in the parent sheet.
|
* Synchronize table headers with cell values in the parent sheet.
|
||||||
* Headers <em>must</em> be in sync, otherwise Excel will display a
|
* Headers <em>must</em> be in sync, otherwise Excel will display a
|
||||||
* "Found unreadable content" message on startup.
|
* "Found unreadable content" message on startup.
|
||||||
|
*
|
||||||
|
* If calling both {@link #updateReferences()} and
|
||||||
|
* {@link #updateHeaders()}, {@link #updateReferences()}
|
||||||
|
* should be called first.
|
||||||
*/
|
*/
|
||||||
public void updateHeaders() {
|
public void updateHeaders() {
|
||||||
XSSFSheet sheet = (XSSFSheet)getParent();
|
XSSFSheet sheet = (XSSFSheet)getParent();
|
||||||
|
@ -238,4 +238,33 @@ public final class TestXSSFTable {
|
|||||||
|
|
||||||
wb.close();
|
wb.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getCellReferences() {
|
||||||
|
// make sure that cached start and end cell references
|
||||||
|
// can be synchronized with the underlying CTTable
|
||||||
|
XSSFWorkbook wb = new XSSFWorkbook();
|
||||||
|
XSSFSheet sh = wb.createSheet();
|
||||||
|
XSSFTable table = sh.createTable();
|
||||||
|
CTTable ctTable = table.getCTTable();
|
||||||
|
ctTable.setRef("B2:E8");
|
||||||
|
|
||||||
|
assertEquals(new CellReference("B2"), table.getStartCellReference());
|
||||||
|
assertEquals(new CellReference("E8"), table.getEndCellReference());
|
||||||
|
|
||||||
|
// At this point start and end cell reference are cached
|
||||||
|
// and may not follow changes to the underlying CTTable
|
||||||
|
ctTable.setRef("C1:M3");
|
||||||
|
|
||||||
|
assertEquals(new CellReference("B2"), table.getStartCellReference());
|
||||||
|
assertEquals(new CellReference("E8"), table.getEndCellReference());
|
||||||
|
|
||||||
|
// Force a synchronization between CTTable and XSSFTable
|
||||||
|
// start and end cell references
|
||||||
|
table.updateReferences();
|
||||||
|
|
||||||
|
assertEquals(new CellReference("C1"), table.getStartCellReference());
|
||||||
|
assertEquals(new CellReference("M3"), table.getEndCellReference());
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user