Make it possible to create simple XSSF sheet tables without needing CT classes directly
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1797919 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
2ce00a5a78
commit
fd0e150a94
@ -42,6 +42,7 @@ import org.apache.poi.xssf.usermodel.helpers.XSSFXmlColumnPr;
|
|||||||
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;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableColumn;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableColumn;
|
||||||
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableColumns;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.TableDocument;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.TableDocument;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -215,7 +216,6 @@ public class XSSFTable extends POIXMLDocumentPart implements Table {
|
|||||||
* @return List of XSSFXmlColumnPr
|
* @return List of XSSFXmlColumnPr
|
||||||
*/
|
*/
|
||||||
public List<XSSFXmlColumnPr> getXmlColumnPrs() {
|
public List<XSSFXmlColumnPr> getXmlColumnPrs() {
|
||||||
|
|
||||||
if (xmlColumnPr==null) {
|
if (xmlColumnPr==null) {
|
||||||
xmlColumnPr = new ArrayList<XSSFXmlColumnPr>();
|
xmlColumnPr = new ArrayList<XSSFXmlColumnPr>();
|
||||||
for (CTTableColumn column: getTableColumns()) {
|
for (CTTableColumn column: getTableColumns()) {
|
||||||
@ -228,6 +228,29 @@ public class XSSFTable extends POIXMLDocumentPart implements Table {
|
|||||||
return xmlColumnPr;
|
return xmlColumnPr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds another column to the table.
|
||||||
|
*
|
||||||
|
* Warning - Return type likely to change!
|
||||||
|
*/
|
||||||
|
@Internal("Return type likely to change")
|
||||||
|
public void addColumn() {
|
||||||
|
// Ensure we have Table Columns
|
||||||
|
CTTableColumns columns = ctTable.getTableColumns();
|
||||||
|
if (columns == null) {
|
||||||
|
columns = ctTable.addNewTableColumns();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add another Column, and give it a sensible ID
|
||||||
|
CTTableColumn column = columns.addNewTableColumn();
|
||||||
|
int num = columns.sizeOfTableColumnArray();
|
||||||
|
columns.setCount(num);
|
||||||
|
column.setId(num);
|
||||||
|
|
||||||
|
// Have the Headers updated if possible
|
||||||
|
updateHeaders();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the name of the Table, if set
|
* @return the name of the Table, if set
|
||||||
*/
|
*/
|
||||||
@ -321,12 +344,34 @@ public class XSSFTable extends POIXMLDocumentPart implements Table {
|
|||||||
* To synchronize with changes to the underlying CTTable,
|
* To synchronize with changes to the underlying CTTable,
|
||||||
* call {@link #updateReferences()}.
|
* call {@link #updateReferences()}.
|
||||||
*/
|
*/
|
||||||
public AreaReference getReferences() {
|
public AreaReference getCellReferences() {
|
||||||
return new AreaReference(
|
return new AreaReference(
|
||||||
getStartCellReference(),
|
getStartCellReference(),
|
||||||
getEndCellReference()
|
getEndCellReference()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Updates the reference for the cells of the table
|
||||||
|
* (see Open Office XML Part 4: chapter 3.5.1.2, attribute ref)
|
||||||
|
* and synchronizes any changes
|
||||||
|
*/
|
||||||
|
public void setCellReferences(AreaReference refs) {
|
||||||
|
// Strip the Sheet name
|
||||||
|
String ref = refs.formatAsString();
|
||||||
|
if (ref.indexOf('!') != -1) {
|
||||||
|
ref = ref.substring(ref.indexOf('!')+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update
|
||||||
|
ctTable.setRef(ref);
|
||||||
|
if (ctTable.isSetAutoFilter()) {
|
||||||
|
ctTable.getAutoFilter().setRef(ref);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Have everything recomputed
|
||||||
|
updateReferences();
|
||||||
|
updateHeaders();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The reference for the cell in the top-left part of the table
|
* @return The reference for the cell in the top-left part of the table
|
||||||
|
@ -31,6 +31,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.Cell;
|
import org.apache.poi.ss.usermodel.Cell;
|
||||||
|
import org.apache.poi.ss.util.AreaReference;
|
||||||
import org.apache.poi.ss.util.CellReference;
|
import org.apache.poi.ss.util.CellReference;
|
||||||
import org.apache.poi.util.TempFile;
|
import org.apache.poi.util.TempFile;
|
||||||
import org.apache.poi.xssf.XSSFTestDataSamples;
|
import org.apache.poi.xssf.XSSFTestDataSamples;
|
||||||
@ -301,21 +302,21 @@ public final class TestXSSFTable {
|
|||||||
s = wb.getSheet("IntHeaders");
|
s = wb.getSheet("IntHeaders");
|
||||||
assertEquals(1, s.getTables().size());
|
assertEquals(1, s.getTables().size());
|
||||||
t = s.getTables().get(0);
|
t = s.getTables().get(0);
|
||||||
assertEquals("A1:B2", t.getReferences().formatAsString());
|
assertEquals("A1:B2", t.getCellReferences().formatAsString());
|
||||||
assertEquals("12", t.getCTTable().getTableColumns().getTableColumnArray(0).getName());
|
assertEquals("12", t.getCTTable().getTableColumns().getTableColumnArray(0).getName());
|
||||||
assertEquals("34", t.getCTTable().getTableColumns().getTableColumnArray(1).getName());
|
assertEquals("34", t.getCTTable().getTableColumns().getTableColumnArray(1).getName());
|
||||||
|
|
||||||
s = wb.getSheet("FloatHeaders");
|
s = wb.getSheet("FloatHeaders");
|
||||||
assertEquals(1, s.getTables().size());
|
assertEquals(1, s.getTables().size());
|
||||||
t = s.getTables().get(0);
|
t = s.getTables().get(0);
|
||||||
assertEquals("A1:B2", t.getReferences().formatAsString());
|
assertEquals("A1:B2", t.getCellReferences().formatAsString());
|
||||||
assertEquals("12.34", t.getCTTable().getTableColumns().getTableColumnArray(0).getName());
|
assertEquals("12.34", t.getCTTable().getTableColumns().getTableColumnArray(0).getName());
|
||||||
assertEquals("34.56", t.getCTTable().getTableColumns().getTableColumnArray(1).getName());
|
assertEquals("34.56", t.getCTTable().getTableColumns().getTableColumnArray(1).getName());
|
||||||
|
|
||||||
s = wb.getSheet("NoExplicitHeaders");
|
s = wb.getSheet("NoExplicitHeaders");
|
||||||
assertEquals(1, s.getTables().size());
|
assertEquals(1, s.getTables().size());
|
||||||
t = s.getTables().get(0);
|
t = s.getTables().get(0);
|
||||||
assertEquals("A1:B3", t.getReferences().formatAsString());
|
assertEquals("A1:B3", t.getCellReferences().formatAsString());
|
||||||
assertEquals("Column1", t.getCTTable().getTableColumns().getTableColumnArray(0).getName());
|
assertEquals("Column1", t.getCTTable().getTableColumns().getTableColumnArray(0).getName());
|
||||||
assertEquals("Column2", t.getCTTable().getTableColumns().getTableColumnArray(1).getName());
|
assertEquals("Column2", t.getCTTable().getTableColumns().getTableColumnArray(1).getName());
|
||||||
}
|
}
|
||||||
@ -328,29 +329,30 @@ public final class TestXSSFTable {
|
|||||||
XSSFWorkbook wb = new XSSFWorkbook();
|
XSSFWorkbook wb = new XSSFWorkbook();
|
||||||
XSSFSheet s = wb.createSheet();
|
XSSFSheet s = wb.createSheet();
|
||||||
|
|
||||||
//Setting up the CTTable
|
// Create some cells, some numeric, some not
|
||||||
XSSFTable t = s.createTable();
|
|
||||||
CTTable ctt = t.getCTTable();
|
|
||||||
ctt.setId(1);
|
|
||||||
ctt.setName("CT Table Test");
|
|
||||||
ctt.setRef("A1:B2");
|
|
||||||
CTTableColumns cttcs = ctt.addNewTableColumns();
|
|
||||||
CTTableColumn cttc1 = cttcs.addNewTableColumn();
|
|
||||||
cttc1.setId(1);
|
|
||||||
CTTableColumn cttc2 = cttcs.addNewTableColumn();
|
|
||||||
cttc2.setId(2);
|
|
||||||
|
|
||||||
//Creating the cells
|
|
||||||
Cell c1 = s.createRow(0).createCell(0);
|
Cell c1 = s.createRow(0).createCell(0);
|
||||||
XSSFCell c2 = s.getRow(0).createCell(1);
|
Cell c2 = s.getRow(0).createCell(1);
|
||||||
XSSFCell c3 = s.createRow(1).createCell(0);
|
Cell c3 = s.getRow(0).createCell(2);
|
||||||
XSSFCell c4 = s.getRow(1).createCell(1);
|
Cell c4 = s.createRow(1).createCell(0);
|
||||||
|
Cell c5 = s.getRow(1).createCell(1);
|
||||||
// Inserting values; some numeric strings, some alphabetical strings
|
Cell c6 = s.getRow(1).createCell(2);
|
||||||
c1.setCellValue(12);
|
c1.setCellValue(12);
|
||||||
c2.setCellValue(34);
|
c2.setCellValue(34.56);
|
||||||
c3.setCellValue("AB");
|
c3.setCellValue("ABCD");
|
||||||
c4.setCellValue("CD");
|
c4.setCellValue("AB");
|
||||||
|
c5.setCellValue("CD");
|
||||||
|
c6.setCellValue("EF");
|
||||||
|
|
||||||
|
// Setting up the CTTable
|
||||||
|
XSSFTable t = s.createTable();
|
||||||
|
t.setName("TableTest");
|
||||||
|
t.setDisplayName("CT Table Test");
|
||||||
|
t.addColumn();
|
||||||
|
t.addColumn();
|
||||||
|
t.addColumn();
|
||||||
|
t.setCellReferences(new AreaReference(
|
||||||
|
new CellReference(c1), new CellReference(c6)
|
||||||
|
));
|
||||||
|
|
||||||
// Save and re-load
|
// Save and re-load
|
||||||
wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
|
wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
|
||||||
@ -360,7 +362,12 @@ public final class TestXSSFTable {
|
|||||||
assertEquals(1, s.getTables().size());
|
assertEquals(1, s.getTables().size());
|
||||||
t = s.getTables().get(0);
|
t = s.getTables().get(0);
|
||||||
assertEquals("A1", t.getStartCellReference().formatAsString());
|
assertEquals("A1", t.getStartCellReference().formatAsString());
|
||||||
assertEquals("B2", t.getEndCellReference().formatAsString());
|
assertEquals("C2", t.getEndCellReference().formatAsString());
|
||||||
|
|
||||||
|
// TODO Nicer column fetching
|
||||||
|
assertEquals("12", t.getCTTable().getTableColumns().getTableColumnArray(0).getName());
|
||||||
|
assertEquals("34.56", t.getCTTable().getTableColumns().getTableColumnArray(1).getName());
|
||||||
|
assertEquals("ABCD", t.getCTTable().getTableColumns().getTableColumnArray(2).getName());
|
||||||
|
|
||||||
// Done
|
// Done
|
||||||
wb.close();
|
wb.close();
|
||||||
|
Loading…
Reference in New Issue
Block a user