Excel Downlaod Library First commit
This commit is contained in:
BIN
.gradle/5.2.1/executionHistory/executionHistory.bin
Normal file
BIN
.gradle/5.2.1/executionHistory/executionHistory.bin
Normal file
Binary file not shown.
BIN
.gradle/5.2.1/executionHistory/executionHistory.lock
Normal file
BIN
.gradle/5.2.1/executionHistory/executionHistory.lock
Normal file
Binary file not shown.
BIN
.gradle/5.2.1/fileChanges/last-build.bin
Normal file
BIN
.gradle/5.2.1/fileChanges/last-build.bin
Normal file
Binary file not shown.
BIN
.gradle/5.2.1/fileHashes/fileHashes.bin
Normal file
BIN
.gradle/5.2.1/fileHashes/fileHashes.bin
Normal file
Binary file not shown.
BIN
.gradle/5.2.1/fileHashes/fileHashes.lock
Normal file
BIN
.gradle/5.2.1/fileHashes/fileHashes.lock
Normal file
Binary file not shown.
0
.gradle/5.2.1/gc.properties
Normal file
0
.gradle/5.2.1/gc.properties
Normal file
BIN
.gradle/buildOutputCleanup/buildOutputCleanup.lock
Normal file
BIN
.gradle/buildOutputCleanup/buildOutputCleanup.lock
Normal file
Binary file not shown.
2
.gradle/buildOutputCleanup/cache.properties
Normal file
2
.gradle/buildOutputCleanup/cache.properties
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
#Mon Apr 20 16:58:16 KST 2020
|
||||||
|
gradle.version=5.2.1
|
||||||
BIN
.gradle/buildOutputCleanup/outputFiles.bin
Normal file
BIN
.gradle/buildOutputCleanup/outputFiles.bin
Normal file
Binary file not shown.
0
.gradle/vcs-1/gc.properties
Normal file
0
.gradle/vcs-1/gc.properties
Normal file
11
.idea/codeStyles/Project.xml
generated
Normal file
11
.idea/codeStyles/Project.xml
generated
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<component name="ProjectCodeStyleConfiguration">
|
||||||
|
<code_scheme name="Project" version="173">
|
||||||
|
<codeStyleSettings language="JAVA">
|
||||||
|
<option name="RIGHT_MARGIN" value="105" />
|
||||||
|
<option name="WRAP_ON_TYPING" value="1" />
|
||||||
|
<indentOptions>
|
||||||
|
<option name="USE_TAB_CHARACTER" value="true" />
|
||||||
|
</indentOptions>
|
||||||
|
</codeStyleSettings>
|
||||||
|
</code_scheme>
|
||||||
|
</component>
|
||||||
5
.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
5
.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<component name="ProjectCodeStyleConfiguration">
|
||||||
|
<state>
|
||||||
|
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
|
||||||
|
</state>
|
||||||
|
</component>
|
||||||
8
.idea/compiler.xml
generated
Normal file
8
.idea/compiler.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="CompilerConfiguration">
|
||||||
|
<annotationProcessing>
|
||||||
|
<profile default="true" name="Default" enabled="true" />
|
||||||
|
</annotationProcessing>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
19
.idea/gradle.xml
generated
Normal file
19
.idea/gradle.xml
generated
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="GradleSettings">
|
||||||
|
<option name="linkedExternalProjectsSettings">
|
||||||
|
<GradleProjectSettings>
|
||||||
|
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="gradleHome" value="/usr/local/Cellar/gradle/5.5.1/libexec" />
|
||||||
|
<option name="modules">
|
||||||
|
<set>
|
||||||
|
<option value="$PROJECT_DIR$" />
|
||||||
|
</set>
|
||||||
|
</option>
|
||||||
|
<option name="useAutoImport" value="true" />
|
||||||
|
<option name="useQualifiedModuleNames" value="true" />
|
||||||
|
</GradleProjectSettings>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
20
.idea/jarRepositories.xml
generated
Normal file
20
.idea/jarRepositories.xml
generated
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="RemoteRepositoriesConfiguration">
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="central" />
|
||||||
|
<option name="name" value="Maven Central repository" />
|
||||||
|
<option name="url" value="https://repo1.maven.org/maven2" />
|
||||||
|
</remote-repository>
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="jboss.community" />
|
||||||
|
<option name="name" value="JBoss Community repository" />
|
||||||
|
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
|
||||||
|
</remote-repository>
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="MavenRepo" />
|
||||||
|
<option name="name" value="MavenRepo" />
|
||||||
|
<option name="url" value="https://repo.maven.apache.org/maven2/" />
|
||||||
|
</remote-repository>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
7
.idea/misc.xml
generated
Normal file
7
.idea/misc.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||||
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8 (2)" project-jdk-type="JavaSDK">
|
||||||
|
<output url="file://$PROJECT_DIR$/out" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
65
.idea/workspace.xml
generated
Normal file
65
.idea/workspace.xml
generated
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ChangeListManager">
|
||||||
|
<list default="true" id="d4baa9bc-c7e9-478c-8fb3-f56ac2c1dee0" name="Default Changelist" comment="" />
|
||||||
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
|
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||||
|
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||||
|
</component>
|
||||||
|
<component name="DefaultGradleProjectSettings">
|
||||||
|
<option name="isMigrated" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="ExternalProjectsData">
|
||||||
|
<projectState path="$PROJECT_DIR$">
|
||||||
|
<ProjectState />
|
||||||
|
</projectState>
|
||||||
|
</component>
|
||||||
|
<component name="ProjectId" id="1anRgVINiOqlJOrNOfbtP6Dc1Hi" />
|
||||||
|
<component name="ProjectViewState">
|
||||||
|
<option name="hideEmptyMiddlePackages" value="true" />
|
||||||
|
<option name="showExcludedFiles" value="true" />
|
||||||
|
<option name="showLibraryContents" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PropertiesComponent">
|
||||||
|
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
|
||||||
|
<property name="WebServerToolWindowFactoryState" value="false" />
|
||||||
|
<property name="aspect.path.notification.shown" value="true" />
|
||||||
|
<property name="last_opened_file_path" value="$PROJECT_DIR$/src/main/java/com/lannstark" />
|
||||||
|
<property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
|
||||||
|
<property name="nodejs_npm_path_reset_for_default_project" value="true" />
|
||||||
|
<property name="settings.editor.selected.configurable" value="reference.projectsettings.compiler.annotationProcessors" />
|
||||||
|
</component>
|
||||||
|
<component name="RecentsManager">
|
||||||
|
<key name="CopyFile.RECENT_KEYS">
|
||||||
|
<recent name="$PROJECT_DIR$/src/main/java/com/lannstark" />
|
||||||
|
</key>
|
||||||
|
</component>
|
||||||
|
<component name="SvnConfiguration">
|
||||||
|
<configuration />
|
||||||
|
</component>
|
||||||
|
<component name="TaskManager">
|
||||||
|
<task active="true" id="Default" summary="Default task">
|
||||||
|
<changelist id="d4baa9bc-c7e9-478c-8fb3-f56ac2c1dee0" name="Default Changelist" comment="" />
|
||||||
|
<created>1587369482920</created>
|
||||||
|
<option name="number" value="Default" />
|
||||||
|
<option name="presentableId" value="Default" />
|
||||||
|
<updated>1587369482920</updated>
|
||||||
|
<workItem from="1587369484233" duration="893000" />
|
||||||
|
</task>
|
||||||
|
<servers />
|
||||||
|
</component>
|
||||||
|
<component name="TypeScriptGeneratedFilesManager">
|
||||||
|
<option name="version" value="1" />
|
||||||
|
</component>
|
||||||
|
<component name="WindowStateProjectService">
|
||||||
|
<state x="3173" y="664" key="#com.intellij.ide.util.MemberChooser" timestamp="1587370329831">
|
||||||
|
<screen x="1680" y="23" width="3360" height="1867" />
|
||||||
|
</state>
|
||||||
|
<state x="3173" y="664" key="#com.intellij.ide.util.MemberChooser/1680.23.3360.1867/0.23.1680.982@1680.23.3360.1867" timestamp="1587370329831" />
|
||||||
|
<state x="3025" y="607" width="670" height="676" key="search.everywhere.popup" timestamp="1587369745376">
|
||||||
|
<screen x="1680" y="23" width="3360" height="1867" />
|
||||||
|
</state>
|
||||||
|
<state x="3025" y="607" width="670" height="676" key="search.everywhere.popup/1680.23.3360.1867/0.23.1680.982@1680.23.3360.1867" timestamp="1587369745376" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
17
build.gradle
Normal file
17
build.gradle
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
plugins {
|
||||||
|
id 'java'
|
||||||
|
}
|
||||||
|
|
||||||
|
group 'org.example'
|
||||||
|
version '1.0-SNAPSHOT'
|
||||||
|
|
||||||
|
sourceCompatibility = 1.8
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile 'org.apache.poi:poi:4.1.2'
|
||||||
|
compile 'org.apache.poi:poi-ooxml:4.1.2'
|
||||||
|
}
|
||||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
Binary file not shown.
5
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
5
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionPath=wrapper/dists
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-bin.zip
|
||||||
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
zipStorePath=wrapper/dists
|
||||||
172
gradlew
vendored
Executable file
172
gradlew
vendored
Executable file
@@ -0,0 +1,172 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
##
|
||||||
|
## Gradle start up script for UN*X
|
||||||
|
##
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
# Attempt to set APP_HOME
|
||||||
|
# Resolve links: $0 may be a link
|
||||||
|
PRG="$0"
|
||||||
|
# Need this for relative symlinks.
|
||||||
|
while [ -h "$PRG" ] ; do
|
||||||
|
ls=`ls -ld "$PRG"`
|
||||||
|
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||||
|
if expr "$link" : '/.*' > /dev/null; then
|
||||||
|
PRG="$link"
|
||||||
|
else
|
||||||
|
PRG=`dirname "$PRG"`"/$link"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
SAVED="`pwd`"
|
||||||
|
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||||
|
APP_HOME="`pwd -P`"
|
||||||
|
cd "$SAVED" >/dev/null
|
||||||
|
|
||||||
|
APP_NAME="Gradle"
|
||||||
|
APP_BASE_NAME=`basename "$0"`
|
||||||
|
|
||||||
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
DEFAULT_JVM_OPTS='"-Xmx64m"'
|
||||||
|
|
||||||
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
|
MAX_FD="maximum"
|
||||||
|
|
||||||
|
warn () {
|
||||||
|
echo "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
die () {
|
||||||
|
echo
|
||||||
|
echo "$*"
|
||||||
|
echo
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# OS specific support (must be 'true' or 'false').
|
||||||
|
cygwin=false
|
||||||
|
msys=false
|
||||||
|
darwin=false
|
||||||
|
nonstop=false
|
||||||
|
case "`uname`" in
|
||||||
|
CYGWIN* )
|
||||||
|
cygwin=true
|
||||||
|
;;
|
||||||
|
Darwin* )
|
||||||
|
darwin=true
|
||||||
|
;;
|
||||||
|
MINGW* )
|
||||||
|
msys=true
|
||||||
|
;;
|
||||||
|
NONSTOP* )
|
||||||
|
nonstop=true
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||||
|
|
||||||
|
# Determine the Java command to use to start the JVM.
|
||||||
|
if [ -n "$JAVA_HOME" ] ; then
|
||||||
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||||
|
# IBM's JDK on AIX uses strange locations for the executables
|
||||||
|
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||||
|
else
|
||||||
|
JAVACMD="$JAVA_HOME/bin/java"
|
||||||
|
fi
|
||||||
|
if [ ! -x "$JAVACMD" ] ; then
|
||||||
|
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
JAVACMD="java"
|
||||||
|
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Increase the maximum file descriptors if we can.
|
||||||
|
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
||||||
|
MAX_FD_LIMIT=`ulimit -H -n`
|
||||||
|
if [ $? -eq 0 ] ; then
|
||||||
|
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||||
|
MAX_FD="$MAX_FD_LIMIT"
|
||||||
|
fi
|
||||||
|
ulimit -n $MAX_FD
|
||||||
|
if [ $? -ne 0 ] ; then
|
||||||
|
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Darwin, add options to specify how the application appears in the dock
|
||||||
|
if $darwin; then
|
||||||
|
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Cygwin, switch paths to Windows format before running java
|
||||||
|
if $cygwin ; then
|
||||||
|
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||||
|
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||||
|
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||||
|
|
||||||
|
# We build the pattern for arguments to be converted via cygpath
|
||||||
|
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||||
|
SEP=""
|
||||||
|
for dir in $ROOTDIRSRAW ; do
|
||||||
|
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||||
|
SEP="|"
|
||||||
|
done
|
||||||
|
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||||
|
# Add a user-defined pattern to the cygpath arguments
|
||||||
|
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||||
|
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||||
|
fi
|
||||||
|
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||||
|
i=0
|
||||||
|
for arg in "$@" ; do
|
||||||
|
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||||
|
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||||
|
|
||||||
|
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||||
|
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||||
|
else
|
||||||
|
eval `echo args$i`="\"$arg\""
|
||||||
|
fi
|
||||||
|
i=$((i+1))
|
||||||
|
done
|
||||||
|
case $i in
|
||||||
|
(0) set -- ;;
|
||||||
|
(1) set -- "$args0" ;;
|
||||||
|
(2) set -- "$args0" "$args1" ;;
|
||||||
|
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||||
|
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||||
|
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||||
|
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||||
|
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||||
|
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||||
|
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Escape application args
|
||||||
|
save () {
|
||||||
|
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||||
|
echo " "
|
||||||
|
}
|
||||||
|
APP_ARGS=$(save "$@")
|
||||||
|
|
||||||
|
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||||
|
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||||
|
|
||||||
|
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
|
||||||
|
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec "$JAVACMD" "$@"
|
||||||
84
gradlew.bat
vendored
Normal file
84
gradlew.bat
vendored
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
@if "%DEBUG%" == "" @echo off
|
||||||
|
@rem ##########################################################################
|
||||||
|
@rem
|
||||||
|
@rem Gradle startup script for Windows
|
||||||
|
@rem
|
||||||
|
@rem ##########################################################################
|
||||||
|
|
||||||
|
@rem Set local scope for the variables with windows NT shell
|
||||||
|
if "%OS%"=="Windows_NT" setlocal
|
||||||
|
|
||||||
|
set DIRNAME=%~dp0
|
||||||
|
if "%DIRNAME%" == "" set DIRNAME=.
|
||||||
|
set APP_BASE_NAME=%~n0
|
||||||
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
|
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
set DEFAULT_JVM_OPTS="-Xmx64m"
|
||||||
|
|
||||||
|
@rem Find java.exe
|
||||||
|
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||||
|
|
||||||
|
set JAVA_EXE=java.exe
|
||||||
|
%JAVA_EXE% -version >NUL 2>&1
|
||||||
|
if "%ERRORLEVEL%" == "0" goto init
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:findJavaFromJavaHome
|
||||||
|
set JAVA_HOME=%JAVA_HOME:"=%
|
||||||
|
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||||
|
|
||||||
|
if exist "%JAVA_EXE%" goto init
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:init
|
||||||
|
@rem Get command-line arguments, handling Windows variants
|
||||||
|
|
||||||
|
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||||
|
|
||||||
|
:win9xME_args
|
||||||
|
@rem Slurp the command line arguments.
|
||||||
|
set CMD_LINE_ARGS=
|
||||||
|
set _SKIP=2
|
||||||
|
|
||||||
|
:win9xME_args_slurp
|
||||||
|
if "x%~1" == "x" goto execute
|
||||||
|
|
||||||
|
set CMD_LINE_ARGS=%*
|
||||||
|
|
||||||
|
:execute
|
||||||
|
@rem Setup the command line
|
||||||
|
|
||||||
|
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||||
|
|
||||||
|
@rem Execute Gradle
|
||||||
|
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
||||||
|
|
||||||
|
:end
|
||||||
|
@rem End local scope for the variables with windows NT shell
|
||||||
|
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||||
|
|
||||||
|
:fail
|
||||||
|
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||||
|
rem the _cmd.exe /c_ return code!
|
||||||
|
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||||
|
exit /b 1
|
||||||
|
|
||||||
|
:mainEnd
|
||||||
|
if "%OS%"=="Windows_NT" endlocal
|
||||||
|
|
||||||
|
:omega
|
||||||
2
settings.gradle
Normal file
2
settings.gradle
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
rootProject.name = 'excel-download'
|
||||||
|
|
||||||
14
src/main/java/com/lannstark/DefaultContentsStyle.java
Normal file
14
src/main/java/com/lannstark/DefaultContentsStyle.java
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package com.lannstark;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface DefaultContentsStyle {
|
||||||
|
|
||||||
|
ExcelColumnStyle style();
|
||||||
|
|
||||||
|
}
|
||||||
14
src/main/java/com/lannstark/DefaultHeaderStyle.java
Normal file
14
src/main/java/com/lannstark/DefaultHeaderStyle.java
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package com.lannstark;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface DefaultHeaderStyle {
|
||||||
|
|
||||||
|
ExcelColumnStyle style();
|
||||||
|
|
||||||
|
}
|
||||||
19
src/main/java/com/lannstark/ExcelColumn.java
Normal file
19
src/main/java/com/lannstark/ExcelColumn.java
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package com.lannstark;
|
||||||
|
|
||||||
|
import com.lannstark.style.NoExcelCellStyle;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Target(ElementType.FIELD)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface ExcelColumn {
|
||||||
|
|
||||||
|
String headerName() default "";
|
||||||
|
|
||||||
|
ExcelColumnStyle headerStyle() default @ExcelColumnStyle(excelCellStyleClass = NoExcelCellStyle.class);
|
||||||
|
ExcelColumnStyle contentsStyle() default @ExcelColumnStyle(excelCellStyleClass = NoExcelCellStyle.class);
|
||||||
|
|
||||||
|
}
|
||||||
23
src/main/java/com/lannstark/ExcelColumnStyle.java
Normal file
23
src/main/java/com/lannstark/ExcelColumnStyle.java
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package com.lannstark;
|
||||||
|
|
||||||
|
|
||||||
|
import com.lannstark.style.ExcelCellStyle;
|
||||||
|
|
||||||
|
public @interface ExcelColumnStyle {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enum implements {@link com.lannstark.style.ExcelCellStyle}
|
||||||
|
* Also, can use just class.
|
||||||
|
* If not use Enum, enumName will be ignored
|
||||||
|
* @see com.lannstark.style.DefaultExcelCellStyle
|
||||||
|
* @see com.lannstark.style.CustomExcelCellStyle
|
||||||
|
*/
|
||||||
|
Class<? extends ExcelCellStyle> excelCellStyleClass();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* name of Enum implements {@link com.lannstark.style.ExcelCellStyle}
|
||||||
|
* if not use Enum, enumName will be ignored
|
||||||
|
*/
|
||||||
|
String enumName() default "";
|
||||||
|
|
||||||
|
}
|
||||||
9
src/main/java/com/lannstark/ExcelException.java
Normal file
9
src/main/java/com/lannstark/ExcelException.java
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package com.lannstark;
|
||||||
|
|
||||||
|
public class ExcelException extends RuntimeException {
|
||||||
|
|
||||||
|
public ExcelException(String message, Throwable cause) {
|
||||||
|
super(message, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
10
src/main/java/com/lannstark/excel/ExcelFile.java
Normal file
10
src/main/java/com/lannstark/excel/ExcelFile.java
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package com.lannstark.excel;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
public interface ExcelFile {
|
||||||
|
|
||||||
|
void write(OutputStream stream) throws IOException;
|
||||||
|
|
||||||
|
}
|
||||||
98
src/main/java/com/lannstark/excel/SXSSFExcelFile.java
Normal file
98
src/main/java/com/lannstark/excel/SXSSFExcelFile.java
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
package com.lannstark.excel;
|
||||||
|
|
||||||
|
import com.lannstark.exception.ExcelInternalException;
|
||||||
|
import com.lannstark.resource.DataFormatDecider;
|
||||||
|
import com.lannstark.resource.DefaultDataFormatDecider;
|
||||||
|
import com.lannstark.resource.ExcelRenderLocation;
|
||||||
|
import com.lannstark.resource.ExcelRenderResource;
|
||||||
|
import com.lannstark.resource.ExcelRenderResourceFactory;
|
||||||
|
import org.apache.poi.ss.SpreadsheetVersion;
|
||||||
|
import org.apache.poi.ss.usermodel.Cell;
|
||||||
|
import org.apache.poi.ss.usermodel.Row;
|
||||||
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
|
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static com.lannstark.utils.SuperClassReflectionUtils.getField;
|
||||||
|
|
||||||
|
public abstract class SXSSFExcelFile<T> implements ExcelFile {
|
||||||
|
|
||||||
|
protected static final SpreadsheetVersion supplyExcelVersion = SpreadsheetVersion.EXCEL2007;
|
||||||
|
|
||||||
|
protected SXSSFWorkbook wb;
|
||||||
|
protected Sheet sheet;
|
||||||
|
protected ExcelRenderResource resource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OneSheetExcelFile
|
||||||
|
* @param data List Data to render excel file. data should have at least one @ExcelColumn on fields
|
||||||
|
* @param type Class type to be rendered
|
||||||
|
*/
|
||||||
|
public SXSSFExcelFile(List<T> data, Class<T> type) {
|
||||||
|
this.wb = new SXSSFWorkbook();
|
||||||
|
this.resource = ExcelRenderResourceFactory.prepareRenderResource(type, wb, new DefaultDataFormatDecider());
|
||||||
|
renderExcel(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OneSheetExcelFile
|
||||||
|
* @param data List Data to render excel file. data should have at least one @ExcelColumn on fields
|
||||||
|
* @param type Class type to be rendered
|
||||||
|
* @param dataFormatDecider Custom DataFormatDecider
|
||||||
|
*/
|
||||||
|
public SXSSFExcelFile(List<T> data, Class<T> type, DataFormatDecider dataFormatDecider) {
|
||||||
|
this.wb = new SXSSFWorkbook();
|
||||||
|
this.resource = ExcelRenderResourceFactory.prepareRenderResource(type, wb, dataFormatDecider);
|
||||||
|
renderExcel(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract void renderExcel(List<T> data);
|
||||||
|
|
||||||
|
protected void renderHeadersWithNewSheet(Sheet sheet, int rowIndex, int columnStartIndex) {
|
||||||
|
Row row = sheet.createRow(rowIndex);
|
||||||
|
int columnIndex = columnStartIndex;
|
||||||
|
for (String dataFieldName : resource.getDataFieldNames()) {
|
||||||
|
Cell cell = row.createCell(columnIndex++);
|
||||||
|
cell.setCellStyle(resource.getCellStyle(dataFieldName, ExcelRenderLocation.HEADER));
|
||||||
|
cell.setCellValue(resource.getExcelHeaderName(dataFieldName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void renderContent(Object data, int rowIndex, int columnStartIndex) {
|
||||||
|
Row row = sheet.createRow(rowIndex);
|
||||||
|
int columnIndex = columnStartIndex;
|
||||||
|
for (String dataFieldName : resource.getDataFieldNames()) {
|
||||||
|
Cell cell = row.createCell(columnIndex++);
|
||||||
|
try {
|
||||||
|
Field field = getField(data.getClass(), (dataFieldName));
|
||||||
|
field.setAccessible(true);
|
||||||
|
cell.setCellStyle(resource.getCellStyle(dataFieldName, ExcelRenderLocation.CONTENTS));
|
||||||
|
Object cellValue = field.get(data);
|
||||||
|
renderCellValue(cell, cellValue);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new ExcelInternalException(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void renderCellValue(Cell cell, Object cellValue) {
|
||||||
|
if (cellValue instanceof Number) {
|
||||||
|
Number numberValue = (Number) cellValue;
|
||||||
|
cell.setCellValue(numberValue.doubleValue());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cell.setCellValue(cellValue == null ? "" : cellValue.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void write(OutputStream stream) throws IOException {
|
||||||
|
wb.write(stream);
|
||||||
|
wb.close();
|
||||||
|
wb.dispose();
|
||||||
|
stream.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
package com.lannstark.excel.multiplesheet;
|
||||||
|
|
||||||
|
import com.lannstark.excel.SXSSFExcelFile;
|
||||||
|
import com.lannstark.resource.DataFormatDecider;
|
||||||
|
import org.apache.commons.compress.archivers.zip.Zip64Mode;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MultiSheetExcelFile
|
||||||
|
*
|
||||||
|
* - support Excel Version over 2007
|
||||||
|
* - support multi sheet rendering
|
||||||
|
* - support Dffierent DataFormat by Class Type
|
||||||
|
* - support Custom CellStyle according to (header or contents) and data field
|
||||||
|
*/
|
||||||
|
public class MultiSheetExcelFile<T> extends SXSSFExcelFile<T> {
|
||||||
|
|
||||||
|
private static final int maxRowCanBeRendered = supplyExcelVersion.getMaxRows() - 1;
|
||||||
|
private static final int ROW_START_INDEX = 0;
|
||||||
|
private static final int COLUMN_START_INDEX = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If you use SXSSF with hug data, you need to set zip mode
|
||||||
|
* see http://apache-poi.1045710.n5.nabble.com/Bug-62872-New-Writing-large-files-with-800k-rows-gives-java-io-IOException-This-archive-contains-unc-td5732006.html
|
||||||
|
*/
|
||||||
|
public MultiSheetExcelFile(List<T> data, Class<T> type) {
|
||||||
|
super(data, type);
|
||||||
|
wb.setZip64Mode(Zip64Mode.Always);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MultiSheetExcelFile(List<T> data, Class<T> type, DataFormatDecider dataFormatDecider) {
|
||||||
|
super(data, type, dataFormatDecider);
|
||||||
|
wb.setZip64Mode(Zip64Mode.Always);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void renderExcel(List<T> data) {
|
||||||
|
// 1. Create header and return if data is empty
|
||||||
|
if (data.isEmpty()) {
|
||||||
|
createNewSheetWithHeader();
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
createNewSheetWithHeader();
|
||||||
|
int renderedDataCnt = 0;
|
||||||
|
int rowIndex = ROW_START_INDEX + 1;
|
||||||
|
for (Object renderedData : data) {
|
||||||
|
renderContent(renderedData, rowIndex++, COLUMN_START_INDEX);
|
||||||
|
renderedDataCnt ++;
|
||||||
|
|
||||||
|
if (renderedDataCnt == maxRowCanBeRendered) {
|
||||||
|
renderedDataCnt = 0;
|
||||||
|
rowIndex = 1;
|
||||||
|
createNewSheetWithHeader();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createNewSheetWithHeader() {
|
||||||
|
sheet = wb.createSheet();
|
||||||
|
renderHeadersWithNewSheet(sheet, ROW_START_INDEX, COLUMN_START_INDEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
package com.lannstark.excel.onesheet;
|
||||||
|
|
||||||
|
import com.lannstark.excel.SXSSFExcelFile;
|
||||||
|
import com.lannstark.resource.DataFormatDecider;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OneSheetExcelFile
|
||||||
|
*
|
||||||
|
* - support Excel Version over 2007
|
||||||
|
* - support one sheet rendering
|
||||||
|
* - support Dffierent DataFormat by Class Type
|
||||||
|
* - support Custom CellStyle according to (header or contents) and data field
|
||||||
|
*/
|
||||||
|
public final class OneSheetExcelFile<T> extends SXSSFExcelFile<T> {
|
||||||
|
|
||||||
|
private static final int ROW_START_INDEX = 0;
|
||||||
|
private static final int COLUMN_START_INDEX = 0;
|
||||||
|
|
||||||
|
public OneSheetExcelFile(List<T> data, Class<T> type) {
|
||||||
|
super(data, type);
|
||||||
|
validateMaxRow(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public OneSheetExcelFile(List<T> data, Class<T> type, DataFormatDecider dataFormatDecider) {
|
||||||
|
super(data, type, dataFormatDecider);
|
||||||
|
validateMaxRow(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateMaxRow(List<?> data) {
|
||||||
|
int maxRows = supplyExcelVersion.getMaxRows();
|
||||||
|
if (data.size() > maxRows) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
String.format("This concrete ExcelFile does not support over %s rows", maxRows));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void renderExcel(List<T> data) {
|
||||||
|
// 1. Create sheet and renderHeader
|
||||||
|
sheet = wb.createSheet();
|
||||||
|
renderHeadersWithNewSheet(sheet, ROW_START_INDEX, COLUMN_START_INDEX);
|
||||||
|
|
||||||
|
if (data.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Render Contents
|
||||||
|
int rowIndex = ROW_START_INDEX + 1;
|
||||||
|
for (Object renderedData : data) {
|
||||||
|
renderContent(renderedData, rowIndex++, COLUMN_START_INDEX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package com.lannstark.exception;
|
||||||
|
|
||||||
|
import com.lannstark.ExcelException;
|
||||||
|
|
||||||
|
public class ExcelInternalException extends ExcelException {
|
||||||
|
|
||||||
|
public ExcelInternalException(String message, Throwable cause) {
|
||||||
|
super(message, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package com.lannstark.exception;
|
||||||
|
|
||||||
|
import com.lannstark.ExcelException;
|
||||||
|
|
||||||
|
public class InvalidExcelCellStyleException extends ExcelException {
|
||||||
|
|
||||||
|
public InvalidExcelCellStyleException(String message, Throwable cause) {
|
||||||
|
super(message, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package com.lannstark.exception;
|
||||||
|
|
||||||
|
import com.lannstark.ExcelException;
|
||||||
|
|
||||||
|
public class NoExcelColumnAnnotationsException extends ExcelException {
|
||||||
|
|
||||||
|
public NoExcelColumnAnnotationsException(String message) {
|
||||||
|
super(message, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package com.lannstark.exception;
|
||||||
|
|
||||||
|
import com.lannstark.ExcelException;
|
||||||
|
|
||||||
|
public class UnSupportedExcelTypeException extends ExcelException {
|
||||||
|
|
||||||
|
public UnSupportedExcelTypeException(String message) {
|
||||||
|
super(message, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package com.lannstark.resource;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.DataFormat;
|
||||||
|
|
||||||
|
public interface DataFormatDecider {
|
||||||
|
|
||||||
|
short getDataFormat(DataFormat dataFormat, Class<?> type);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package com.lannstark.resource;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.DataFormat;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class DefaultDataFormatDecider implements DataFormatDecider {
|
||||||
|
|
||||||
|
private static final String CURRENT_FORMAT = "#,##0";
|
||||||
|
private static final String DEFAULT_FORMAT = "";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public short getDataFormat(DataFormat dataFormat, Class<?> type) {
|
||||||
|
if (isNumericType(type)) {
|
||||||
|
return dataFormat.getFormat(CURRENT_FORMAT);
|
||||||
|
}
|
||||||
|
return dataFormat.getFormat(DEFAULT_FORMAT);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isNumericType(Class<?> type) {
|
||||||
|
List<Class<?>> numericTypes = Arrays.asList(
|
||||||
|
Byte.class, byte.class,
|
||||||
|
Short.class, short.class,
|
||||||
|
Integer.class, int.class,
|
||||||
|
Long.class, long.class,
|
||||||
|
Float.class, float.class,
|
||||||
|
Double.class, double.class
|
||||||
|
);
|
||||||
|
return numericTypes.contains(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
34
src/main/java/com/lannstark/resource/ExcelCellKey.java
Normal file
34
src/main/java/com/lannstark/resource/ExcelCellKey.java
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
package com.lannstark.resource;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public final class ExcelCellKey {
|
||||||
|
|
||||||
|
private final String dataFieldName;
|
||||||
|
private final ExcelRenderLocation excelRenderLocation;
|
||||||
|
|
||||||
|
private ExcelCellKey(String dataFieldName, ExcelRenderLocation excelRenderLocation) {
|
||||||
|
this.dataFieldName = dataFieldName;
|
||||||
|
this.excelRenderLocation = excelRenderLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ExcelCellKey of(String fieldName, ExcelRenderLocation excelRenderLocation) {
|
||||||
|
assert excelRenderLocation != null;
|
||||||
|
return new ExcelCellKey(fieldName, excelRenderLocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
ExcelCellKey that = (ExcelCellKey) o;
|
||||||
|
return Objects.equals(dataFieldName, that.dataFieldName) &&
|
||||||
|
excelRenderLocation == that.excelRenderLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(dataFieldName, excelRenderLocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.lannstark.resource;
|
||||||
|
|
||||||
|
public enum ExcelRenderLocation {
|
||||||
|
|
||||||
|
HEADER, CONTENTS
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package com.lannstark.resource;
|
||||||
|
|
||||||
|
import com.lannstark.resource.collection.PreCalculatedCellStyleMap;
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class ExcelRenderResource {
|
||||||
|
|
||||||
|
private PreCalculatedCellStyleMap styleMap;
|
||||||
|
|
||||||
|
// TODO dataFieldName -> excelHeaderName Map Abstraction
|
||||||
|
private Map<String, String> excelHeaderNames;
|
||||||
|
private List<String> dataFieldNames;
|
||||||
|
|
||||||
|
public ExcelRenderResource(PreCalculatedCellStyleMap styleMap,
|
||||||
|
Map<String, String> excelHeaderNames, List<String> dataFieldNames) {
|
||||||
|
this.styleMap = styleMap;
|
||||||
|
this.excelHeaderNames = excelHeaderNames;
|
||||||
|
this.dataFieldNames = dataFieldNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CellStyle getCellStyle(String dataFieldName, ExcelRenderLocation excelRenderLocation) {
|
||||||
|
return styleMap.get(ExcelCellKey.of(dataFieldName, excelRenderLocation));
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getExcelHeaderName(String dataFieldName) {
|
||||||
|
return excelHeaderNames.get(dataFieldName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PreCalculatedCellStyleMap getStyleMap() {
|
||||||
|
return styleMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getExcelHeaderNames() {
|
||||||
|
return excelHeaderNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getDataFieldNames() {
|
||||||
|
return dataFieldNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,114 @@
|
|||||||
|
package com.lannstark.resource;
|
||||||
|
|
||||||
|
import com.lannstark.DefaultContentsStyle;
|
||||||
|
import com.lannstark.DefaultHeaderStyle;
|
||||||
|
import com.lannstark.ExcelColumn;
|
||||||
|
import com.lannstark.ExcelColumnStyle;
|
||||||
|
import com.lannstark.exception.InvalidExcelCellStyleException;
|
||||||
|
import com.lannstark.exception.NoExcelColumnAnnotationsException;
|
||||||
|
import com.lannstark.resource.collection.PreCalculatedCellStyleMap;
|
||||||
|
import com.lannstark.style.ExcelCellStyle;
|
||||||
|
import com.lannstark.style.NoExcelCellStyle;
|
||||||
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
|
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static com.lannstark.utils.SuperClassReflectionUtils.getAllFields;
|
||||||
|
import static com.lannstark.utils.SuperClassReflectionUtils.getAnnotation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ExcelRenderResourceFactory
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public final class ExcelRenderResourceFactory {
|
||||||
|
|
||||||
|
public static ExcelRenderResource prepareRenderResource(Class<?> type, Workbook wb,
|
||||||
|
DataFormatDecider dataFormatDecider) {
|
||||||
|
PreCalculatedCellStyleMap styleMap = new PreCalculatedCellStyleMap(dataFormatDecider);
|
||||||
|
Map<String, String> headerNamesMap = new LinkedHashMap<>();
|
||||||
|
List<String> fieldNames = new ArrayList<>();
|
||||||
|
|
||||||
|
ExcelColumnStyle classDefinedHeaderStyle = getHeaderExcelColumnStyle(type);
|
||||||
|
ExcelColumnStyle classDefinedContentsStyle = getContentsExcelColumnStyle(type);
|
||||||
|
|
||||||
|
for (Field field : getAllFields(type)) {
|
||||||
|
if (field.isAnnotationPresent(ExcelColumn.class)) {
|
||||||
|
ExcelColumn annotation = field.getAnnotation(ExcelColumn.class);
|
||||||
|
styleMap.put(
|
||||||
|
String.class,
|
||||||
|
ExcelCellKey.of(field.getName(), ExcelRenderLocation.HEADER),
|
||||||
|
getCellStyle(decideAppliedStyleAnnotation(classDefinedHeaderStyle, annotation.headerStyle())), wb);
|
||||||
|
Class<?> fieldType = field.getType();
|
||||||
|
styleMap.put(
|
||||||
|
fieldType,
|
||||||
|
ExcelCellKey.of(field.getName(), ExcelRenderLocation.CONTENTS),
|
||||||
|
getCellStyle(decideAppliedStyleAnnotation(classDefinedContentsStyle, annotation.contentsStyle())), wb);
|
||||||
|
fieldNames.add(field.getName());
|
||||||
|
headerNamesMap.put(field.getName(), annotation.headerName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (styleMap.isEmpty()) {
|
||||||
|
throw new NoExcelColumnAnnotationsException(String.format("Class %s has not @ExcelColumn at all", type));
|
||||||
|
}
|
||||||
|
return new ExcelRenderResource(styleMap, headerNamesMap, fieldNames);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ExcelColumnStyle getHeaderExcelColumnStyle(Class<?> clazz) {
|
||||||
|
Annotation annotation = getAnnotation(clazz, DefaultHeaderStyle.class);
|
||||||
|
if (annotation == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return ((DefaultHeaderStyle) annotation).style();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ExcelColumnStyle getContentsExcelColumnStyle(Class<?> clazz) {
|
||||||
|
Annotation annotation = getAnnotation(clazz, DefaultContentsStyle.class);
|
||||||
|
if (annotation == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return ((DefaultContentsStyle) annotation).style();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ExcelColumnStyle decideAppliedStyleAnnotation(ExcelColumnStyle classAnnotation,
|
||||||
|
ExcelColumnStyle fieldAnnotation) {
|
||||||
|
if (fieldAnnotation.excelCellStyleClass().equals(NoExcelCellStyle.class) && classAnnotation != null) {
|
||||||
|
return classAnnotation;
|
||||||
|
}
|
||||||
|
return fieldAnnotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ExcelCellStyle getCellStyle(ExcelColumnStyle excelColumnStyle) {
|
||||||
|
Class<? extends ExcelCellStyle> excelCellStyleClass = excelColumnStyle.excelCellStyleClass();
|
||||||
|
// 1. Case of Enum
|
||||||
|
if (excelCellStyleClass.isEnum()) {
|
||||||
|
String enumName = excelColumnStyle.enumName();
|
||||||
|
return findExcelCellStyle(excelCellStyleClass, enumName);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Case of Class
|
||||||
|
try {
|
||||||
|
return excelCellStyleClass.newInstance();
|
||||||
|
} catch (InstantiationException | IllegalAccessException e) {
|
||||||
|
throw new InvalidExcelCellStyleException(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private static ExcelCellStyle findExcelCellStyle(Class excelCellStyles, String enumName) {
|
||||||
|
try {
|
||||||
|
return (ExcelCellStyle) Enum.valueOf((Class<Enum>) excelCellStyles, enumName);
|
||||||
|
} catch (NullPointerException e) {
|
||||||
|
throw new InvalidExcelCellStyleException("enumName must not be null", e);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
throw new InvalidExcelCellStyleException(
|
||||||
|
String.format("Enum %s does not name %s", excelCellStyles.getName(), enumName), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
package com.lannstark.resource.collection;
|
||||||
|
|
||||||
|
import com.lannstark.resource.DataFormatDecider;
|
||||||
|
import com.lannstark.resource.ExcelCellKey;
|
||||||
|
import com.lannstark.style.ExcelCellStyle;
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
import org.apache.poi.ss.usermodel.DataFormat;
|
||||||
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PreCalculatedCellStyleMap
|
||||||
|
*
|
||||||
|
* Determines cell's style
|
||||||
|
* In currently, PreCalculatedCellSylteMap determines {org.apache.poi.ss.usermodel.DataFormat}
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class PreCalculatedCellStyleMap {
|
||||||
|
|
||||||
|
private final DataFormatDecider store;
|
||||||
|
|
||||||
|
public PreCalculatedCellStyleMap(DataFormatDecider store) {
|
||||||
|
this.store = store;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Map<ExcelCellKey, CellStyle> cellStyleMap = new HashMap<>();
|
||||||
|
|
||||||
|
public void put(Class<?> fieldType, ExcelCellKey excelCellKey, ExcelCellStyle excelCellStyle, Workbook wb) {
|
||||||
|
CellStyle cellStyle = wb.createCellStyle();
|
||||||
|
DataFormat dataFormat = wb.createDataFormat();
|
||||||
|
cellStyle.setDataFormat(store.getDataFormat(dataFormat, fieldType));
|
||||||
|
excelCellStyle.apply(cellStyle);
|
||||||
|
cellStyleMap.put(excelCellKey, cellStyle);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CellStyle get(ExcelCellKey excelCellKey) {
|
||||||
|
return cellStyleMap.get(excelCellKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return cellStyleMap.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
21
src/main/java/com/lannstark/style/CustomExcelCellStyle.java
Normal file
21
src/main/java/com/lannstark/style/CustomExcelCellStyle.java
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
package com.lannstark.style;
|
||||||
|
|
||||||
|
import com.lannstark.style.configurer.ExcelCellStyleConfigurer;
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
|
||||||
|
public abstract class CustomExcelCellStyle implements ExcelCellStyle {
|
||||||
|
|
||||||
|
private ExcelCellStyleConfigurer configurer = new ExcelCellStyleConfigurer();
|
||||||
|
|
||||||
|
public CustomExcelCellStyle() {
|
||||||
|
configure(configurer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void configure(ExcelCellStyleConfigurer configurer);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void apply(CellStyle cellStyle) {
|
||||||
|
configurer.configure(cellStyle);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
44
src/main/java/com/lannstark/style/DefaultExcelCellStyle.java
Normal file
44
src/main/java/com/lannstark/style/DefaultExcelCellStyle.java
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
package com.lannstark.style;
|
||||||
|
|
||||||
|
import com.lannstark.style.align.DefaultExcelAlign;
|
||||||
|
import com.lannstark.style.align.ExcelAlign;
|
||||||
|
import com.lannstark.style.border.DefaultExcelBorders;
|
||||||
|
import com.lannstark.style.border.ExcelBorderStyle;
|
||||||
|
import com.lannstark.style.color.DefaultExcelColor;
|
||||||
|
import com.lannstark.style.color.ExcelColor;
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example of using ExcelCellStyle as Enum
|
||||||
|
*/
|
||||||
|
public enum DefaultExcelCellStyle implements ExcelCellStyle {
|
||||||
|
|
||||||
|
GREY_HEADER(DefaultExcelColor.rgb(217, 217, 217),
|
||||||
|
DefaultExcelBorders.newInstance(ExcelBorderStyle.THIN), DefaultExcelAlign.CENTER_CENTER),
|
||||||
|
BLUE_HEADER(DefaultExcelColor.rgb(223, 235, 246),
|
||||||
|
DefaultExcelBorders.newInstance(ExcelBorderStyle.THIN), DefaultExcelAlign.CENTER_CENTER),
|
||||||
|
CONTENTS(DefaultExcelColor.rgb(255, 255, 255),
|
||||||
|
DefaultExcelBorders.newInstance(ExcelBorderStyle.THIN), DefaultExcelAlign.RIGHT_CENTER);
|
||||||
|
|
||||||
|
private final ExcelColor backgroundColor;
|
||||||
|
/**
|
||||||
|
* like CSS margin or padding rule,
|
||||||
|
* List<DefaultExcelBorder> represents rgb TOP RIGHT BOTTOM LEFT
|
||||||
|
*/
|
||||||
|
private final DefaultExcelBorders borders;
|
||||||
|
private final ExcelAlign align;
|
||||||
|
|
||||||
|
DefaultExcelCellStyle(ExcelColor backgroundColor, DefaultExcelBorders borders, ExcelAlign align) {
|
||||||
|
this.backgroundColor = backgroundColor;
|
||||||
|
this.borders = borders;
|
||||||
|
this.align = align;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void apply(CellStyle cellStyle) {
|
||||||
|
backgroundColor.applyForeground(cellStyle);
|
||||||
|
borders.apply(cellStyle);
|
||||||
|
align.apply(cellStyle);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
9
src/main/java/com/lannstark/style/ExcelCellStyle.java
Normal file
9
src/main/java/com/lannstark/style/ExcelCellStyle.java
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package com.lannstark.style;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
|
||||||
|
public interface ExcelCellStyle {
|
||||||
|
|
||||||
|
void apply(CellStyle cellStyle);
|
||||||
|
|
||||||
|
}
|
||||||
12
src/main/java/com/lannstark/style/NoExcelCellStyle.java
Normal file
12
src/main/java/com/lannstark/style/NoExcelCellStyle.java
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package com.lannstark.style;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
|
||||||
|
public class NoExcelCellStyle implements ExcelCellStyle {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void apply(CellStyle cellStyle) {
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
package com.lannstark.style.align;
|
||||||
|
|
||||||
|
import jdk.nashorn.internal.objects.annotations.Getter;
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
import org.apache.poi.ss.usermodel.HorizontalAlignment;
|
||||||
|
import org.apache.poi.ss.usermodel.VerticalAlignment;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DefaultExcelAlign
|
||||||
|
*
|
||||||
|
* Can be used with {@link com.lannstark.style.CustomExcelCellStyle}
|
||||||
|
* see {@link org.apache.poi.ss.usermodel.VerticalAlignment} and
|
||||||
|
* {@link org.apache.poi.ss.usermodel.HorizontalAlignment} for detail explanation
|
||||||
|
*/
|
||||||
|
public enum DefaultExcelAlign implements ExcelAlign {
|
||||||
|
|
||||||
|
GENERAL_TOP(HorizontalAlignment.GENERAL, VerticalAlignment.TOP),
|
||||||
|
GENERAL_CENTER(HorizontalAlignment.GENERAL, VerticalAlignment.CENTER),
|
||||||
|
GENERAL_BOTTOM(HorizontalAlignment.GENERAL, VerticalAlignment.BOTTOM),
|
||||||
|
GENERAL_JUSTIFY(HorizontalAlignment.GENERAL, VerticalAlignment.JUSTIFY),
|
||||||
|
GENERAL_DISTRIBUTED(HorizontalAlignment.GENERAL, VerticalAlignment.DISTRIBUTED),
|
||||||
|
LEFT_TOP(HorizontalAlignment.LEFT, VerticalAlignment.TOP),
|
||||||
|
LEFT_CENTER(HorizontalAlignment.LEFT, VerticalAlignment.CENTER),
|
||||||
|
LEFT_BOTTOM(HorizontalAlignment.LEFT, VerticalAlignment.BOTTOM),
|
||||||
|
LEFT_JUSTIFY(HorizontalAlignment.LEFT, VerticalAlignment.JUSTIFY),
|
||||||
|
LEFT_DISTRIBUTED(HorizontalAlignment.LEFT, VerticalAlignment.DISTRIBUTED),
|
||||||
|
CENTER_TOP(HorizontalAlignment.CENTER, VerticalAlignment.TOP),
|
||||||
|
CENTER_CENTER(HorizontalAlignment.CENTER, VerticalAlignment.CENTER),
|
||||||
|
CENTER_BOTTOM(HorizontalAlignment.CENTER, VerticalAlignment.BOTTOM),
|
||||||
|
CENTER_JUSTIFY(HorizontalAlignment.CENTER, VerticalAlignment.JUSTIFY),
|
||||||
|
CENTER_DISTRIBUTED(HorizontalAlignment.CENTER, VerticalAlignment.DISTRIBUTED),
|
||||||
|
RIGHT_TOP(HorizontalAlignment.RIGHT, VerticalAlignment.TOP),
|
||||||
|
RIGHT_CENTER(HorizontalAlignment.RIGHT, VerticalAlignment.CENTER),
|
||||||
|
RIGHT_BOTTOM(HorizontalAlignment.RIGHT, VerticalAlignment.BOTTOM),
|
||||||
|
RIGHT_JUSTIFY(HorizontalAlignment.RIGHT, VerticalAlignment.JUSTIFY),
|
||||||
|
RIGHT_DISTRIBUTED(HorizontalAlignment.RIGHT, VerticalAlignment.DISTRIBUTED),
|
||||||
|
FILL_TOP(HorizontalAlignment.FILL, VerticalAlignment.TOP),
|
||||||
|
FILL_CENTER(HorizontalAlignment.FILL, VerticalAlignment.CENTER),
|
||||||
|
FILL_BOTTOM(HorizontalAlignment.FILL, VerticalAlignment.BOTTOM),
|
||||||
|
FILL_JUSTIFY(HorizontalAlignment.FILL, VerticalAlignment.JUSTIFY),
|
||||||
|
FILL_DISTRIBUTED(HorizontalAlignment.FILL, VerticalAlignment.DISTRIBUTED),
|
||||||
|
JUSTIFY_TOP(HorizontalAlignment.JUSTIFY, VerticalAlignment.TOP),
|
||||||
|
JUSTIFY_CENTER(HorizontalAlignment.JUSTIFY, VerticalAlignment.CENTER),
|
||||||
|
JUSTIFY_BOTTOM(HorizontalAlignment.JUSTIFY, VerticalAlignment.BOTTOM),
|
||||||
|
JUSTIFY_JUSTIFY(HorizontalAlignment.JUSTIFY, VerticalAlignment.JUSTIFY),
|
||||||
|
JUSTIFY_DISTRIBUTED(HorizontalAlignment.JUSTIFY, VerticalAlignment.DISTRIBUTED),
|
||||||
|
CENTER_SELECTION_TOP(HorizontalAlignment.CENTER_SELECTION, VerticalAlignment.TOP),
|
||||||
|
CENTER_SELECTION_CENTER(HorizontalAlignment.CENTER_SELECTION, VerticalAlignment.CENTER),
|
||||||
|
CENTER_SELECTION_BOTTOM(HorizontalAlignment.CENTER_SELECTION, VerticalAlignment.BOTTOM),
|
||||||
|
CENTER_SELECTION_JUSTIFY(HorizontalAlignment.CENTER_SELECTION, VerticalAlignment.JUSTIFY),
|
||||||
|
CENTER_SELECTION_DISTRIBUTED(HorizontalAlignment.CENTER_SELECTION, VerticalAlignment.DISTRIBUTED),
|
||||||
|
DISTRIBUTED_TOP(HorizontalAlignment.DISTRIBUTED, VerticalAlignment.TOP),
|
||||||
|
DISTRIBUTED_CENTER(HorizontalAlignment.DISTRIBUTED, VerticalAlignment.CENTER),
|
||||||
|
DISTRIBUTED_BOTTOM(HorizontalAlignment.DISTRIBUTED, VerticalAlignment.BOTTOM),
|
||||||
|
DISTRIBUTED_JUSTIFY(HorizontalAlignment.DISTRIBUTED, VerticalAlignment.JUSTIFY),
|
||||||
|
DISTRIBUTED_DISTRIBUTED(HorizontalAlignment.DISTRIBUTED, VerticalAlignment.DISTRIBUTED);
|
||||||
|
|
||||||
|
private final HorizontalAlignment horizontalAlignment;
|
||||||
|
private final VerticalAlignment verticalAlignment;
|
||||||
|
|
||||||
|
DefaultExcelAlign(HorizontalAlignment horizontalAlignment, VerticalAlignment verticalAlignment) {
|
||||||
|
this.horizontalAlignment = horizontalAlignment;
|
||||||
|
this.verticalAlignment = verticalAlignment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void apply(CellStyle cellStyle) {
|
||||||
|
cellStyle.setAlignment(horizontalAlignment);
|
||||||
|
cellStyle.setVerticalAlignment(verticalAlignment);
|
||||||
|
}
|
||||||
|
|
||||||
|
public HorizontalAlignment getHorizontalAlignment() {
|
||||||
|
return horizontalAlignment;
|
||||||
|
}
|
||||||
|
|
||||||
|
public VerticalAlignment getVerticalAlignment() {
|
||||||
|
return verticalAlignment;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
9
src/main/java/com/lannstark/style/align/ExcelAlign.java
Normal file
9
src/main/java/com/lannstark/style/align/ExcelAlign.java
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package com.lannstark.style.align;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
|
||||||
|
public interface ExcelAlign {
|
||||||
|
|
||||||
|
void apply(CellStyle cellStyle);
|
||||||
|
|
||||||
|
}
|
||||||
12
src/main/java/com/lannstark/style/align/NoExcelAlign.java
Normal file
12
src/main/java/com/lannstark/style/align/NoExcelAlign.java
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package com.lannstark.style.align;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
|
||||||
|
public class NoExcelAlign implements ExcelAlign {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void apply(CellStyle cellStyle) {
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package com.lannstark.style.border;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
|
||||||
|
public final class DefaultExcelBorder implements ExcelBorder {
|
||||||
|
|
||||||
|
private ExcelBorderStyle borderStyle;
|
||||||
|
|
||||||
|
public DefaultExcelBorder(ExcelBorderStyle borderStyle) {
|
||||||
|
this.borderStyle = borderStyle;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void applyTop(CellStyle cellStyle) {
|
||||||
|
cellStyle.setBorderTop(borderStyle.getStyle());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void applyRight(CellStyle cellStyle) {
|
||||||
|
cellStyle.setBorderRight(borderStyle.getStyle());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void applyBottom(CellStyle cellStyle) {
|
||||||
|
cellStyle.setBorderBottom(borderStyle.getStyle());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void applyLeft(CellStyle cellStyle) {
|
||||||
|
cellStyle.setBorderLeft(borderStyle.getStyle());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package com.lannstark.style.border;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public final class DefaultExcelBorders implements ExcelBorders {
|
||||||
|
|
||||||
|
private List<? extends ExcelBorder> borders;
|
||||||
|
|
||||||
|
public DefaultExcelBorders(List<? extends ExcelBorder> borders) {
|
||||||
|
validateBorders(borders);
|
||||||
|
this.borders = borders;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DefaultExcelBorders newInstance(ExcelBorderStyle style) {
|
||||||
|
List<DefaultExcelBorder> excelBorders = new ArrayList<>();
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
excelBorders.add(new DefaultExcelBorder(style));
|
||||||
|
}
|
||||||
|
return new DefaultExcelBorders(excelBorders);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateBorders(List<? extends ExcelBorder> borders) {
|
||||||
|
if (borders.size() != 4) {
|
||||||
|
throw new IllegalArgumentException("Should be initialized with TOP RIGHT LEFT BOTTOM borders");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void apply(CellStyle cellStyle) {
|
||||||
|
borders.get(0).applyTop(cellStyle);
|
||||||
|
borders.get(1).applyRight(cellStyle);
|
||||||
|
borders.get(2).applyBottom(cellStyle);
|
||||||
|
borders.get(3).applyLeft(cellStyle);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
15
src/main/java/com/lannstark/style/border/ExcelBorder.java
Normal file
15
src/main/java/com/lannstark/style/border/ExcelBorder.java
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package com.lannstark.style.border;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
|
||||||
|
public interface ExcelBorder {
|
||||||
|
|
||||||
|
void applyTop(CellStyle cellStyle);
|
||||||
|
|
||||||
|
void applyRight(CellStyle cellStyle);
|
||||||
|
|
||||||
|
void applyBottom(CellStyle cellStyle);
|
||||||
|
|
||||||
|
void applyLeft(CellStyle cellStyle);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package com.lannstark.style.border;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.BorderStyle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper enum for {@link org.apache.poi.ss.usermodel.BorderStyle}
|
||||||
|
*/
|
||||||
|
public enum ExcelBorderStyle {
|
||||||
|
|
||||||
|
NONE(BorderStyle.NONE),
|
||||||
|
THIN(BorderStyle.THIN),
|
||||||
|
MEDIUM(BorderStyle.MEDIUM),
|
||||||
|
DASHED(BorderStyle.DASHED),
|
||||||
|
DOTTED(BorderStyle.DOTTED),
|
||||||
|
THICK(BorderStyle.THICK),
|
||||||
|
DOUBLE(BorderStyle.DOUBLE),
|
||||||
|
HAIR(BorderStyle.HAIR),
|
||||||
|
MEDIUM_DASHED(BorderStyle.MEDIUM_DASHED),
|
||||||
|
DASH_DOT(BorderStyle.DASH_DOT),
|
||||||
|
MEDIUM_DASH_DOT(BorderStyle.MEDIUM_DASH_DOT),
|
||||||
|
DASH_DOT_DOT(BorderStyle.DASH_DOT_DOT),
|
||||||
|
MEDIUM_DASH_DOT_DOT(BorderStyle.MEDIUM_DASH_DOT_DOT),
|
||||||
|
SLANTED_DASH_DOT(BorderStyle.SLANTED_DASH_DOT);
|
||||||
|
|
||||||
|
private final BorderStyle borderStyle;
|
||||||
|
|
||||||
|
ExcelBorderStyle(BorderStyle borderStyle) {
|
||||||
|
this.borderStyle = borderStyle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BorderStyle getStyle() {
|
||||||
|
return borderStyle;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package com.lannstark.style.border;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
|
||||||
|
public interface ExcelBorders {
|
||||||
|
|
||||||
|
void apply(CellStyle cellStyle);
|
||||||
|
|
||||||
|
}
|
||||||
12
src/main/java/com/lannstark/style/border/NoExcelBorders.java
Normal file
12
src/main/java/com/lannstark/style/border/NoExcelBorders.java
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package com.lannstark.style.border;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
|
||||||
|
public final class NoExcelBorders implements ExcelBorders {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void apply(CellStyle cellStyle) {
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
package com.lannstark.style.color;
|
||||||
|
|
||||||
|
import com.lannstark.exception.UnSupportedExcelTypeException;
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
import org.apache.poi.ss.usermodel.FillPatternType;
|
||||||
|
import org.apache.poi.xssf.usermodel.DefaultIndexedColorMap;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFColor;
|
||||||
|
|
||||||
|
public class DefaultExcelColor implements ExcelColor {
|
||||||
|
|
||||||
|
private static final int MIN_RGB = 0;
|
||||||
|
private static final int MAX_RGB = 255;
|
||||||
|
|
||||||
|
private byte red;
|
||||||
|
private byte green;
|
||||||
|
private byte blue;
|
||||||
|
|
||||||
|
private DefaultExcelColor(byte red, byte green, byte blue) {
|
||||||
|
this.red = red;
|
||||||
|
this.green = green;
|
||||||
|
this.blue = blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DefaultExcelColor rgb(int red, int green, int blue) {
|
||||||
|
if (red < MIN_RGB || red > MAX_RGB || green < MIN_RGB ||
|
||||||
|
green > MAX_RGB || blue < MIN_RGB || blue > MAX_RGB) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
String.format("Wrong RGB(%s %s %s)", red, green, blue)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return new DefaultExcelColor((byte) red, (byte) green, (byte) blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* applyForeground
|
||||||
|
* In current, only supports XSSFCellStyle because can not find HSSFCellStyle RGB configuration
|
||||||
|
* Please share if you find the HSSFCellStyle RGB configuration
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void applyForeground(CellStyle cellStyle) {
|
||||||
|
try {
|
||||||
|
XSSFCellStyle xssfCellStyle = (XSSFCellStyle) cellStyle;
|
||||||
|
xssfCellStyle.setFillForegroundColor(new XSSFColor(new byte[]{red, green, blue}, new DefaultIndexedColorMap()));
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new UnSupportedExcelTypeException(String.format("Excel Type %s is not supported now", cellStyle.getClass()));
|
||||||
|
}
|
||||||
|
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
9
src/main/java/com/lannstark/style/color/ExcelColor.java
Normal file
9
src/main/java/com/lannstark/style/color/ExcelColor.java
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package com.lannstark.style.color;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
|
||||||
|
public interface ExcelColor {
|
||||||
|
|
||||||
|
void applyForeground(CellStyle cellStyle);
|
||||||
|
|
||||||
|
}
|
||||||
12
src/main/java/com/lannstark/style/color/NoExcelColor.java
Normal file
12
src/main/java/com/lannstark/style/color/NoExcelColor.java
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package com.lannstark.style.color;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
|
||||||
|
public class NoExcelColor implements ExcelColor {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void applyForeground(CellStyle cellStyle) {
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package com.lannstark.style.configurer;
|
||||||
|
|
||||||
|
import com.lannstark.style.align.ExcelAlign;
|
||||||
|
import com.lannstark.style.align.NoExcelAlign;
|
||||||
|
import com.lannstark.style.border.ExcelBorders;
|
||||||
|
import com.lannstark.style.border.NoExcelBorders;
|
||||||
|
import com.lannstark.style.color.DefaultExcelColor;
|
||||||
|
import com.lannstark.style.color.ExcelColor;
|
||||||
|
import com.lannstark.style.color.NoExcelColor;
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
|
||||||
|
public class ExcelCellStyleConfigurer {
|
||||||
|
|
||||||
|
private ExcelAlign excelAlign = new NoExcelAlign();
|
||||||
|
private ExcelColor foregroundColor = new NoExcelColor();
|
||||||
|
private ExcelBorders excelBorders = new NoExcelBorders();
|
||||||
|
|
||||||
|
public ExcelCellStyleConfigurer() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExcelCellStyleConfigurer excelAlign(ExcelAlign excelAlign) {
|
||||||
|
this.excelAlign = excelAlign;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExcelCellStyleConfigurer foregroundColor(int red, int blue, int green) {
|
||||||
|
this.foregroundColor = DefaultExcelColor.rgb(red, blue, green);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExcelCellStyleConfigurer excelBorders(ExcelBorders excelBorders) {
|
||||||
|
this.excelBorders = excelBorders;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void configure(CellStyle cellStyle) {
|
||||||
|
excelAlign.apply(cellStyle);
|
||||||
|
foregroundColor.applyForeground(cellStyle);
|
||||||
|
excelBorders.apply(cellStyle);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
package com.lannstark.utils;
|
||||||
|
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public final class SuperClassReflectionUtils {
|
||||||
|
|
||||||
|
private SuperClassReflectionUtils() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<Field> getAllFields(Class<?> clazz) {
|
||||||
|
List<Field> fields = new ArrayList<>();
|
||||||
|
for (Class clazzInClasses : getAllClassesIncludingSuperClasses(clazz, true)) {
|
||||||
|
fields.addAll(Arrays.asList(clazzInClasses.getDeclaredFields()));
|
||||||
|
}
|
||||||
|
return fields;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Annotation getAnnotation(Class<?> clazz,
|
||||||
|
Class<? extends Annotation> targetAnnotation) {
|
||||||
|
for (Class clazzInClasses : getAllClassesIncludingSuperClasses(clazz, false)) {
|
||||||
|
if (clazzInClasses.isAnnotationPresent(targetAnnotation)) {
|
||||||
|
return clazzInClasses.getAnnotation(targetAnnotation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Field getField(Class<?> clazz, String name) throws Exception {
|
||||||
|
for (Class clazzInClasses : getAllClassesIncludingSuperClasses(clazz, false)) {
|
||||||
|
for (Field field : clazzInClasses.getDeclaredFields()) {
|
||||||
|
if (field.getName().equals(name)) {
|
||||||
|
return clazzInClasses.getDeclaredField(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new NoSuchFieldException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<Class> getAllClassesIncludingSuperClasses(Class<?> clazz, boolean fromSuper) {
|
||||||
|
List<Class> classes = new ArrayList<>();
|
||||||
|
while (clazz != null) {
|
||||||
|
classes.add(clazz);
|
||||||
|
clazz = clazz.getSuperclass();
|
||||||
|
}
|
||||||
|
if (fromSuper) {
|
||||||
|
Collections.reverse(classes);
|
||||||
|
}
|
||||||
|
return classes;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user