package org.apache.poi.xssf.model;
import static org.apache.poi.ooxml.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.ooxml.POIXMLDocumentPart;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.openxml4j.opc.PackageRelationshipTypes;
import org.apache.poi.openxml4j.opc.TargetMode;
import org.apache.poi.ss.usermodel.Name;
import org.apache.xmlbeans.XmlException;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTExternalDefinedName;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTExternalLink;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTExternalSheetName;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.ExternalLinkDocument;
public class ExternalLinksTable extends POIXMLDocumentPart {
private CTExternalLink link;
public ExternalLinksTable() {
super();
link = CTExternalLink.Factory.newInstance();
link.addNewExternalBook();
}
public ExternalLinksTable(PackagePart part) throws IOException {
super(part);
readFrom(part.getInputStream());
}
public void readFrom(InputStream is) throws IOException {
try {
ExternalLinkDocument doc = ExternalLinkDocument.Factory.parse(is, DEFAULT_XML_OPTIONS);
link = doc.getExternalLink();
} catch (XmlException e) {
throw new IOException(e.getLocalizedMessage());
}
}
public void writeTo(OutputStream out) throws IOException {
ExternalLinkDocument doc = ExternalLinkDocument.Factory.newInstance();
doc.setExternalLink(link);
doc.save(out, DEFAULT_XML_OPTIONS);
}
@Override
protected void commit() throws IOException {
PackagePart part = getPackagePart();
OutputStream out = part.getOutputStream();
writeTo(out);
out.close();
}
public CTExternalLink getCTExternalLink(){
return link;
}
public String getLinkedFileName() {
String rId = link.getExternalBook().getId();
PackageRelationship rel = getPackagePart().getRelationship(rId);
if (rel != null && rel.getTargetMode() == TargetMode.EXTERNAL) {
return rel.getTargetURI().toString();
} else {
return null;
}
}
public void setLinkedFileName(String target) {
String rId = link.getExternalBook().getId();
if (rId == null || rId.isEmpty()) {
} else {
getPackagePart().removeRelationship(rId);
}
PackageRelationship newRel = getPackagePart().addExternalRelationship(
target, PackageRelationshipTypes.EXTERNAL_LINK_PATH);
link.getExternalBook().setId(newRel.getId());
}
public List<String> getSheetNames() {
CTExternalSheetName[] sheetNames =
link.getExternalBook().getSheetNames().getSheetNameArray();
List<String> names = new ArrayList<>(sheetNames.length);
for (CTExternalSheetName name : sheetNames) {
names.add(name.getVal());
}
return names;
}
public List<Name> getDefinedNames() {
CTExternalDefinedName[] extNames =
link.getExternalBook().getDefinedNames().getDefinedNameArray();
List<Name> names = new ArrayList<>(extNames.length);
for (CTExternalDefinedName extName : extNames) {
names.add(new ExternalName(extName));
}
return names;
}
protected class ExternalName implements Name {
private CTExternalDefinedName name;
protected ExternalName(CTExternalDefinedName name) {
this.name = name;
}
public String getNameName() {
return name.getName();
}
public void setNameName(String name) {
this.name.setName(name);
}
public String getSheetName() {
int sheetId = getSheetIndex();
if (sheetId >= 0) {
return getSheetNames().get(sheetId);
} else {
return null;
}
}
public int getSheetIndex() {
if (name.isSetSheetId()) {
return (int)name.getSheetId();
}
return -1;
}
public void setSheetIndex(int sheetId) {
name.setSheetId(sheetId);
}
public String getRefersToFormula() {
return name.getRefersTo().substring(1);
}
public void setRefersToFormula(String formulaText) {
name.setRefersTo('=' + formulaText);
}
public boolean isFunctionName() {
return false;
}
public boolean isDeleted() {
return false;
}
public String () {
return null;
}
public void (String comment) {
throw new IllegalStateException("Not Supported");
}
public void setFunction(boolean value) {
throw new IllegalStateException("Not Supported");
}
}
}