mirror of https://github.com/apache/poi.git
XSSF named range support
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@643189 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
c41bb15f4e
commit
117e95f063
|
@ -0,0 +1,73 @@
|
||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
package org.apache.poi.xssf.usermodel;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.Name;
|
||||||
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* XSSF Implementation of a Named Range
|
||||||
|
*/
|
||||||
|
public class XSSFName implements Name {
|
||||||
|
private XSSFWorkbook workbook;
|
||||||
|
private CTDefinedName ctName;
|
||||||
|
|
||||||
|
protected XSSFName(XSSFWorkbook workbook) {
|
||||||
|
this.workbook = workbook;
|
||||||
|
this.ctName = CTDefinedName.Factory.newInstance();
|
||||||
|
}
|
||||||
|
protected XSSFName(CTDefinedName name, XSSFWorkbook workbook) {
|
||||||
|
this.workbook = workbook;
|
||||||
|
this.ctName = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the underlying named range object
|
||||||
|
*/
|
||||||
|
protected CTDefinedName getCTName() {
|
||||||
|
return ctName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNameName() {
|
||||||
|
return ctName.getName();
|
||||||
|
}
|
||||||
|
public void setNameName(String nameName) {
|
||||||
|
ctName.setName(nameName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getReference() {
|
||||||
|
return ctName.getStringValue();
|
||||||
|
}
|
||||||
|
public void setReference(String ref) {
|
||||||
|
ctName.setStringValue(ref);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSheetName() {
|
||||||
|
long sheetId = ctName.getLocalSheetId();
|
||||||
|
if(sheetId >= 0) {
|
||||||
|
return workbook.getSheetName((int)sheetId);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getComment() {
|
||||||
|
return ctName.getComment();
|
||||||
|
}
|
||||||
|
public void setComment(String comment) {
|
||||||
|
ctName.setComment(comment);
|
||||||
|
}
|
||||||
|
}
|
|
@ -58,6 +58,8 @@ import org.openxml4j.opc.PackagingURIHelper;
|
||||||
import org.openxml4j.opc.TargetMode;
|
import org.openxml4j.opc.TargetMode;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBookView;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBookView;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBookViews;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBookViews;
|
||||||
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedName;
|
||||||
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedNames;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDialogsheet;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDialogsheet;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook;
|
||||||
|
@ -188,6 +190,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||||
private CTWorkbook workbook;
|
private CTWorkbook workbook;
|
||||||
|
|
||||||
private List<XSSFSheet> sheets = new LinkedList<XSSFSheet>();
|
private List<XSSFSheet> sheets = new LinkedList<XSSFSheet>();
|
||||||
|
private List<XSSFName> namedRanges = new LinkedList<XSSFName>();
|
||||||
|
|
||||||
private SharedStringSource sharedStringSource;
|
private SharedStringSource sharedStringSource;
|
||||||
private StylesSource stylesSource;
|
private StylesSource stylesSource;
|
||||||
|
@ -247,6 +250,13 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||||
} catch (InvalidFormatException e) {
|
} catch (InvalidFormatException e) {
|
||||||
throw new IOException(e.toString());
|
throw new IOException(e.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Process the named ranges
|
||||||
|
if(workbook.getDefinedNames() != null) {
|
||||||
|
for(CTDefinedName ctName : workbook.getDefinedNames().getDefinedNameArray()) {
|
||||||
|
namedRanges.add(new XSSFName(ctName, this));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected CTWorkbook getWorkbook() {
|
protected CTWorkbook getWorkbook() {
|
||||||
|
@ -324,9 +334,10 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Name createName() {
|
public XSSFName createName() {
|
||||||
// TODO Auto-generated method stub
|
XSSFName name = new XSSFName(this);
|
||||||
return null;
|
namedRanges.add(name);
|
||||||
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Sheet createSheet() {
|
public Sheet createSheet() {
|
||||||
|
@ -430,19 +441,19 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Name getNameAt(int index) {
|
public XSSFName getNameAt(int index) {
|
||||||
// TODO Auto-generated method stub
|
return namedRanges.get(index);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getNameIndex(String name) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNameName(int index) {
|
public String getNameName(int index) {
|
||||||
// TODO Auto-generated method stub
|
return getNameAt(index).getNameName();
|
||||||
return null;
|
}
|
||||||
|
public int getNameIndex(String name) {
|
||||||
|
for(int i=0; i<namedRanges.size(); i++) {
|
||||||
|
if(namedRanges.get(i).getNameName().equals(name)) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public short getNumCellStyles() {
|
public short getNumCellStyles() {
|
||||||
|
@ -456,8 +467,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getNumberOfNames() {
|
public int getNumberOfNames() {
|
||||||
// TODO Auto-generated method stub
|
return namedRanges.size();
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getNumberOfSheets() {
|
public int getNumberOfSheets() {
|
||||||
|
@ -658,6 +668,21 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||||
STYLES.save(st, corePart);
|
STYLES.save(st, corePart);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Named ranges
|
||||||
|
if(namedRanges.size() > 0) {
|
||||||
|
CTDefinedNames names = CTDefinedNames.Factory.newInstance();
|
||||||
|
CTDefinedName[] nr = new CTDefinedName[namedRanges.size()];
|
||||||
|
for(int i=0; i<namedRanges.size(); i++) {
|
||||||
|
nr[i] = namedRanges.get(i).getCTName();
|
||||||
|
}
|
||||||
|
names.setDefinedNameArray(nr);
|
||||||
|
workbook.setDefinedNames(names);
|
||||||
|
} else {
|
||||||
|
if(workbook.isSetDefinedNames()) {
|
||||||
|
workbook.setDefinedNames(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Now we can write out the main Workbook, with
|
// Now we can write out the main Workbook, with
|
||||||
// the correct references to the other parts
|
// the correct references to the other parts
|
||||||
out = corePart.getOutputStream();
|
out = corePart.getOutputStream();
|
||||||
|
|
|
@ -17,15 +17,19 @@
|
||||||
|
|
||||||
package org.apache.poi.xssf.usermodel;
|
package org.apache.poi.xssf.usermodel;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.Name;
|
||||||
import org.apache.poi.ss.usermodel.RichTextString;
|
import org.apache.poi.ss.usermodel.RichTextString;
|
||||||
import org.apache.poi.ss.usermodel.Sheet;
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
import org.apache.poi.ss.usermodel.StylesSource;
|
import org.apache.poi.ss.usermodel.StylesSource;
|
||||||
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
import org.apache.poi.xssf.model.StylesTable;
|
import org.apache.poi.xssf.model.StylesTable;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook;
|
||||||
|
@ -299,7 +303,91 @@ public class TestXSSFWorkbook extends TestCase {
|
||||||
st.putNumberFormat("testFORMAT2"));
|
st.putNumberFormat("testFORMAT2"));
|
||||||
assertEquals(10, st._getNumberFormatSize());
|
assertEquals(10, st._getNumberFormatSize());
|
||||||
|
|
||||||
|
|
||||||
// Save, load back in again, and check
|
// Save, load back in again, and check
|
||||||
// TODO
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
workbook.write(baos);
|
||||||
|
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
|
||||||
|
workbook = new XSSFWorkbook(Package.open(bais));
|
||||||
|
|
||||||
|
ss = workbook.getStylesSource();
|
||||||
|
assertNotNull(ss);
|
||||||
|
assertTrue(ss instanceof StylesTable);
|
||||||
|
st = (StylesTable)ss;
|
||||||
|
|
||||||
|
assertEquals(10, st._getNumberFormatSize());
|
||||||
|
assertEquals(2, st._getFontsSize());
|
||||||
|
assertEquals(2, st._getFillsSize());
|
||||||
|
assertEquals(1, st._getBordersSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testNamedRanges() throws Exception {
|
||||||
|
// First up, a new file
|
||||||
|
XSSFWorkbook workbook = new XSSFWorkbook();
|
||||||
|
assertEquals(0, workbook.getNumberOfNames());
|
||||||
|
|
||||||
|
Name nameA = workbook.createName();
|
||||||
|
nameA.setReference("A2");
|
||||||
|
nameA.setNameName("ForA2");
|
||||||
|
|
||||||
|
XSSFName nameB = workbook.createName();
|
||||||
|
nameB.setReference("B3");
|
||||||
|
nameB.setNameName("ForB3");
|
||||||
|
nameB.setComment("B3 Comment");
|
||||||
|
|
||||||
|
// Save and re-load
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
workbook.write(baos);
|
||||||
|
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
|
||||||
|
workbook = new XSSFWorkbook(Package.open(bais));
|
||||||
|
|
||||||
|
assertEquals(2, workbook.getNumberOfNames());
|
||||||
|
assertEquals("A2", workbook.getNameAt(0).getReference());
|
||||||
|
assertEquals("ForA2", workbook.getNameAt(0).getNameName());
|
||||||
|
assertNull(workbook.getNameAt(0).getComment());
|
||||||
|
|
||||||
|
assertEquals("B3", workbook.getNameAt(1).getReference());
|
||||||
|
assertEquals("ForB3", workbook.getNameAt(1).getNameName());
|
||||||
|
assertEquals("B3 Comment", workbook.getNameAt(1).getComment());
|
||||||
|
|
||||||
|
assertEquals("ForA2", workbook.getNameName(0));
|
||||||
|
assertEquals(1, workbook.getNameIndex("ForB3"));
|
||||||
|
assertEquals(-1, workbook.getNameIndex("ForB3!!"));
|
||||||
|
|
||||||
|
|
||||||
|
// Now, an existing file with named ranges
|
||||||
|
File xml = new File(
|
||||||
|
System.getProperty("HSSF.testdata.path") +
|
||||||
|
File.separator + "WithVariousData.xlsx"
|
||||||
|
);
|
||||||
|
assertTrue(xml.exists());
|
||||||
|
|
||||||
|
workbook = new XSSFWorkbook(xml.toString());
|
||||||
|
|
||||||
|
assertEquals(2, workbook.getNumberOfNames());
|
||||||
|
assertEquals("Sheet1!$A$2:$A$7", workbook.getNameAt(0).getReference());
|
||||||
|
assertEquals("AllANumbers", workbook.getNameAt(0).getNameName());
|
||||||
|
assertEquals("All the numbers in A", workbook.getNameAt(0).getComment());
|
||||||
|
|
||||||
|
assertEquals("Sheet1!$B$2:$B$7", workbook.getNameAt(1).getReference());
|
||||||
|
assertEquals("AllBStrings", workbook.getNameAt(1).getNameName());
|
||||||
|
assertEquals("All the strings in B", workbook.getNameAt(1).getComment());
|
||||||
|
|
||||||
|
// Tweak, save, and re-check
|
||||||
|
workbook.getNameAt(1).setNameName("BStringsFun");
|
||||||
|
|
||||||
|
baos = new ByteArrayOutputStream();
|
||||||
|
workbook.write(baos);
|
||||||
|
bais = new ByteArrayInputStream(baos.toByteArray());
|
||||||
|
workbook = new XSSFWorkbook(Package.open(bais));
|
||||||
|
|
||||||
|
assertEquals(2, workbook.getNumberOfNames());
|
||||||
|
assertEquals("Sheet1!$A$2:$A$7", workbook.getNameAt(0).getReference());
|
||||||
|
assertEquals("AllANumbers", workbook.getNameAt(0).getNameName());
|
||||||
|
assertEquals("All the numbers in A", workbook.getNameAt(0).getComment());
|
||||||
|
|
||||||
|
assertEquals("Sheet1!$B$2:$B$7", workbook.getNameAt(1).getReference());
|
||||||
|
assertEquals("BStringsFun", workbook.getNameAt(1).getNameName());
|
||||||
|
assertEquals("All the strings in B", workbook.getNameAt(1).getComment());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue