业务介绍
做一个时刻表的导出功能,数据模型都已经写好了。原型图大概是这样的一个意思。先看图:
大概设计是这个样子。
然后最后导出的成品是这个样子:
大概业务明确之后,我就开始进行实现了。
功能实现
我是参照了一个开源后台管理项目中的模板导出功能扒下来的,有兴趣的同学们可以去看看人家的代码。我觉得还可以,附带项目代码链接:链接: http://webflash.enilu.cn/.
- 依赖的jar:这个一定要注意版本号,我在这上面排坑拍了一上午,实际代码都没问题,但是在导出的时候会被各种异常困扰。后来总结复盘了一下就是因为版本号的问题导致的。下面展示一些
dependency
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>1.0.9</version>
</dependency>
<!--数据导出excel-->
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.8</version>
</dependency>
这个是我调查了很多帖子找到的能用的一个。有
poi
poi-ooxml
poi-ooxml-schemas
这三个依赖一定要3.8的我当时就不信邪,头铁各种debug到源码了发现根本行。都没那个模板导出的语法规则。
2. 一些有用的until。我这里用到了一些Until,我觉得也不错都写在这里吧 。
XlsUtils
:这个是为了表格上面进行格式化的,Jxls的句法跟JSTL的语法感觉很类似
/**
* @author wang hongyu
* @package_name signalsys-parent
* @date 2021/6/10
*/
public class XlsUtils {
public String dateFmt(Date date, String fmt) {
if (date == null) {
return "";
}
return DateUtil.formatDate(date,fmt);
}
/**
* 时间转换
* @param time
* @return
*/
public String handleTimeStr(Integer time) {
if (time==null){time=0;}
String timeStr=String.valueOf(time);
String timer= "";
if (timeStr.length()==6){
String hour=timeStr.substring(0,2);
String min =timeStr.substring(2,4);
String sec =timeStr.substring(4);
timer=hour+":"+min+":"+sec;
}else if (timeStr.length()==5){
String hour=timeStr.substring(0,1);
String min =timeStr.substring(1,3);
String sec =timeStr.substring(3);
timer=hour+":"+min+":"+sec;
}else{
timer=timeStr;
}
return timer;
}
public String handleRate(String late){
return late+"%";
}
public String handleTrainPlanCode(String scheduleCode,String trainPlanCode){
return scheduleCode+trainPlanCode;
}
public String handleLate(Integer late){
if (late!=null){
if (late != 0) {
int hour = late / (60 * 60);
int min = (late - (hour * 60 * 60)) / 60;
int sec = (late - (hour * 60 * 60) - (min * 60)) % (60 * 60);
if (hour < 0) {
return "+" + Math.abs(hour) + ":" + Math.abs(min) + ":" + Math.abs(sec);
} else if (hour>0) {
return "-" + Math.abs(hour) + ":" + Math.abs(min) + ":" + Math.abs(sec);
}else{
return Math.abs(hour) + ":" + Math.abs(min) + ":" + Math.abs(sec);
}
}
}
return "";
}
}
StringUtil
:字符串处理相关
public class StringUtil {
public static final String EMPTY = "";
private static final AtomicLong ORDER_SEQ = new AtomicLong(1);
private static final Pattern PATERN_IP = Pattern.compile("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)");
/**
* 是否为空字符
*/
public static boolean isEmpty(String str) {
if (str == null || str.trim().length() == 0) {
return true;
}
if ("null".equalsIgnoreCase(str) || "undefined".equalsIgnoreCase(str)) {
return true;
}
return false;
}
/**
* 是否为非空字符
*/
public static boolean isNotEmpty(String str) {
return (!isEmpty(str));
}
/**
* 判断是否为null或空字符
*/
public static boolean isNullOrEmpty(Object o) {
if (o == null) {
return true;
}
if (String.valueOf(o).replace((char) 12288, ' ').trim().length() == 0) {
return true;
}
if ("null".equals(o)) {
return true;
}
return false;
}
/**
* 判断是否不为null或非空字符
*/
public static boolean isNotNullOrEmpty(Object o) {
return !isNullOrEmpty(o);
}
// 根据Unicode编码完美的判断中文汉字和符号
priv