diff --git a/pom.xml b/pom.xml
index 460f126..3129687 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,7 +21,7 @@
com.miraisolutions
XLConnect
jar
- 2.0.1-SNAPSHOT
+ 3.0.0-SNAPSHOT
XLConnect
https://mirai-solutions.ch/
diff --git a/src/main/java/com/miraisolutions/xlconnect/Attribute.java b/src/main/java/com/miraisolutions/xlconnect/Attribute.java
new file mode 100644
index 0000000..2bb150b
--- /dev/null
+++ b/src/main/java/com/miraisolutions/xlconnect/Attribute.java
@@ -0,0 +1,10 @@
+package com.miraisolutions.xlconnect;
+
+public enum Attribute {
+ WORKSHEET_SCOPE {
+ @Override
+ public String toString() {
+ return "worksheetScope";
+ }
+ }
+}
diff --git a/src/main/java/com/miraisolutions/xlconnect/BooleanWithAttributes.java b/src/main/java/com/miraisolutions/xlconnect/BooleanWithAttributes.java
new file mode 100644
index 0000000..ca944eb
--- /dev/null
+++ b/src/main/java/com/miraisolutions/xlconnect/BooleanWithAttributes.java
@@ -0,0 +1,25 @@
+package com.miraisolutions.xlconnect;
+
+public class BooleanWithAttributes extends ResultWithAttributes implements WithJNI{
+
+ private final boolean value;
+
+ public BooleanWithAttributes(Attribute attributeName, String attributeValue, boolean value) {
+ super(attributeName, attributeValue);
+ this.value = value;
+ }
+
+ public BooleanWithAttributes(boolean value) {
+ super();
+ this.value = value;
+ }
+
+ public boolean getValue() {
+ return value;
+ }
+
+ @Override
+ public String jni() {
+ return "Z";
+ }
+}
diff --git a/src/main/java/com/miraisolutions/xlconnect/DataFrameWithAttributes.java b/src/main/java/com/miraisolutions/xlconnect/DataFrameWithAttributes.java
new file mode 100644
index 0000000..3d72629
--- /dev/null
+++ b/src/main/java/com/miraisolutions/xlconnect/DataFrameWithAttributes.java
@@ -0,0 +1,19 @@
+package com.miraisolutions.xlconnect;
+
+import com.miraisolutions.xlconnect.data.DataFrame;
+
+public class DataFrameWithAttributes extends ResultWithAttributes{
+
+ private final DataFrame value;
+
+ public DataFrameWithAttributes(Attribute attributeName, String attributeValue, DataFrame value) {
+ super(attributeName, attributeValue);
+ this.value = value;
+ }
+
+
+ public DataFrame getValue() {
+ return value;
+ }
+
+}
diff --git a/src/main/java/com/miraisolutions/xlconnect/RDataFrameWithAttributes.java b/src/main/java/com/miraisolutions/xlconnect/RDataFrameWithAttributes.java
new file mode 100644
index 0000000..3306c63
--- /dev/null
+++ b/src/main/java/com/miraisolutions/xlconnect/RDataFrameWithAttributes.java
@@ -0,0 +1,20 @@
+package com.miraisolutions.xlconnect;
+
+import com.miraisolutions.xlconnect.integration.r.RDataFrameWrapper;
+
+import java.util.Map;
+
+public class RDataFrameWithAttributes extends ResultWithAttributes{
+
+ private final RDataFrameWrapper value;
+
+ public RDataFrameWithAttributes(Map attributes, RDataFrameWrapper value) {
+ super(attributes);
+ this.value = value;
+ }
+
+ public RDataFrameWrapper getValue() {
+ return value;
+ }
+
+}
diff --git a/src/main/java/com/miraisolutions/xlconnect/ResultWithAttributes.java b/src/main/java/com/miraisolutions/xlconnect/ResultWithAttributes.java
new file mode 100644
index 0000000..83112ea
--- /dev/null
+++ b/src/main/java/com/miraisolutions/xlconnect/ResultWithAttributes.java
@@ -0,0 +1,42 @@
+package com.miraisolutions.xlconnect;
+
+
+import java.util.*;
+
+/**
+ * Represent attributes to be set on an object in R as part of the result to be returned.
+ * Should be extended for each required type. Not using a generic typed value, because it looks like R can't retrieve it
+ * in a specific subtype (we get an Object instance).
+ */
+class ResultWithAttributes {
+
+ private final Map attributes;
+
+ public ResultWithAttributes(Map theAttributes) {
+ this.attributes = theAttributes;
+ }
+
+ public ResultWithAttributes() {
+ this(Collections.emptyMap());
+ }
+
+ public ResultWithAttributes(Attribute attributeName, String attributeValue) {
+ this(Collections.singletonMap(attributeName.toString(), new String[]{attributeValue}));
+ }
+
+ public Map getAttributes() {
+ return Collections.unmodifiableMap(attributes);
+ }
+
+ public String[] getAttributeNames() {
+ return attributes.keySet().toArray(new String[0]);
+ }
+
+ /* public String[] getAttributeValues() {
+ return attributes.values().toArray(new String[0]);
+ }*/
+
+ public String[] getAttributeValue(String attributeName){
+ return attributes.get(attributeName);
+ }
+}
diff --git a/src/main/java/com/miraisolutions/xlconnect/WithJNI.java b/src/main/java/com/miraisolutions/xlconnect/WithJNI.java
new file mode 100644
index 0000000..f6efc33
--- /dev/null
+++ b/src/main/java/com/miraisolutions/xlconnect/WithJNI.java
@@ -0,0 +1,8 @@
+package com.miraisolutions.xlconnect;
+
+public interface WithJNI {
+ /**
+ * @return the JNI to use for the getValue() method
+ */
+ String jni();
+}
diff --git a/src/main/java/com/miraisolutions/xlconnect/Workbook.java b/src/main/java/com/miraisolutions/xlconnect/Workbook.java
index d47618b..ff21338 100644
--- a/src/main/java/com/miraisolutions/xlconnect/Workbook.java
+++ b/src/main/java/com/miraisolutions/xlconnect/Workbook.java
@@ -41,6 +41,9 @@
import java.util.*;
import java.util.function.Consumer;
import java.util.stream.IntStream;
+import java.util.stream.Collectors;
+
+import static com.miraisolutions.xlconnect.Attribute.WORKSHEET_SCOPE;
/**
@@ -222,11 +225,12 @@ public void setSheetPos(String sheetName, int pos) {
workbook.setSheetOrder(sheetName, pos);
}
- public String[] getDefinedNames(boolean validOnly) {
+ public String[] getDefinedNames(boolean validOnly, String worksheetScope) {
+
return workbook.getAllNames().stream()
- .filter(namedRegion -> !validOnly || isValidNamedRegion(namedRegion))
- .map(Name::getNameName)
- .toArray(String[]::new);
+ .filter(n -> (!validOnly || isValidNamedRegion(n)) &&
+ (worksheetScope == null || n.getSheetIndex() == getSheetIndexForScope(worksheetScope)))
+ .map(Name::getNameName).toArray(String[]::new);
}
@@ -234,6 +238,18 @@ private boolean isValidNamedRegion(Name region) {
return !region.isDeleted() && hasValidWorkSheet(region);
}
+ /**
+ * Returns the sheet index for the worksheet name or -1 if the sheet name is ""
+ * @param worksheetScope the worksheet name
+ * @throws NoSuchElementException if no worksheet exists with this name
+ */
+ private int getSheetIndexForScope(String worksheetScope) {
+ if (worksheetScope.isEmpty()) return -1;
+ int index = workbook.getSheetIndex(worksheetScope);
+ if (index < 0) throw new NoSuchElementException("Worksheet " + worksheetScope + " was not found!");
+ else return index;
+ }
+
private boolean hasValidWorkSheet(Name region) {
String sheetName = null;
try {
@@ -247,10 +263,22 @@ public boolean existsSheet(String name) {
return workbook.getSheet(name) != null;
}
- public boolean existsName(String name) {
- return workbook.getName(name) != null;
+ public BooleanWithAttributes existsName(String name, String worksheetScope) {
+ try {
+ Name found = getName(name, worksheetScope);
+ String foundInScope = effectiveScope(worksheetScope, found);
+ return new BooleanWithAttributes(WORKSHEET_SCOPE, foundInScope, true);
+ } catch (IllegalArgumentException ignored) {
+ warnings.add(ignored.getMessage());
+ return worksheetScope != null ? new BooleanWithAttributes(WORKSHEET_SCOPE, worksheetScope, false) : new BooleanWithAttributes(false);
+ }
+ }
+
+ private String effectiveScope(String worksheetScope, Name found) {
+ return worksheetScope != null ? worksheetScope : found.getSheetIndex() >= 0 ? getSheet(found.getSheetIndex()).getSheetName() : "";
}
+
public void createSheet(String name) {
if (name.length() > 31)
throw new IllegalArgumentException("Sheet names are not allowed to contain more than 31 characters!");
@@ -279,56 +307,65 @@ public void renameSheet(String name, String newName) {
}
public void cloneSheet(int index, String newName) {
- cloneSheet(workbook.getSheetName(index), newName);
+ Sheet sheet = workbook.cloneSheet(index);
+ String originalName = workbook.getSheetName(index);
+ workbook.setSheetName(workbook.getSheetIndex(sheet), newName);
+ // Copy names (named ranges) that are scoped to the original sheet, adapting the scope.
+ List originalNamedRanges = workbook.getAllNames().stream().filter(name -> name.getSheetIndex() == index).collect(Collectors.toList());
+ // we have to collect the original names *then* add the new names, otherwise we get concurrency issues creating names while iterating over them
+ originalNamedRanges.forEach(namedRange ->
+ createName(namedRange.getNameName(), namedRange.getRefersToFormula(), false, newName));
}
public void cloneSheet(String name, String newName) {
- Sheet sheet = workbook.cloneSheet(workbook.getSheetIndex(name));
- workbook.setSheetName(workbook.getSheetIndex(sheet), newName);
+ cloneSheet(workbook.getSheetIndex(name), newName);
}
- public void createName(String name, String formula, boolean overwrite) {
- if (existsName(name)) {
+ public void createName(String name, String formula, boolean overwrite, String worksheetScope) {
+ if (existsName(name, worksheetScope).getValue()) {
if (overwrite) {
// Name already exists but we overwrite --> remove
- removeName(name);
+ removeName(name, worksheetScope);
} else {
// Name already exists, but we don't want to overwrite --> error
- throw new IllegalArgumentException("Specified name '" + name + "' already exists!");
+ throw new IllegalArgumentException("Specified name '" + name + "' already exists " + displayWorksheetScope(worksheetScope));
}
}
Name cname = workbook.createName();
+ if(worksheetScope != null) {
+ int sheetIndex = getSheetIndexForScope(worksheetScope);
+ if(sheetIndex >= 0) cname.setSheetIndex(sheetIndex);
+ }
try {
cname.setNameName(name);
cname.setRefersToFormula(formula);
} catch (Exception e) {
// --> Clean up (= remove) name
// Need to set dummy name in order to be able to remove it ...
- String dummyNameName = "XLConnectDummyName";
- cname.setNameName(dummyNameName);
- removeName(dummyNameName);
+ workbook.removeName(cname);
throw new IllegalArgumentException(e);
}
}
- public void removeName(String name) {
- Name cname = workbook.getName(name);
- if (cname != null)
+ public void removeName(String name, String worksheetScope) {
+ if (existsName(name, worksheetScope).getValue()) {
+ Name cname = getName(name, worksheetScope);
workbook.removeName(cname);
+ }
}
- public String getReferenceFormula(String name) {
- return getName(name).getRefersToFormula();
+ public String getReferenceFormula(String name, String worksheetScope) {
+ return getName(name, worksheetScope).getRefersToFormula();
}
// Keep for backwards compatibility
public int[] getReferenceCoordinates(String name) {
- return getReferenceCoordinatesForName(name);
+ return getReferenceCoordinatesForName(name, null);
}
- public int[] getReferenceCoordinatesForName(String name) {
- Name cname = getName(name);
+ public int[] getReferenceCoordinatesForName(String name, String worksheetScope) {
+ Name cname = getName(name, worksheetScope);
AreaReference aref = new AreaReference(cname.getRefersToFormula(), workbook.getSpreadsheetVersion());
// Get upper left corner
CellReference first = aref.getFirstCell();
@@ -576,8 +613,8 @@ public void onErrorCell(ErrorBehavior eb) {
this.onErrorCell = eb;
}
- public void writeNamedRegion(DataFrame data, String name, boolean header, boolean overwriteFormulaCells) {
- Name cname = getName(name);
+ public void writeNamedRegion(DataFrame data, String name, boolean header, boolean overwriteFormulaCells, String worksheetScope) {
+ Name cname = getName(name, worksheetScope);
checkName(cname);
// Get sheet where name is defined in
@@ -603,10 +640,11 @@ public void writeNamedRegion(DataFrame data, String name, boolean header, boolea
writeData(data, sheet, topLeft.getRow(), topLeft.getCol(), header, overwriteFormulaCells);
}
- public DataFrame readNamedRegion(String name, boolean header, ReadStrategy readStrategy, DataType[] colTypes,
- boolean forceConversion, String dateTimeFormat, boolean takeCached, int[] subset) {
- Name cname = getName(name);
+ public DataFrameWithAttributes readNamedRegion(String name, boolean header, DataType[] colTypes, boolean forceConversion, String dateTimeFormat,
+ boolean takeCached, int[] subset, ReadStrategy readStrategy, String worksheetScope) {
+ Name cname = getName(name, worksheetScope);
checkName(cname);
+ String foundInScope = effectiveScope(worksheetScope, cname);
// Get sheet where name is defined in
Sheet sheet = workbook.getSheet(cname.getSheetName());
@@ -620,8 +658,8 @@ public DataFrame readNamedRegion(String name, boolean header, ReadStrategy readS
int nrows = bottomRight.getRow() - topLeft.getRow() + 1;
int ncols = bottomRight.getCol() - topLeft.getCol() + 1;
- return readData(sheet, topLeft.getRow(), topLeft.getCol(), nrows, ncols, header, readStrategy, colTypes,
- forceConversion, dateTimeFormat, takeCached, subset);
+ return new DataFrameWithAttributes(WORKSHEET_SCOPE, foundInScope, readData(sheet, topLeft.getRow(), topLeft.getCol(), nrows, ncols, header, readStrategy, colTypes,
+ forceConversion, dateTimeFormat, takeCached, subset));
}
public DataFrame readTable(int worksheetIndex, String tableName, boolean header, ReadStrategy readStrategy,
@@ -656,7 +694,10 @@ public void writeWorksheet(DataFrame data, int worksheetIndex, int startRow, int
}
public void writeWorksheet(DataFrame data, String worksheetName, int startRow, int startCol, boolean header, boolean overwriteFormulaCells) {
- writeWorksheet(data, workbook.getSheetIndex(worksheetName), startRow, startCol, header, overwriteFormulaCells);
+ int sheetIndex = workbook.getSheetIndex(worksheetName);
+ if(sheetIndex < 0)
+ throw new NoSuchElementException("Worksheet " + worksheetName + " was not found!");
+ writeWorksheet(data, sheetIndex, startRow, startCol, header, overwriteFormulaCells);
}
public void writeWorksheet(DataFrame data, int worksheetIndex, boolean header, boolean overwriteFormulaCells) {
@@ -715,8 +756,29 @@ public DataFrame readWorksheet(String worksheetName, int startRow, int startCol,
colTypes, forceConversion, dateTimeFormat, takeCached, subset, autofitRow, autofitCol);
}
- public void addImage(File imageFile, String name, boolean originalSize) throws IOException {
- Name cname = getName(name);
+ public DataFrame readWorksheet(String worksheetName, int startRow, int startCol, int endRow, int endCol, boolean header) {
+ return readWorksheet(worksheetName, startRow, startCol, endRow, endCol, header, ReadStrategy.DEFAULT,
+ null, false, "", false, null, true, true);
+ }
+
+ public DataFrame readWorksheet(String worksheetName, int startRow, int startCol, int endRow, int endCol, boolean header,
+ boolean autofitRow, boolean autofitCol) {
+ return readWorksheet(worksheetName, startRow, startCol, endRow, endCol, header, ReadStrategy.DEFAULT,
+ null, false, "", false, null, autofitRow, autofitCol);
+ }
+
+ public DataFrame readWorksheet(String worksheetName, boolean header, ReadStrategy readStrategy, DataType[] colTypes,
+ boolean forceConversion, String dateTimeFormat) {
+ return readWorksheet(worksheetName, -1, -1, -1, -1, header, readStrategy, colTypes, forceConversion,
+ dateTimeFormat, false, null, true, true);
+ }
+
+ public DataFrame readWorksheet(String worksheetName, boolean header) {
+ return readWorksheet(worksheetName, header, ReadStrategy.DEFAULT, null, false, "");
+ }
+
+ public void addImage(File imageFile, String name, String worksheetScope, boolean originalSize) throws IOException {
+ Name cname = getName(name, worksheetScope);
// Get sheet where name is defined in
Sheet sheet = workbook.getSheet(cname.getSheetName());
@@ -726,7 +788,23 @@ public void addImage(File imageFile, String name, boolean originalSize) throws I
CellReference topLeft = aref.getFirstCell();
CellReference bottomRight = aref.getLastCell();
- int imageType = getImageType(imageFile);
+ // Determine image type
+ int imageType;
+ String filename = imageFile.getName().toLowerCase();
+ if(filename.endsWith("jpg") || filename.endsWith("jpeg")) {
+ imageType = org.apache.poi.ss.usermodel.Workbook.PICTURE_TYPE_JPEG;
+ } else if(filename.endsWith("png")) {
+ imageType = org.apache.poi.ss.usermodel.Workbook.PICTURE_TYPE_PNG;
+ } else if(filename.endsWith("wmf")) {
+ imageType = org.apache.poi.ss.usermodel.Workbook.PICTURE_TYPE_WMF;
+ } else if(filename.endsWith("emf")) {
+ imageType = org.apache.poi.ss.usermodel.Workbook.PICTURE_TYPE_EMF;
+ } else if(filename.endsWith("bmp") || filename.endsWith("dib")) {
+ imageType = org.apache.poi.ss.usermodel.Workbook.PICTURE_TYPE_DIB;
+ } else if(filename.endsWith("pict") || filename.endsWith("pct") || filename.endsWith("pic")) {
+ imageType = org.apache.poi.ss.usermodel.Workbook.PICTURE_TYPE_PICT;
+ } else
+ throw new IllegalArgumentException("Image type \""+ filename.substring(filename.lastIndexOf('.')+1) +"\" not supported!");
InputStream is = Files.newInputStream(imageFile.toPath());
byte[] bytes = IOUtils.toByteArray(is);
int imageIndex = workbook.addPicture(bytes, imageType);
@@ -754,31 +832,11 @@ public void addImage(File imageFile, String name, boolean originalSize) throws I
anchor.setAnchorType(ClientAnchor.AnchorType.DONT_MOVE_AND_RESIZE);
Picture picture = drawing.createPicture(anchor, imageIndex);
- if (originalSize) picture.resize();
- }
-
- private static int getImageType(File imageFile) {
- int imageType;
- String filename = imageFile.getName().toLowerCase();
- if (filename.endsWith("jpg") || filename.endsWith("jpeg")) {
- imageType = org.apache.poi.ss.usermodel.Workbook.PICTURE_TYPE_JPEG;
- } else if (filename.endsWith("png")) {
- imageType = org.apache.poi.ss.usermodel.Workbook.PICTURE_TYPE_PNG;
- } else if (filename.endsWith("wmf")) {
- imageType = org.apache.poi.ss.usermodel.Workbook.PICTURE_TYPE_WMF;
- } else if (filename.endsWith("emf")) {
- imageType = org.apache.poi.ss.usermodel.Workbook.PICTURE_TYPE_EMF;
- } else if (filename.endsWith("bmp") || filename.endsWith("dib")) {
- imageType = org.apache.poi.ss.usermodel.Workbook.PICTURE_TYPE_DIB;
- } else if (filename.endsWith("pict") || filename.endsWith("pct") || filename.endsWith("pic")) {
- imageType = org.apache.poi.ss.usermodel.Workbook.PICTURE_TYPE_PICT;
- } else
- throw new IllegalArgumentException("Image type \"" + filename.substring(filename.lastIndexOf('.') + 1) + "\" not supported!");
- return imageType;
+ if(originalSize) picture.resize();
}
- public void addImage(String filename, String name, boolean originalSize) throws IOException {
- addImage(new File(filename), name, originalSize);
+ public void addImage(String filename, String name, boolean originalSize, String worksheetScope) throws IOException {
+ addImage(new File(filename), name, worksheetScope, originalSize);
}
public CellStyle createCellStyle(String name) {
@@ -911,6 +969,30 @@ Name getName(String name) {
throw new IllegalArgumentException("Name '" + name + "' does not exist!");
}
+ List getNames(String name) {
+ return Collections.unmodifiableList(workbook.getNames(name));
+ }
+
+ private Name getName(String name, String worksheetScope) {
+ if (worksheetScope == null)
+ return getName(name);
+ int sheetIndex = getSheetIndexForScope(worksheetScope);
+ List cNames = getNames(name);
+ for (Name n : cNames)
+ if (n.getSheetIndex() == sheetIndex)
+ return n;
+
+ StringBuffer names = new StringBuffer();
+ String worksheetScopeDisplay = displayWorksheetScope(worksheetScope);
+ cNames.forEach(n -> names.append(n.getSheetIndex() >= 0 ? workbook.getSheetName(n.getSheetIndex()) : "global scope").append(";"));
+ throw new IllegalArgumentException("Name '" + name + "' was not specified '" + worksheetScopeDisplay + "'! " +
+ "Found in sheets: " + names);
+ }
+
+ private String displayWorksheetScope(String worksheetScope) {
+ return null == worksheetScope ? "" : worksheetScope.isEmpty() ? "in global scope" : "in " +worksheetScope;
+ }
+
// Checks only if the reference as such is valid
private boolean isValidReference(String reference) {
return reference != null && !reference.startsWith("#REF!") && !reference.startsWith("#NULL!");
@@ -1375,18 +1457,19 @@ public int getLastColumn(String sheetName) {
return getLastColumn(getSheet(sheetName));
}
- public void appendNamedRegion(DataFrame data, String name, boolean header, boolean overwriteFormulaCells) {
- Sheet sheet = workbook.getSheet(getName(name).getSheetName());
+ public void appendNamedRegion(DataFrame data, String name, boolean header, boolean overwriteFormulaCells, String worksheetScope) {
+ Sheet sheet = workbook.getSheet(getName(name, worksheetScope).getSheetName());
// top, left, bottom, right
- int[] coord = getReferenceCoordinates(name);
+ int[] coord = getReferenceCoordinatesForName(name, worksheetScope);
writeData(data, sheet, coord[2] + 1, coord[1], header, overwriteFormulaCells);
int bottom = coord[2] + data.rows();
int right = Math.max(coord[1] + data.columns() - 1, coord[3]);
CellRangeAddress cra = new CellRangeAddress(coord[0], bottom, coord[1], right);
String formula = cra.formatAsString(sheet.getSheetName(), true);
- createName(name, formula, true);
+ createName(name, formula, true, worksheetScope);
}
+
public void appendWorksheet(DataFrame data, int worksheetIndex, boolean header) {
Sheet sheet = getSheet(worksheetIndex);
int lastRow = getLastRow(worksheetIndex);
@@ -1451,10 +1534,10 @@ public void clearRangeFromReference(String reference) {
clearRange(sheetName, coords);
}
- public void clearNamedRegion(String name) {
- String sheetName = getName(name).getSheetName();
- int[] coords = getReferenceCoordinates(name);
- clearRange(sheetName, coords);
+ public void clearNamedRegion(String name, String worksheetScope) {
+ String dataSourceSheetName = getName(name, worksheetScope).getSheetName();
+ int[] coords = getReferenceCoordinatesForName(name, worksheetScope);
+ clearRange(dataSourceSheetName, coords);
}
public void createFreezePane(int sheetIndex, int colSplit, int rowSplit, int leftColumn, int topRow) {
diff --git a/src/main/java/com/miraisolutions/xlconnect/integration/r/RWorkbookWrapper.java b/src/main/java/com/miraisolutions/xlconnect/integration/r/RWorkbookWrapper.java
index c13ad26..c7c0fbe 100644
--- a/src/main/java/com/miraisolutions/xlconnect/integration/r/RWorkbookWrapper.java
+++ b/src/main/java/com/miraisolutions/xlconnect/integration/r/RWorkbookWrapper.java
@@ -20,10 +20,7 @@
package com.miraisolutions.xlconnect.integration.r;
-import com.miraisolutions.xlconnect.CellStyle;
-import com.miraisolutions.xlconnect.ErrorBehavior;
-import com.miraisolutions.xlconnect.StyleAction;
-import com.miraisolutions.xlconnect.Workbook;
+import com.miraisolutions.xlconnect.*;
import com.miraisolutions.xlconnect.data.DataFrame;
import com.miraisolutions.xlconnect.data.DataType;
import com.miraisolutions.xlconnect.data.ReadStrategy;
@@ -59,24 +56,24 @@ public void setSheetPos(String sheetName, int pos) {
workbook.setSheetPos(sheetName, pos);
}
- public String[] getDefinedNames(boolean validOnly) {
- return workbook.getDefinedNames(validOnly);
+ public String[] getDefinedNames(boolean validOnly, String worksheetScope) {
+ return workbook.getDefinedNames(validOnly, worksheetScope);
}
public void createSheet(String name) {
workbook.createSheet(name);
}
- public void createName(String name, String formula, boolean overwrite) {
- workbook.createName(name, formula, overwrite);
+ public void createName(String name, String formula, boolean overwrite, String worksheetScope) {
+ workbook.createName(name, formula, overwrite, worksheetScope);
}
- public void removeName(String name) {
- workbook.removeName(name);
+ public void removeName(String name, String worksheetScope) {
+ workbook.removeName(name, worksheetScope);
}
- public String getReferenceFormula(String name) {
- return workbook.getReferenceFormula(name);
+ public String getReferenceFormula(String name, String worksheetScope) {
+ return workbook.getReferenceFormula(name, worksheetScope);
}
public void removeSheet(String name) {
@@ -103,8 +100,8 @@ public void cloneSheet(String name, String newName) {
workbook.cloneSheet(name, newName);
}
- public void writeNamedRegion(RDataFrameWrapper dataFrame, String name, boolean header, boolean overwriteFormulaCells) {
- workbook.writeNamedRegion(dataFrame.dataFrame, name, header, overwriteFormulaCells);
+ public void writeNamedRegion(RDataFrameWrapper dataFrame, String name, boolean header, boolean overwriteFormulaCells, String worksheetScope) {
+ workbook.writeNamedRegion(dataFrame.dataFrame, name, header, overwriteFormulaCells, worksheetScope);
}
private static DataType[] dataTypeFromString(String[] colTypes) {
@@ -117,12 +114,12 @@ private static DataType[] dataTypeFromString(String[] colTypes) {
return ctypes;
}
- public RDataFrameWrapper readNamedRegion(String name, boolean header, String[] colTypes,
+ public RDataFrameWithAttributes readNamedRegion(String name, boolean header, String[] colTypes,
boolean forceConversion, String dateTimeFormat, boolean takeCached, int[] subset,
- String readStrategy) {
- DataFrame dataFrame = workbook.readNamedRegion(name, header, ReadStrategy.valueOf(readStrategy.toUpperCase()),
- dataTypeFromString(colTypes), forceConversion, dateTimeFormat, takeCached, subset);
- return new RDataFrameWrapper(dataFrame);
+ String readStrategy, String worksheetScope) {
+ DataFrameWithAttributes dataFrame = workbook.readNamedRegion(name, header, dataTypeFromString(colTypes), forceConversion,
+ dateTimeFormat, takeCached, subset, ReadStrategy.valueOf(readStrategy.toUpperCase()), worksheetScope);
+ return new RDataFrameWithAttributes(dataFrame.getAttributes(), new RDataFrameWrapper(dataFrame.getValue()));
}
public RDataFrameWrapper readTable(int worksheetIndex, String tableName, boolean header, String[] colTypes,
@@ -139,8 +136,8 @@ public RDataFrameWrapper readTable(String worksheetName, String tableName, boole
return new RDataFrameWrapper(dataFrame);
}
- public boolean existsName(String name) {
- return workbook.existsName(name);
+ public BooleanWithAttributes existsName(String name, String worksheetScope) {
+ return workbook.existsName(name, worksheetScope);
}
public boolean existsSheet(String name) {
@@ -229,9 +226,9 @@ public boolean isSheetVeryHidden(String sheetName) {
return workbook.isSheetVeryHidden(sheetName);
}
- public void addImage(String filename, String name, boolean originalSize)
+ public void addImage(String filename, String name, boolean originalSize, String worksheetScope)
throws IOException {
- workbook.addImage(filename, name, originalSize);
+ workbook.addImage(filename, name, originalSize, worksheetScope);
}
public RCellStyleWrapper createCellStyle(String name) {
@@ -413,8 +410,8 @@ public int[] getReferenceCoordinates(String name) {
return workbook.getReferenceCoordinates(name);
}
- public int[] getReferenceCoordinatesForName(String name) {
- return workbook.getReferenceCoordinatesForName(name);
+ public int[] getReferenceCoordinatesForName(String name, String worksheetScope) {
+ return workbook.getReferenceCoordinatesForName(name, worksheetScope);
}
public int[] getReferenceCoordinatesForTable(int sheetIndex, String tableName) {
@@ -466,8 +463,8 @@ public int getLastColumn(String sheetName) {
}
- public void appendNamedRegion(RDataFrameWrapper data, String name, boolean header, boolean overwriteFormulaCells) {
- workbook.appendNamedRegion(data.dataFrame, name, header, overwriteFormulaCells);
+ public void appendNamedRegion(RDataFrameWrapper data, String name, boolean header, boolean overwriteFormulaCells, String worksheetScope) {
+ workbook.appendNamedRegion(data.dataFrame, name, header, overwriteFormulaCells, worksheetScope);
}
public void appendWorksheet(RDataFrameWrapper data, int worksheetIndex, boolean header) {
@@ -498,8 +495,8 @@ public void clearRangeFromReference(String reference) {
workbook.clearRangeFromReference(reference);
}
- public void clearNamedRegion(String name) {
- workbook.clearNamedRegion(name);
+ public void clearNamedRegion(String name, String worksheetScope) {
+ workbook.clearNamedRegion(name, worksheetScope);
}
public void createFreezePane(int sheetIndex, int colSplit, int rowSplit, int leftColumn, int topRow) {
diff --git a/src/test/java/com/miraisolutions/xlconnect/BooleanWithAttributesTest.java b/src/test/java/com/miraisolutions/xlconnect/BooleanWithAttributesTest.java
new file mode 100644
index 0000000..c9d3f35
--- /dev/null
+++ b/src/test/java/com/miraisolutions/xlconnect/BooleanWithAttributesTest.java
@@ -0,0 +1,16 @@
+package com.miraisolutions.xlconnect;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class BooleanWithAttributesTest {
+
+ @Test
+ public void getTrueValue() {
+ BooleanWithAttributes underTest = new BooleanWithAttributes(Attribute.WORKSHEET_SCOPE, "bla", true);
+ assert underTest.getValue();
+ assertEquals(1, underTest.getAttributeNames().length);
+ }
+}
\ No newline at end of file