From 3d19a1962e35d37dfd74405d2e3a1f628853a29e Mon Sep 17 00:00:00 2001 From: Jiaju Zhuang Date: Wed, 15 Sep 2021 23:16:50 +0800 Subject: [PATCH] =?UTF-8?q?*=20=E6=96=B0=E5=A2=9E=E5=A4=B4=E7=9A=84?= =?UTF-8?q?=E9=9D=9E=E7=A9=BA=E6=A0=A1=E9=AA=8C=20[Issue=20#1765]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/alibaba/excel/metadata/Head.java | 11 +- .../com/alibaba/excel/util/StringUtils.java | 97 +++++++++++++++++- .../property/ExcelWriteHeadProperty.java | 2 +- .../test/demo/Test1765/Data1765.xlsx | Bin 3687 -> 0 bytes .../test/demo/Test1765/Issue1765.java | 55 ---------- 5 files changed, 104 insertions(+), 61 deletions(-) delete mode 100644 src/test/java/com/alibaba/easyexcel/test/demo/Test1765/Data1765.xlsx delete mode 100644 src/test/java/com/alibaba/easyexcel/test/demo/Test1765/Issue1765.java diff --git a/src/main/java/com/alibaba/excel/metadata/Head.java b/src/main/java/com/alibaba/excel/metadata/Head.java index c578cbbc..c150fe02 100644 --- a/src/main/java/com/alibaba/excel/metadata/Head.java +++ b/src/main/java/com/alibaba/excel/metadata/Head.java @@ -3,6 +3,7 @@ package com.alibaba.excel.metadata; import java.util.ArrayList; import java.util.List; +import com.alibaba.excel.exception.ExcelGenerateException; import com.alibaba.excel.metadata.property.ColumnWidthProperty; import com.alibaba.excel.metadata.property.FontProperty; import com.alibaba.excel.metadata.property.LoopMergeProperty; @@ -64,9 +65,15 @@ public class Head { this.columnIndex = columnIndex; this.fieldName = fieldName; if (headNameList == null) { - headNameList = new ArrayList(); + this.headNameList = new ArrayList<>(); + } else { + this.headNameList = headNameList; + for (String headName : headNameList) { + if (headName == null) { + throw new ExcelGenerateException("head name can not be null."); + } + } } - this.headNameList = headNameList; this.forceIndex = forceIndex; this.forceName = forceName; } diff --git a/src/main/java/com/alibaba/excel/util/StringUtils.java b/src/main/java/com/alibaba/excel/util/StringUtils.java index 667233dc..cb6e7227 100644 --- a/src/main/java/com/alibaba/excel/util/StringUtils.java +++ b/src/main/java/com/alibaba/excel/util/StringUtils.java @@ -69,7 +69,6 @@ public class StringUtils { return true; } - /** *

Checks if a CharSequence is not empty (""), not null and not whitespace only.

* @@ -83,9 +82,9 @@ public class StringUtils { * StringUtils.isNotBlank(" bob ") = true * * - * @param cs the CharSequence to check, may be null + * @param cs the CharSequence to check, may be null * @return {@code true} if the CharSequence is - * not empty and not null and not whitespace only + * not empty and not null and not whitespace only * @since 2.0 * @since 3.0 Changed signature from isNotBlank(String) to isNotBlank(CharSequence) */ @@ -93,5 +92,97 @@ public class StringUtils { return !isBlank(cs); } + /** + *

Compares two CharSequences, returning {@code true} if they represent + * equal sequences of characters.

+ * + *

{@code null}s are handled without exceptions. Two {@code null} + * references are considered to be equal. The comparison is case sensitive.

+ * + *
+     * StringUtils.equals(null, null)   = true
+     * StringUtils.equals(null, "abc")  = false
+     * StringUtils.equals("abc", null)  = false
+     * StringUtils.equals("abc", "abc") = true
+     * StringUtils.equals("abc", "ABC") = false
+     * 
+ * + * @param cs1 the first CharSequence, may be {@code null} + * @param cs2 the second CharSequence, may be {@code null} + * @return {@code true} if the CharSequences are equal (case-sensitive), or both {@code null} + * @see Object#equals(Object) + * @since 3.0 Changed signature from equals(String, String) to equals(CharSequence, CharSequence) + */ + public static boolean equals(final CharSequence cs1, final CharSequence cs2) { + if (cs1 == cs2) { + return true; + } + if (cs1 == null || cs2 == null) { + return false; + } + if (cs1.length() != cs2.length()) { + return false; + } + if (cs1 instanceof String && cs2 instanceof String) { + return cs1.equals(cs2); + } + return regionMatches(cs1, false, 0, cs2, 0, cs1.length()); + } + + /** + * Green implementation of regionMatches. + * + * @param cs the {@code CharSequence} to be processed + * @param ignoreCase whether or not to be case insensitive + * @param thisStart the index to start on the {@code cs} CharSequence + * @param substring the {@code CharSequence} to be looked for + * @param start the index to start on the {@code substring} CharSequence + * @param length character length of the region + * @return whether the region matched + */ + public static boolean regionMatches(final CharSequence cs, final boolean ignoreCase, final int thisStart, + final CharSequence substring, final int start, final int length) { + if (cs instanceof String && substring instanceof String) { + return ((String)cs).regionMatches(ignoreCase, thisStart, (String)substring, start, length); + } + int index1 = thisStart; + int index2 = start; + int tmpLen = length; + + // Extract these first so we detect NPEs the same as the java.lang.String version + final int srcLen = cs.length() - thisStart; + final int otherLen = substring.length() - start; + + // Check for invalid parameters + if (thisStart < 0 || start < 0 || length < 0) { + return false; + } + + // Check that the regions are long enough + if (srcLen < length || otherLen < length) { + return false; + } + + while (tmpLen-- > 0) { + final char c1 = cs.charAt(index1++); + final char c2 = substring.charAt(index2++); + + if (c1 == c2) { + continue; + } + + if (!ignoreCase) { + return false; + } + + // The same check as in String.regionMatches(): + if (Character.toUpperCase(c1) != Character.toUpperCase(c2) + && Character.toLowerCase(c1) != Character.toLowerCase(c2)) { + return false; + } + } + + return true; + } } diff --git a/src/main/java/com/alibaba/excel/write/property/ExcelWriteHeadProperty.java b/src/main/java/com/alibaba/excel/write/property/ExcelWriteHeadProperty.java index dc5275f8..c2779136 100644 --- a/src/main/java/com/alibaba/excel/write/property/ExcelWriteHeadProperty.java +++ b/src/main/java/com/alibaba/excel/write/property/ExcelWriteHeadProperty.java @@ -142,7 +142,7 @@ public class ExcelWriteHeadProperty extends ExcelHeadProperty { continue; } alreadyRangeSet.add(i + "-" + j); - String headName = headNameList.get(j) == null ? "" : headNameList.get(j); + String headName = headNameList.get(j); int lastCol = i; int lastRow = j; for (int k = i + 1; k < headList.size(); k++) { diff --git a/src/test/java/com/alibaba/easyexcel/test/demo/Test1765/Data1765.xlsx b/src/test/java/com/alibaba/easyexcel/test/demo/Test1765/Data1765.xlsx deleted file mode 100644 index 3377bb760f7a27ff706a43fda2d77dd6dd323ab7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3687 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 YQ4k|tDk6yh01)v~AuiKNdeX0d0kp*88vp> head() { - List> list = new ArrayList>(); - List head0 = new ArrayList(); - List head1 = new ArrayList(); - List head2 = new ArrayList(); - List head3 = new ArrayList(); - head0.add("表头"); - head1.add("日期"); - head2.add(null); - head3.add("数字"); - list.add(head0); - list.add(head1); - list.add(head2); - list.add(head3); - - return list; - } - - private List> dataList() { - List> list = new ArrayList>(); - for (int i = 0; i < 5; i++) { - List data = new ArrayList(); - data.add("字符串" + i); - data.add(new Date()); - data.add(i * 2); - data.add(i * 3); - list.add(data); - } - return list; - } -}