From 494e313b0c41f2c2492c67a517a871384f4098b6 Mon Sep 17 00:00:00 2001 From: Doria Saric Date: Wed, 10 Feb 2021 10:38:17 +0100 Subject: [PATCH 01/11] fix: localSheetId was always set to 0 instead of assigning the right worksheet index --- .../src/main/java/org/dhatim/fastexcel/Workbook.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Workbook.java b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Workbook.java index 7bfab19f..10987226 100644 --- a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Workbook.java +++ b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Workbook.java @@ -204,6 +204,7 @@ private void writeWorkbookFile() throws IOException { * (if there are any repeating rows or cols in the sheet at all) **/ for (Worksheet ws : worksheets) { + int index = getIndex(ws) -1; String defineName = Stream.of(ws.getRepeatingCols(),ws.getRepeatingRows()) .filter(Objects::nonNull) .map(r -> ws.getName() + "!" + r.toString()) @@ -212,8 +213,8 @@ private void writeWorkbookFile() throws IOException { w.append(""); w.append(""); w.append(defineName); w.append(""); From 4cb3ddaf4ea9d120f1ab6a7fc9cb7ef6c4e90ba7 Mon Sep 17 00:00:00 2001 From: Doria Saric Date: Wed, 10 Feb 2021 10:40:06 +0100 Subject: [PATCH 02/11] new feature: name cell ranges --- .../main/java/org/dhatim/fastexcel/Range.java | 8 +++++++ .../java/org/dhatim/fastexcel/Workbook.java | 22 +++++++++++++++++-- .../java/org/dhatim/fastexcel/Worksheet.java | 11 ++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Range.java b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Range.java index 81c4ff29..9c3195be 100644 --- a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Range.java +++ b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Range.java @@ -215,6 +215,14 @@ public ListDataValidation validateWithList(Range listRange) { return listDataValidation; } + /** + * Specifically define this range by assigning it a name. + * It will be visible in the cell range dropdown menu. + */ + public void setName(String name) { + worksheet.addNamedRange(this, name); + } + /** * Return the set of styles used by the cells in this range. * diff --git a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Workbook.java b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Workbook.java index 10987226..6546edb2 100644 --- a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Workbook.java +++ b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Workbook.java @@ -22,6 +22,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.Map; import java.util.stream.Stream; import java.util.stream.Collectors; import java.util.zip.ZipEntry; @@ -209,8 +210,9 @@ private void writeWorkbookFile() throws IOException { .filter(Objects::nonNull) .map(r -> ws.getName() + "!" + r.toString()) .collect(Collectors.joining(",")); + + w.append(""); if (!defineName.isEmpty()) { - w.append(""); w.append(""); w.append(defineName); w.append(""); - w.append(""); } + /** define specifically named ranges **/ + for (Map.Entry nr : ws.getNamedRanges().entrySet()) { + String rangeName = nr.getKey(); + Range range = nr.getValue(); + w.append("") + .append(ws.getName()) + .append("!") + .append("$" + Range.colToString(range.getLeft()) + "$" + (1 + range.getTop())) + .append(":") + .append("$" + Range.colToString(range.getRight()) + "$" + (1 + range.getBottom())) + .append(""); + } + w.append(""); } w.append(""); }); diff --git a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Worksheet.java b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Worksheet.java index 85b35f9f..0dae2700 100644 --- a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Worksheet.java +++ b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Worksheet.java @@ -204,6 +204,10 @@ public class Worksheet { * Range of row where will be inserted auto filter */ private Range autoFilterRange = null; + /** + * List of named ranges. + */ + private Map namedRanges = new LinkedHashMap(); /** * The set of protection options that are applied on the sheet. @@ -258,6 +262,13 @@ public RepeatColRange getRepeatingCols(){ return repeatingCols; } + /** + * Get a list of named ranges. + */ + public Map getNamedRanges() { + return namedRanges; + } + /** * Get parent workbook. * From 999968d3095d2d0af341fa337951380ebe7b23df Mon Sep 17 00:00:00 2001 From: Doria Saric Date: Wed, 10 Feb 2021 10:41:58 +0100 Subject: [PATCH 03/11] added forgotten function for named ranges functionality --- .../src/main/java/org/dhatim/fastexcel/Worksheet.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Worksheet.java b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Worksheet.java index 0dae2700..7a253136 100644 --- a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Worksheet.java +++ b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Worksheet.java @@ -1220,4 +1220,14 @@ public void header(String text, Position position) { this.header.put(position, "&" + position.getPos() + prepareForXml(text)); } + + /** + * Add the given range to this sheet's + * list of named ranges under the provided name. + * It will be visible when this sheet is open in the + * cell range dropdown menu under the specified name. + */ + public void addNamedRange(Range range, String name) { + this.namedRanges.put(name, range); + } } From e37970506b881d267dd5ec824cb6b54750d96b4a Mon Sep 17 00:00:00 2001 From: Doria Saric Date: Wed, 10 Feb 2021 10:43:25 +0100 Subject: [PATCH 04/11] defined a specific name range that LibreOffice needs to recognize autofilter in a generated XLSX file --- .../src/main/java/org/dhatim/fastexcel/Workbook.java | 12 ++++++++++++ .../main/java/org/dhatim/fastexcel/Worksheet.java | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Workbook.java b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Workbook.java index 6546edb2..195bbc14 100644 --- a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Workbook.java +++ b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Workbook.java @@ -237,6 +237,18 @@ private void writeWorkbookFile() throws IOException { .append("$" + Range.colToString(range.getRight()) + "$" + (1 + range.getBottom())) .append(""); } + Range af = ws.getAutoFilterRange(); + if (af != null) { + w.append(""); + } w.append(""); } w.append(""); diff --git a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Worksheet.java b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Worksheet.java index 7a253136..10f7dcaf 100644 --- a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Worksheet.java +++ b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Worksheet.java @@ -252,6 +252,10 @@ public RepeatRowRange getRepeatingRows(){ return repeatingRows; } + public Range getAutoFilterRange(){ + return autoFilterRange; + } + /** * Get repeating cols defined for the print setup. * From 99df6bb3e33a6e245a406ffd2af6ff0b2643b5f1 Mon Sep 17 00:00:00 2001 From: Doria Saric Date: Wed, 10 Feb 2021 10:46:17 +0100 Subject: [PATCH 05/11] aesthetics: added some comments --- .../src/main/java/org/dhatim/fastexcel/Worksheet.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Worksheet.java b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Worksheet.java index 10f7dcaf..16d4102d 100644 --- a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Worksheet.java +++ b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Worksheet.java @@ -252,6 +252,12 @@ public RepeatRowRange getRepeatingRows(){ return repeatingRows; } + /** + * Get cell range that autofilter is applied to. + * + * @return Range of cells that autofilter is set to + * (null if autofilter is not set). + */ public Range getAutoFilterRange(){ return autoFilterRange; } From 4a26534d1cead82b9fc43fad15a859f34ee8cee5 Mon Sep 17 00:00:00 2001 From: Doria Saric Date: Wed, 10 Feb 2021 10:52:34 +0100 Subject: [PATCH 06/11] fix: in case the sheetname contains a space or any other odd characters the defined named range for LibreOffice autofilter would not have been properly defined --- .../src/main/java/org/dhatim/fastexcel/Workbook.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Workbook.java b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Workbook.java index 195bbc14..a3ff6d7b 100644 --- a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Workbook.java +++ b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/Workbook.java @@ -242,7 +242,9 @@ private void writeWorkbookFile() throws IOException { w.append(""); } /** define specifically named ranges **/ for (Map.Entry nr : ws.getNamedRanges().entrySet()) { String rangeName = nr.getKey(); Range range = nr.getValue(); w.append("") + .append("\" vbProcedure=\"false\">'") .append(ws.getName()) + .append("'") .append("!") .append("$" + Range.colToString(range.getLeft()) + "$" + (1 + range.getTop())) .append(":") @@ -240,7 +240,7 @@ private void writeWorkbookFile() throws IOException { Range af = ws.getAutoFilterRange(); if (af != null) { w.append("