mirror of
https://github.com/apache/poi.git
synced 2025-02-08 11:04:53 +00:00
bug 58348: add hyperlink copying and merging to CellCopyPolicy
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1711926 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
4a727300a7
commit
c8d5a37017
@ -21,23 +21,37 @@ import org.apache.poi.util.Beta;
|
|||||||
|
|
||||||
@Beta
|
@Beta
|
||||||
public class CellCopyPolicy implements Cloneable {
|
public class CellCopyPolicy implements Cloneable {
|
||||||
|
// cell-level policies
|
||||||
public static final boolean DEFAULT_COPY_CELL_VALUE_POLICY = true;
|
public static final boolean DEFAULT_COPY_CELL_VALUE_POLICY = true;
|
||||||
public static final boolean DEFAULT_COPY_CELL_STYLE_POLICY = true;
|
public static final boolean DEFAULT_COPY_CELL_STYLE_POLICY = true;
|
||||||
public static final boolean DEFAULT_COPY_CELL_FORMULA_POLICY = true;
|
public static final boolean DEFAULT_COPY_CELL_FORMULA_POLICY = true;
|
||||||
public static final boolean DEFAULT_COPY_MERGED_REGIONS_POLICY = true;
|
public static final boolean DEFAULT_COPY_HYPERLINK_POLICY = true;
|
||||||
|
public static final boolean DEFAULT_MERGE_HYPERLINK_POLICY = false;
|
||||||
|
|
||||||
|
// row-level policies
|
||||||
public static final boolean DEFAULT_COPY_ROW_HEIGHT_POLICY = true;
|
public static final boolean DEFAULT_COPY_ROW_HEIGHT_POLICY = true;
|
||||||
public static final boolean DEFAULT_CONDENSE_ROWS_POLICY = false;
|
public static final boolean DEFAULT_CONDENSE_ROWS_POLICY = false;
|
||||||
|
|
||||||
|
// sheet-level policies
|
||||||
|
public static final boolean DEFAULT_COPY_MERGED_REGIONS_POLICY = true;
|
||||||
|
|
||||||
|
// cell-level policies
|
||||||
private boolean copyCellValue = DEFAULT_COPY_CELL_VALUE_POLICY;
|
private boolean copyCellValue = DEFAULT_COPY_CELL_VALUE_POLICY;
|
||||||
private boolean copyCellStyle = DEFAULT_COPY_CELL_STYLE_POLICY;
|
private boolean copyCellStyle = DEFAULT_COPY_CELL_STYLE_POLICY;
|
||||||
private boolean copyCellFormula = DEFAULT_COPY_CELL_FORMULA_POLICY;
|
private boolean copyCellFormula = DEFAULT_COPY_CELL_FORMULA_POLICY;
|
||||||
private boolean copyMergedRegions = DEFAULT_COPY_MERGED_REGIONS_POLICY;
|
private boolean copyHyperlink = DEFAULT_COPY_HYPERLINK_POLICY;
|
||||||
|
private boolean mergeHyperlink = DEFAULT_MERGE_HYPERLINK_POLICY;
|
||||||
|
|
||||||
|
// row-level policies
|
||||||
private boolean copyRowHeight = DEFAULT_COPY_ROW_HEIGHT_POLICY;
|
private boolean copyRowHeight = DEFAULT_COPY_ROW_HEIGHT_POLICY;
|
||||||
private boolean condenseRows = DEFAULT_CONDENSE_ROWS_POLICY;
|
private boolean condenseRows = DEFAULT_CONDENSE_ROWS_POLICY;
|
||||||
|
|
||||||
|
// sheet-level policies
|
||||||
|
private boolean copyMergedRegions = DEFAULT_COPY_MERGED_REGIONS_POLICY;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default CellCopyPolicy, uses default policy
|
* Default CellCopyPolicy, uses default policy
|
||||||
* For custom CellCopyPolicy, use {@link #Builder} class
|
* For custom CellCopyPolicy, use {@link Builder} class
|
||||||
*/
|
*/
|
||||||
public CellCopyPolicy() { }
|
public CellCopyPolicy() { }
|
||||||
|
|
||||||
@ -48,25 +62,37 @@ public class CellCopyPolicy implements Cloneable {
|
|||||||
copyCellValue = builder.copyCellValue;
|
copyCellValue = builder.copyCellValue;
|
||||||
copyCellStyle = builder.copyCellStyle;
|
copyCellStyle = builder.copyCellStyle;
|
||||||
copyCellFormula = builder.copyCellFormula;
|
copyCellFormula = builder.copyCellFormula;
|
||||||
copyMergedRegions = builder.copyMergedRegions;
|
copyHyperlink = builder.copyHyperlink;
|
||||||
|
mergeHyperlink = builder.mergeHyperlink;
|
||||||
|
|
||||||
copyRowHeight = builder.copyRowHeight;
|
copyRowHeight = builder.copyRowHeight;
|
||||||
condenseRows = builder.condenseRows;
|
condenseRows = builder.condenseRows;
|
||||||
|
|
||||||
|
copyMergedRegions = builder.copyMergedRegions;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Builder {
|
public static class Builder {
|
||||||
|
// cell-level policies
|
||||||
private boolean copyCellValue = DEFAULT_COPY_CELL_VALUE_POLICY;
|
private boolean copyCellValue = DEFAULT_COPY_CELL_VALUE_POLICY;
|
||||||
private boolean copyCellStyle = DEFAULT_COPY_CELL_STYLE_POLICY;
|
private boolean copyCellStyle = DEFAULT_COPY_CELL_STYLE_POLICY;
|
||||||
private boolean copyCellFormula = DEFAULT_COPY_CELL_FORMULA_POLICY;
|
private boolean copyCellFormula = DEFAULT_COPY_CELL_FORMULA_POLICY;
|
||||||
private boolean copyMergedRegions = DEFAULT_COPY_MERGED_REGIONS_POLICY;
|
private boolean copyHyperlink = DEFAULT_COPY_HYPERLINK_POLICY;
|
||||||
|
private boolean mergeHyperlink = DEFAULT_MERGE_HYPERLINK_POLICY;
|
||||||
|
|
||||||
|
// row-level policies
|
||||||
private boolean copyRowHeight = DEFAULT_COPY_ROW_HEIGHT_POLICY;
|
private boolean copyRowHeight = DEFAULT_COPY_ROW_HEIGHT_POLICY;
|
||||||
private boolean condenseRows = DEFAULT_CONDENSE_ROWS_POLICY;
|
private boolean condenseRows = DEFAULT_CONDENSE_ROWS_POLICY;
|
||||||
|
|
||||||
|
// sheet-level policies
|
||||||
|
private boolean copyMergedRegions = DEFAULT_COPY_MERGED_REGIONS_POLICY;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Builder class for CellCopyPolicy
|
* Builder class for CellCopyPolicy
|
||||||
*/
|
*/
|
||||||
public Builder() {
|
public Builder() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// cell-level policies
|
||||||
public Builder cellValue(boolean copyCellValue) {
|
public Builder cellValue(boolean copyCellValue) {
|
||||||
this.copyCellValue = copyCellValue;
|
this.copyCellValue = copyCellValue;
|
||||||
return this;
|
return this;
|
||||||
@ -79,10 +105,16 @@ public class CellCopyPolicy implements Cloneable {
|
|||||||
this.copyCellFormula = copyCellFormula;
|
this.copyCellFormula = copyCellFormula;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
public Builder mergedRegions(boolean copyMergedRegions) {
|
public Builder copyHyperlink(boolean copyHyperlink) {
|
||||||
this.copyMergedRegions = copyMergedRegions;
|
this.copyHyperlink = copyHyperlink;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
public Builder mergeHyperlink(boolean mergeHyperlink) {
|
||||||
|
this.mergeHyperlink = mergeHyperlink;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// row-level policies
|
||||||
public Builder rowHeight(boolean copyRowHeight) {
|
public Builder rowHeight(boolean copyRowHeight) {
|
||||||
this.copyRowHeight = copyRowHeight;
|
this.copyRowHeight = copyRowHeight;
|
||||||
return this;
|
return this;
|
||||||
@ -91,6 +123,12 @@ public class CellCopyPolicy implements Cloneable {
|
|||||||
this.condenseRows = condenseRows;
|
this.condenseRows = condenseRows;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sheet-level policies
|
||||||
|
public Builder mergedRegions(boolean copyMergedRegions) {
|
||||||
|
this.copyMergedRegions = copyMergedRegions;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
public CellCopyPolicy build() {
|
public CellCopyPolicy build() {
|
||||||
return new CellCopyPolicy(this);
|
return new CellCopyPolicy(this);
|
||||||
}
|
}
|
||||||
@ -101,9 +139,11 @@ public class CellCopyPolicy implements Cloneable {
|
|||||||
.cellValue(copyCellValue)
|
.cellValue(copyCellValue)
|
||||||
.cellStyle(copyCellStyle)
|
.cellStyle(copyCellStyle)
|
||||||
.cellFormula(copyCellFormula)
|
.cellFormula(copyCellFormula)
|
||||||
.mergedRegions(copyMergedRegions)
|
.copyHyperlink(copyHyperlink)
|
||||||
|
.mergeHyperlink(mergeHyperlink)
|
||||||
.rowHeight(copyRowHeight)
|
.rowHeight(copyRowHeight)
|
||||||
.condenseRows(condenseRows);
|
.condenseRows(condenseRows)
|
||||||
|
.mergedRegions(copyMergedRegions);
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,7 +151,10 @@ public class CellCopyPolicy implements Cloneable {
|
|||||||
public CellCopyPolicy clone() {
|
public CellCopyPolicy clone() {
|
||||||
return createBuilder().build();
|
return createBuilder().build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Cell-level policies
|
||||||
|
*/
|
||||||
/**
|
/**
|
||||||
* @return the copyCellValue
|
* @return the copyCellValue
|
||||||
*/
|
*/
|
||||||
@ -153,21 +196,38 @@ public class CellCopyPolicy implements Cloneable {
|
|||||||
public void setCopyCellFormula(boolean copyCellFormula) {
|
public void setCopyCellFormula(boolean copyCellFormula) {
|
||||||
this.copyCellFormula = copyCellFormula;
|
this.copyCellFormula = copyCellFormula;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the copyMergedRegions
|
* @return the copyHyperlink
|
||||||
*/
|
*/
|
||||||
public boolean isCopyMergedRegions() {
|
public boolean isCopyHyperlink() {
|
||||||
return copyMergedRegions;
|
return copyHyperlink;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param copyMergedRegions the copyMergedRegions to set
|
* @param copyHyperlink the copyHyperlink to set
|
||||||
*/
|
*/
|
||||||
public void setCopyMergedRegions(boolean copyMergedRegions) {
|
public void setCopyHyperlink(boolean copyHyperlink) {
|
||||||
this.copyMergedRegions = copyMergedRegions;
|
this.copyHyperlink = copyHyperlink;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the mergeHyperlink
|
||||||
|
*/
|
||||||
|
public boolean isMergeHyperlink() {
|
||||||
|
return mergeHyperlink;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mergeHyperlink the mergeHyperlink to set
|
||||||
|
*/
|
||||||
|
public void setMergeHyperlink(boolean mergeHyperlink) {
|
||||||
|
this.mergeHyperlink = mergeHyperlink;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Row-level policies
|
||||||
|
*/
|
||||||
/**
|
/**
|
||||||
* @return the copyRowHeight
|
* @return the copyRowHeight
|
||||||
*/
|
*/
|
||||||
@ -199,5 +259,23 @@ public class CellCopyPolicy implements Cloneable {
|
|||||||
public void setCondenseRows(boolean condenseRows) {
|
public void setCondenseRows(boolean condenseRows) {
|
||||||
this.condenseRows = condenseRows;
|
this.condenseRows = condenseRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sheet-level policies
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @return the copyMergedRegions
|
||||||
|
*/
|
||||||
|
public boolean isCopyMergedRegions() {
|
||||||
|
return copyMergedRegions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param copyMergedRegions the copyMergedRegions to set
|
||||||
|
*/
|
||||||
|
public void setCopyMergedRegions(boolean copyMergedRegions) {
|
||||||
|
this.copyMergedRegions = copyMergedRegions;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -180,6 +180,25 @@ public final class XSSFCell implements Cell {
|
|||||||
setCellStyle(null);
|
setCellStyle(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (policy.isMergeHyperlink()) {
|
||||||
|
// if srcCell doesn't have a hyperlink and destCell has a hyperlink, don't clear destCell's hyperlink
|
||||||
|
final Hyperlink srcHyperlink = srcCell.getHyperlink();
|
||||||
|
if (srcHyperlink != null) {
|
||||||
|
setHyperlink(srcHyperlink.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (policy.isCopyHyperlink()) {
|
||||||
|
// overwrite the hyperlink at dest cell with srcCell's hyperlink
|
||||||
|
// if srcCell doesn't have a hyperlink, clear the hyperlink (if one exists) at destCell
|
||||||
|
final Hyperlink srcHyperlink = srcCell.getHyperlink();
|
||||||
|
if (srcHyperlink == null) {
|
||||||
|
setHyperlink(null);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
setHyperlink(srcHyperlink.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -21,9 +21,11 @@ import static org.junit.Assert.assertEquals;
|
|||||||
import static org.junit.Assert.assertNotEquals;
|
import static org.junit.Assert.assertNotEquals;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
|
import static org.junit.Assert.assertSame;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.poi.hssf.HSSFITestDataProvider;
|
import org.apache.poi.hssf.HSSFITestDataProvider;
|
||||||
import org.apache.poi.ss.SpreadsheetVersion;
|
import org.apache.poi.ss.SpreadsheetVersion;
|
||||||
@ -31,7 +33,11 @@ import org.apache.poi.ss.usermodel.BaseTestXCell;
|
|||||||
import org.apache.poi.ss.usermodel.Cell;
|
import org.apache.poi.ss.usermodel.Cell;
|
||||||
import org.apache.poi.ss.usermodel.CellCopyPolicy;
|
import org.apache.poi.ss.usermodel.CellCopyPolicy;
|
||||||
import org.apache.poi.ss.usermodel.CellStyle;
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
import org.apache.poi.ss.usermodel.CreationHelper;
|
||||||
import org.apache.poi.ss.usermodel.DataFormatter;
|
import org.apache.poi.ss.usermodel.DataFormatter;
|
||||||
|
import org.apache.poi.ss.usermodel.Font;
|
||||||
|
import org.apache.poi.ss.usermodel.Hyperlink;
|
||||||
|
import org.apache.poi.ss.usermodel.IndexedColors;
|
||||||
import org.apache.poi.ss.usermodel.RichTextString;
|
import org.apache.poi.ss.usermodel.RichTextString;
|
||||||
import org.apache.poi.ss.usermodel.Row;
|
import org.apache.poi.ss.usermodel.Row;
|
||||||
import org.apache.poi.ss.usermodel.Sheet;
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
@ -521,7 +527,6 @@ public final class TestXSSFCell extends BaseTestXCell {
|
|||||||
final CellCopyPolicy policy = new CellCopyPolicy.Builder().cellFormula(false).build();
|
final CellCopyPolicy policy = new CellCopyPolicy.Builder().cellFormula(false).build();
|
||||||
destCell.copyCellFrom(srcCell, policy);
|
destCell.copyCellFrom(srcCell, policy);
|
||||||
assertEquals(Cell.CELL_TYPE_NUMERIC, destCell.getCellType());
|
assertEquals(Cell.CELL_TYPE_NUMERIC, destCell.getCellType());
|
||||||
System.out.println("ERROR: fix formula evaluation");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -540,6 +545,95 @@ public final class TestXSSFCell extends BaseTestXCell {
|
|||||||
assertEquals(true, destCell.getBooleanCellValue());
|
assertEquals(true, destCell.getBooleanCellValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public final void testCopyCellFrom_CellCopyPolicy_copyHyperlink() throws IOException {
|
||||||
|
setUp_testCopyCellFrom_CellCopyPolicy();
|
||||||
|
final Workbook wb = srcCell.getSheet().getWorkbook();
|
||||||
|
final CreationHelper createHelper = wb.getCreationHelper();
|
||||||
|
|
||||||
|
srcCell.setCellValue("URL LINK");
|
||||||
|
Hyperlink link = createHelper.createHyperlink(Hyperlink.LINK_URL);
|
||||||
|
link.setAddress("http://poi.apache.org/");
|
||||||
|
srcCell.setHyperlink(link);
|
||||||
|
|
||||||
|
// Set link cell style (optional)
|
||||||
|
CellStyle hlinkStyle = wb.createCellStyle();
|
||||||
|
Font hlinkFont = wb.createFont();
|
||||||
|
hlinkFont.setUnderline(Font.U_SINGLE);
|
||||||
|
hlinkFont.setColor(IndexedColors.BLUE.getIndex());
|
||||||
|
hlinkStyle.setFont(hlinkFont);
|
||||||
|
srcCell.setCellStyle(hlinkStyle);
|
||||||
|
|
||||||
|
// Copy hyperlink
|
||||||
|
final CellCopyPolicy policy = new CellCopyPolicy.Builder().copyHyperlink(true).mergeHyperlink(false).build();
|
||||||
|
destCell.copyCellFrom(srcCell, policy);
|
||||||
|
assertNotNull(destCell.getHyperlink());
|
||||||
|
|
||||||
|
assertSame("unit test assumes srcCell and destCell are on the same sheet",
|
||||||
|
srcCell.getSheet(), destCell.getSheet());
|
||||||
|
|
||||||
|
final List<XSSFHyperlink> links = srcCell.getSheet().getHyperlinkList();
|
||||||
|
assertEquals("number of hyperlinks on sheet", 2, links.size());
|
||||||
|
assertEquals("source hyperlink",
|
||||||
|
new CellReference(srcCell).formatAsString(), links.get(0).getCellRef());
|
||||||
|
assertEquals("destination hyperlink",
|
||||||
|
new CellReference(destCell).formatAsString(), links.get(1).getCellRef());
|
||||||
|
|
||||||
|
wb.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public final void testCopyCellFrom_CellCopyPolicy_mergeHyperlink() throws IOException {
|
||||||
|
setUp_testCopyCellFrom_CellCopyPolicy();
|
||||||
|
final Workbook wb = srcCell.getSheet().getWorkbook();
|
||||||
|
final CreationHelper createHelper = wb.getCreationHelper();
|
||||||
|
|
||||||
|
srcCell.setCellValue("URL LINK");
|
||||||
|
Hyperlink link = createHelper.createHyperlink(Hyperlink.LINK_URL);
|
||||||
|
link.setAddress("http://poi.apache.org/");
|
||||||
|
destCell.setHyperlink(link);
|
||||||
|
|
||||||
|
// Set link cell style (optional)
|
||||||
|
CellStyle hlinkStyle = wb.createCellStyle();
|
||||||
|
Font hlinkFont = wb.createFont();
|
||||||
|
hlinkFont.setUnderline(Font.U_SINGLE);
|
||||||
|
hlinkFont.setColor(IndexedColors.BLUE.getIndex());
|
||||||
|
hlinkStyle.setFont(hlinkFont);
|
||||||
|
destCell.setCellStyle(hlinkStyle);
|
||||||
|
|
||||||
|
// Pre-condition assumptions. This test is broken if either of these fail.
|
||||||
|
assertSame("unit test assumes srcCell and destCell are on the same sheet",
|
||||||
|
srcCell.getSheet(), destCell.getSheet());
|
||||||
|
assertNull(srcCell.getHyperlink());
|
||||||
|
|
||||||
|
// Merge hyperlink - since srcCell doesn't have a hyperlink, destCell's hyperlink is not overwritten (cleared).
|
||||||
|
final CellCopyPolicy policy = new CellCopyPolicy.Builder().mergeHyperlink(true).copyHyperlink(false).build();
|
||||||
|
destCell.copyCellFrom(srcCell, policy);
|
||||||
|
assertNull(srcCell.getHyperlink());
|
||||||
|
assertNotNull(destCell.getHyperlink());
|
||||||
|
assertSame(link, destCell.getHyperlink());
|
||||||
|
|
||||||
|
List<XSSFHyperlink> links;
|
||||||
|
links = srcCell.getSheet().getHyperlinkList();
|
||||||
|
assertEquals("number of hyperlinks on sheet", 1, links.size());
|
||||||
|
assertEquals("source hyperlink",
|
||||||
|
new CellReference(destCell).formatAsString(), links.get(0).getCellRef());
|
||||||
|
|
||||||
|
// Merge destCell's hyperlink to srcCell. Since destCell does have a hyperlink, this should copy destCell's hyperlink to srcCell.
|
||||||
|
srcCell.copyCellFrom(destCell, policy);
|
||||||
|
assertNotNull(srcCell.getHyperlink());
|
||||||
|
assertNotNull(destCell.getHyperlink());
|
||||||
|
|
||||||
|
links = srcCell.getSheet().getHyperlinkList();
|
||||||
|
assertEquals("number of hyperlinks on sheet", 2, links.size());
|
||||||
|
assertEquals("dest hyperlink",
|
||||||
|
new CellReference(destCell).formatAsString(), links.get(0).getCellRef());
|
||||||
|
assertEquals("source hyperlink",
|
||||||
|
new CellReference(srcCell).formatAsString(), links.get(1).getCellRef());
|
||||||
|
|
||||||
|
wb.close();
|
||||||
|
}
|
||||||
|
|
||||||
private final void setUp_testCopyCellFrom_CellCopyPolicy() {
|
private final void setUp_testCopyCellFrom_CellCopyPolicy() {
|
||||||
@SuppressWarnings("resource")
|
@SuppressWarnings("resource")
|
||||||
final XSSFWorkbook wb = new XSSFWorkbook();
|
final XSSFWorkbook wb = new XSSFWorkbook();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user