Load shared strings table when loading workbook.
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@627407 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
47ffd707d6
commit
7d48f4d18e
@ -22,8 +22,10 @@ import org.openxml4j.exceptions.InvalidFormatException;
|
||||
import org.openxml4j.exceptions.OpenXML4JException;
|
||||
import org.openxml4j.opc.Package;
|
||||
import org.openxml4j.opc.PackagePart;
|
||||
import org.openxml4j.opc.PackagePartName;
|
||||
import org.openxml4j.opc.PackageRelationship;
|
||||
import org.openxml4j.opc.PackageRelationshipTypes;
|
||||
import org.openxml4j.opc.PackagingURIHelper;
|
||||
|
||||
|
||||
public abstract class POIXMLDocument {
|
||||
@ -62,4 +64,13 @@ public abstract class POIXMLDocument {
|
||||
protected PackagePart getCorePart() {
|
||||
return this.corePart;
|
||||
}
|
||||
|
||||
protected PackagePart getPart(PackageRelationship rel) throws InvalidFormatException {
|
||||
PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI());
|
||||
PackagePart part = getPackage().getPart(relName);
|
||||
if (part == null) {
|
||||
throw new IllegalArgumentException("No part found for relationship " + rel);
|
||||
}
|
||||
return part;
|
||||
}
|
||||
}
|
||||
|
@ -37,8 +37,8 @@ public class XSSFCell implements Cell {
|
||||
private static final String TRUE_AS_STRING = "1";
|
||||
private final CTCell cell;
|
||||
private final XSSFRow row;
|
||||
private SharedStringSource sharedStringSource;
|
||||
private short cellNum;
|
||||
private SharedStringSource sharedStringSource;
|
||||
|
||||
/**
|
||||
* Create a new XSSFCell. This method is protected to be used only by
|
||||
@ -54,10 +54,11 @@ public class XSSFCell implements Cell {
|
||||
if (cell.getR() != null) {
|
||||
this.cellNum = parseCellNum(cell.getR());
|
||||
}
|
||||
this.sharedStringSource = row.getSheet().getWorkbook().getSharedStringSource();
|
||||
}
|
||||
|
||||
protected void setSharedStringSource(SharedStringSource sharedStringSource) {
|
||||
this.sharedStringSource = sharedStringSource;
|
||||
|
||||
protected SharedStringSource getSharedStringSource() {
|
||||
return this.sharedStringSource;
|
||||
}
|
||||
|
||||
public boolean getBooleanCellValue() {
|
||||
@ -154,7 +155,7 @@ public class XSSFCell implements Cell {
|
||||
if(this.cell.getT() == STCellType.S) {
|
||||
if(this.cell.isSetV()) {
|
||||
int sRef = Integer.parseInt(this.cell.getV());
|
||||
return new XSSFRichTextString(sharedStringSource.getSharedStringAt(sRef));
|
||||
return new XSSFRichTextString(getSharedStringSource().getSharedStringAt(sRef));
|
||||
} else {
|
||||
return new XSSFRichTextString("");
|
||||
}
|
||||
@ -273,7 +274,7 @@ public class XSSFCell implements Cell {
|
||||
if(this.cell.getT() != STCellType.S) {
|
||||
this.cell.setT(STCellType.S);
|
||||
}
|
||||
int sRef = sharedStringSource.putSharedString(value.getString());
|
||||
int sRef = getSharedStringSource().putSharedString(value.getString());
|
||||
this.cell.setV(Integer.toString(sRef));
|
||||
}
|
||||
|
||||
|
@ -33,22 +33,35 @@ public class XSSFRow implements Row {
|
||||
|
||||
private List<Cell> cells;
|
||||
|
||||
private XSSFSheet sheet;
|
||||
|
||||
/**
|
||||
* Create a new XSSFRow. This method is protected to be used only by
|
||||
* tests.
|
||||
*/
|
||||
protected XSSFRow() {
|
||||
this(CTRow.Factory.newInstance());
|
||||
protected XSSFRow(XSSFSheet sheet) {
|
||||
this(CTRow.Factory.newInstance(), sheet);
|
||||
}
|
||||
|
||||
public XSSFRow(CTRow row) {
|
||||
/**
|
||||
* Create a new XSSFRow.
|
||||
*
|
||||
* @param row The underlying XMLBeans row.
|
||||
* @param sheet The parent sheet.
|
||||
*/
|
||||
public XSSFRow(CTRow row, XSSFSheet sheet) {
|
||||
this.row = row;
|
||||
this.sheet = sheet;
|
||||
this.cells = new LinkedList<Cell>();
|
||||
for (CTCell c : row.getCArray()) {
|
||||
this.cells.add(new XSSFCell(this, c));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public XSSFSheet getSheet() {
|
||||
return this.sheet;
|
||||
}
|
||||
|
||||
public Iterator<Cell> cellIterator() {
|
||||
return cells.iterator();
|
||||
|
@ -53,6 +53,7 @@ public class XSSFSheet implements Sheet {
|
||||
private CTWorksheet worksheet;
|
||||
private List<Row> rows;
|
||||
private ColumnHelper columnHelper;
|
||||
private XSSFWorkbook workbook;
|
||||
|
||||
public static final short LeftMargin = 0;
|
||||
public static final short RightMargin = 1;
|
||||
@ -61,9 +62,10 @@ public class XSSFSheet implements Sheet {
|
||||
public static final short HeaderMargin = 4;
|
||||
public static final short FooterMargin = 5;
|
||||
|
||||
public XSSFSheet(CTSheet sheet) {
|
||||
public XSSFSheet(CTSheet sheet, XSSFWorkbook workbook) {
|
||||
this.sheet = sheet;
|
||||
this.worksheet = CTWorksheet.Factory.newInstance();
|
||||
this.workbook = workbook;
|
||||
this.worksheet.addNewSheetData();
|
||||
initRows(worksheet);
|
||||
|
||||
@ -102,17 +104,26 @@ public class XSSFSheet implements Sheet {
|
||||
initColumns(worksheet);
|
||||
}
|
||||
|
||||
public XSSFSheet(CTSheet sheet, CTWorksheet worksheet) {
|
||||
public XSSFSheet(CTSheet sheet, CTWorksheet worksheet, XSSFWorkbook workbook) {
|
||||
this.sheet = sheet;
|
||||
this.worksheet = worksheet;
|
||||
this.workbook = workbook;
|
||||
initRows(worksheet);
|
||||
initColumns(worksheet);
|
||||
}
|
||||
|
||||
public XSSFSheet(XSSFWorkbook workbook) {
|
||||
this.workbook = workbook;
|
||||
}
|
||||
|
||||
public XSSFWorkbook getWorkbook() {
|
||||
return this.workbook;
|
||||
}
|
||||
|
||||
private void initRows(CTWorksheet worksheet) {
|
||||
this.rows = new LinkedList<Row>();
|
||||
for (CTRow row : worksheet.getSheetData().getRowArray()) {
|
||||
this.rows.add(new XSSFRow(row));
|
||||
this.rows.add(new XSSFRow(row, this));
|
||||
}
|
||||
}
|
||||
|
||||
@ -153,13 +164,12 @@ public class XSSFSheet implements Sheet {
|
||||
|
||||
}
|
||||
|
||||
protected XSSFRow addRow(int index, int rownum) {
|
||||
CTRow row = this.worksheet.getSheetData().insertNewRow(index);
|
||||
XSSFRow xrow = new XSSFRow(row);
|
||||
xrow.setRowNum(rownum);
|
||||
// xrow.setHeight(13.41);
|
||||
return xrow;
|
||||
}
|
||||
protected XSSFRow addRow(int index, int rownum) {
|
||||
CTRow row = this.worksheet.getSheetData().insertNewRow(index);
|
||||
XSSFRow xrow = new XSSFRow(row, this);
|
||||
xrow.setRowNum(rownum);
|
||||
return xrow;
|
||||
}
|
||||
|
||||
public Row createRow(int rownum) {
|
||||
int index = 0;
|
||||
@ -760,7 +770,7 @@ public class XSSFSheet implements Sheet {
|
||||
}
|
||||
|
||||
protected XSSFSheet cloneSheet() {
|
||||
return new XSSFSheet((CTSheet) sheet.copy());
|
||||
return new XSSFSheet((CTSheet) sheet.copy(), this.workbook);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -19,6 +19,7 @@ package org.apache.poi.xssf.usermodel;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
@ -30,8 +31,10 @@ import org.apache.poi.ss.usermodel.DataFormat;
|
||||
import org.apache.poi.ss.usermodel.Font;
|
||||
import org.apache.poi.ss.usermodel.Name;
|
||||
import org.apache.poi.ss.usermodel.Palette;
|
||||
import org.apache.poi.ss.usermodel.SharedStringSource;
|
||||
import org.apache.poi.ss.usermodel.Sheet;
|
||||
import org.apache.poi.ss.usermodel.Workbook;
|
||||
import org.apache.poi.xssf.strings.SharedStringsTable;
|
||||
import org.apache.xmlbeans.XmlException;
|
||||
import org.apache.xmlbeans.XmlObject;
|
||||
import org.apache.xmlbeans.XmlOptions;
|
||||
@ -40,6 +43,7 @@ import org.openxml4j.opc.Package;
|
||||
import org.openxml4j.opc.PackagePart;
|
||||
import org.openxml4j.opc.PackagePartName;
|
||||
import org.openxml4j.opc.PackageRelationship;
|
||||
import org.openxml4j.opc.PackageRelationshipCollection;
|
||||
import org.openxml4j.opc.PackageRelationshipTypes;
|
||||
import org.openxml4j.opc.PackagingURIHelper;
|
||||
import org.openxml4j.opc.TargetMode;
|
||||
@ -58,10 +62,14 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||
|
||||
private static final String WORKSHEET_RELATIONSHIP = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet";
|
||||
|
||||
private static final String SHARED_STRINGS_RELATIONSHIP = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings";
|
||||
|
||||
private CTWorkbook workbook;
|
||||
|
||||
private List<XSSFSheet> sheets = new LinkedList<XSSFSheet>();
|
||||
|
||||
|
||||
private SharedStringSource sharedStringSource;
|
||||
|
||||
public XSSFWorkbook() {
|
||||
this.workbook = CTWorkbook.Factory.newInstance();
|
||||
CTBookViews bvs = this.workbook.addNewBookViews();
|
||||
@ -75,25 +83,26 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||
try {
|
||||
WorkbookDocument doc = WorkbookDocument.Factory.parse(getCorePart().getInputStream());
|
||||
this.workbook = doc.getWorkbook();
|
||||
// Load shared strings
|
||||
PackageRelationshipCollection prc = getCorePart().getRelationshipsByType(SHARED_STRINGS_RELATIONSHIP);
|
||||
Iterator<PackageRelationship> it = prc.iterator();
|
||||
if (it.hasNext()) {
|
||||
PackageRelationship rel = it.next();
|
||||
PackagePart part = getPart(rel);
|
||||
this.sharedStringSource = new SharedStringsTable(part);
|
||||
}
|
||||
// Load individual sheets
|
||||
for (CTSheet ctSheet : this.workbook.getSheets().getSheetArray()) {
|
||||
PackageRelationship rel = this.getCorePart().getRelationship(ctSheet.getId());
|
||||
PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI());
|
||||
PackagePart part = getPackage().getPart(relName);
|
||||
if (part == null) {
|
||||
throw new IllegalArgumentException("No part found for relationship " + rel);
|
||||
}
|
||||
PackagePart part = getPart(rel);
|
||||
WorksheetDocument worksheetDoc = WorksheetDocument.Factory.parse(part.getInputStream());
|
||||
XSSFSheet sheet = new XSSFSheet(ctSheet, worksheetDoc.getWorksheet());
|
||||
XSSFSheet sheet = new XSSFSheet(ctSheet, worksheetDoc.getWorksheet(), this);
|
||||
this.sheets.add(sheet);
|
||||
}
|
||||
} catch (XmlException e) {
|
||||
throw new IOException(e.toString());
|
||||
} catch (InvalidFormatException e) {
|
||||
throw new IOException(e.toString());
|
||||
/*
|
||||
} catch (OpenXML4JException e) {
|
||||
throw new IOException(e.toString());
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
@ -172,7 +181,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||
if (sheetname != null) {
|
||||
sheet.setName(sheetname);
|
||||
}
|
||||
XSSFSheet wrapper = new XSSFSheet(sheet);
|
||||
XSSFSheet wrapper = new XSSFSheet(sheet, this);
|
||||
this.sheets.add(wrapper);
|
||||
return wrapper;
|
||||
}
|
||||
@ -448,4 +457,12 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||
|
||||
}
|
||||
|
||||
public SharedStringSource getSharedStringSource() {
|
||||
return this.sharedStringSource;
|
||||
}
|
||||
|
||||
protected void setSharedStringSource(SharedStringSource sharedStringSource) {
|
||||
this.sharedStringSource = sharedStringSource;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -48,6 +48,8 @@ public class TestLoadSaveXSSF extends TestCase {
|
||||
Cell cell = row.getCell((short) 1);
|
||||
assertNotNull(cell);
|
||||
assertEquals(111.0, cell.getNumericCellValue());
|
||||
cell = row.getCell((short) 0);
|
||||
assertEquals("Lorem", cell.getRichStringCellValue().getString());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -35,7 +35,8 @@ public class TestXSSFCell extends TestCase {
|
||||
* Test setting and getting boolean values.
|
||||
*/
|
||||
public void testSetGetBoolean() throws Exception {
|
||||
XSSFCell cell = new XSSFCell(new XSSFRow());
|
||||
XSSFRow row = createParentObjects();
|
||||
XSSFCell cell = new XSSFCell(row);
|
||||
cell.setCellValue(true);
|
||||
assertEquals(Cell.CELL_TYPE_BOOLEAN, cell.getCellType());
|
||||
assertTrue(cell.getBooleanCellValue());
|
||||
@ -54,7 +55,8 @@ public class TestXSSFCell extends TestCase {
|
||||
* Test setting and getting numeric values.
|
||||
*/
|
||||
public void testSetGetNumeric() throws Exception {
|
||||
XSSFCell cell = new XSSFCell(new XSSFRow());
|
||||
XSSFRow row = createParentObjects();
|
||||
XSSFCell cell = new XSSFCell(row);
|
||||
cell.setCellValue(10d);
|
||||
assertEquals(Cell.CELL_TYPE_NUMERIC, cell.getCellType());
|
||||
assertEquals(10d, cell.getNumericCellValue());
|
||||
@ -66,7 +68,8 @@ public class TestXSSFCell extends TestCase {
|
||||
* Test setting and getting numeric values.
|
||||
*/
|
||||
public void testSetGetDate() throws Exception {
|
||||
XSSFCell cell = new XSSFCell(new XSSFRow());
|
||||
XSSFRow row = createParentObjects();
|
||||
XSSFCell cell = new XSSFCell(row);
|
||||
Date now = new Date();
|
||||
cell.setCellValue(now);
|
||||
assertEquals(Cell.CELL_TYPE_NUMERIC, cell.getCellType());
|
||||
@ -89,7 +92,8 @@ public class TestXSSFCell extends TestCase {
|
||||
}
|
||||
|
||||
public void testSetGetError() throws Exception {
|
||||
XSSFCell cell = new XSSFCell(new XSSFRow());
|
||||
XSSFRow row = createParentObjects();
|
||||
XSSFCell cell = new XSSFCell(row);
|
||||
cell.setCellErrorValue((byte)255);
|
||||
assertEquals(Cell.CELL_TYPE_ERROR, cell.getCellType());
|
||||
|
||||
@ -97,7 +101,8 @@ public class TestXSSFCell extends TestCase {
|
||||
}
|
||||
|
||||
public void testSetGetFormula() throws Exception {
|
||||
XSSFCell cell = new XSSFCell(new XSSFRow());
|
||||
XSSFRow row = createParentObjects();
|
||||
XSSFCell cell = new XSSFCell(row);
|
||||
String formula = "SQRT(C2^2+D2^2)";
|
||||
|
||||
cell.setCellFormula(formula);
|
||||
@ -109,8 +114,8 @@ public class TestXSSFCell extends TestCase {
|
||||
|
||||
public void testSetGetStringInline() throws Exception {
|
||||
CTCell rawCell = CTCell.Factory.newInstance();
|
||||
XSSFCell cell = new XSSFCell(new XSSFRow(), rawCell);
|
||||
cell.setSharedStringSource(new DummySharedStringSource());
|
||||
XSSFRow row = createParentObjects();
|
||||
XSSFCell cell = new XSSFCell(row, rawCell);
|
||||
|
||||
// Default is shared string mode, so have to do this explicitly
|
||||
rawCell.setT(STCellType.INLINE_STR);
|
||||
@ -133,8 +138,8 @@ public class TestXSSFCell extends TestCase {
|
||||
}
|
||||
|
||||
public void testSetGetStringShared() throws Exception {
|
||||
XSSFCell cell = new XSSFCell(new XSSFRow());
|
||||
cell.setSharedStringSource(new DummySharedStringSource());
|
||||
XSSFRow row = createParentObjects();
|
||||
XSSFCell cell = new XSSFCell(row);
|
||||
|
||||
cell.setCellValue(new XSSFRichTextString(""));
|
||||
assertEquals(Cell.CELL_TYPE_STRING, cell.getCellType());
|
||||
@ -149,7 +154,8 @@ public class TestXSSFCell extends TestCase {
|
||||
* Test that empty cells (no v element) return default values.
|
||||
*/
|
||||
public void testGetEmptyCellValue() throws Exception {
|
||||
XSSFCell cell = new XSSFCell(new XSSFRow());
|
||||
XSSFRow row = createParentObjects();
|
||||
XSSFCell cell = new XSSFCell(row);
|
||||
cell.setCellType(Cell.CELL_TYPE_BOOLEAN);
|
||||
assertFalse(cell.getBooleanCellValue());
|
||||
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
|
||||
@ -171,7 +177,7 @@ public class TestXSSFCell extends TestCase {
|
||||
}
|
||||
|
||||
public void testFormatPosition() {
|
||||
XSSFRow row = new XSSFRow();
|
||||
XSSFRow row = createParentObjects();
|
||||
row.setRowNum(0);
|
||||
XSSFCell cell = new XSSFCell(row);
|
||||
cell.setCellNum((short) 0);
|
||||
@ -185,6 +191,14 @@ public class TestXSSFCell extends TestCase {
|
||||
row.setRowNum(32767);
|
||||
assertEquals("IV32768", cell.formatPosition());
|
||||
}
|
||||
|
||||
private XSSFRow createParentObjects() {
|
||||
XSSFWorkbook wb = new XSSFWorkbook();
|
||||
wb.setSharedStringSource(new DummySharedStringSource());
|
||||
XSSFSheet sheet = new XSSFSheet(wb);
|
||||
XSSFRow row = new XSSFRow(sheet);
|
||||
return row;
|
||||
}
|
||||
|
||||
public static class DummySharedStringSource implements SharedStringSource {
|
||||
ArrayList<String> strs = new ArrayList<String>();
|
||||
|
@ -22,6 +22,7 @@ import java.util.Iterator;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.apache.poi.ss.usermodel.Cell;
|
||||
import org.apache.poi.xssf.usermodel.TestXSSFCell.DummySharedStringSource;
|
||||
|
||||
|
||||
public class TestXSSFRow extends TestCase {
|
||||
@ -30,7 +31,7 @@ public class TestXSSFRow extends TestCase {
|
||||
* Test adding cells to a row in various places and see if we can find them again.
|
||||
*/
|
||||
public void testAddAndIterateCells() {
|
||||
XSSFRow row = new XSSFRow();
|
||||
XSSFRow row = new XSSFRow(createParentObjects());
|
||||
|
||||
// One cell at the beginning
|
||||
Cell cell1 = row.createCell((short) 1);
|
||||
@ -110,7 +111,7 @@ public class TestXSSFRow extends TestCase {
|
||||
assertFalse(row.getFirstCellNum() == (short) 2);
|
||||
|
||||
// Test a row without cells
|
||||
XSSFRow emptyRow = new XSSFRow();
|
||||
XSSFRow emptyRow = new XSSFRow(createParentObjects());
|
||||
assertEquals(-1, emptyRow.getFirstCellNum());
|
||||
}
|
||||
|
||||
@ -167,8 +168,8 @@ public class TestXSSFRow extends TestCase {
|
||||
* Method that returns a row with some sample cells
|
||||
* @return row
|
||||
*/
|
||||
public static XSSFRow getSampleRow() {
|
||||
XSSFRow row = new XSSFRow();
|
||||
public XSSFRow getSampleRow() {
|
||||
XSSFRow row = new XSSFRow(createParentObjects());
|
||||
row.createCell((short) 2);
|
||||
row.createCell((short) 3, Cell.CELL_TYPE_NUMERIC);
|
||||
row.createCell((short) 4);
|
||||
@ -178,4 +179,10 @@ public class TestXSSFRow extends TestCase {
|
||||
row.createCell((short) 100);
|
||||
return row;
|
||||
}
|
||||
|
||||
private XSSFSheet createParentObjects() {
|
||||
XSSFWorkbook wb = new XSSFWorkbook();
|
||||
wb.setSharedStringSource(new DummySharedStringSource());
|
||||
return new XSSFSheet(wb);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user