前面讲述了使用POI导出Word文件和读取Excel文件,这两个例子都相对简单,接下来要讲述的使用POI导出Excel文件要复杂得多,内容也会比较长。
创建表头信息
表头信息用于自动生成表头结构及排序
public class ExcelHeader implements Comparable{
/**
* excel的标题名称
*/
private String title;
/**
* 每一个标题的顺序
*/
private int order;
/**
* 说对应方法名称
*/
private String methodName;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getOrder() {
return order;
}
public void setOrder(int order) {
this.order = order;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public int compareTo(ExcelHeader o) {
return order>o.order?1:(order
}
public ExcelHeader(String title, int order, String methodName) {
super();
this.title = title;
this.order = order;
this.methodName = methodName;
}
}
表头信息的Annotation
/**
* 用来在对象的get方法上加入的annotation,通过该annotation说明某个属性所对应的标题
* Created by 钟述林 on 2016/10/29 0:14.
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelResources {
/**
* 属性的标题名称
* @return
*/
String title();
/**
* 在excel的顺序
* @return
*/
int order() default 9999;
}
创建数据实体
public class WebDto {
//网站名称
private String name;
//网址
private String url;
//用户名
private String username;
//密码
private String password;
//日均访问量
private Integer readCount;
public WebDto(String name, String url, String username, String password, Integer readCount) {
this.name = name;
this.url = url;
this.username = username;
this.password = password;
this.readCount = readCount;
}
public WebDto() {}
@Override
public String toString() {
return "WebDto{" +
"name='" + name + '\'' +
", url='" + url + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
", readCount=" + readCount +
'}';
}
@ExcelResources(title="网站名称",order=1)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ExcelResources(title="网址",order=2)
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@ExcelResources(title="用户名",order=3)
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@ExcelResources(title="密码",order=4)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@ExcelResources(title="日均访问量",order=5)
public Integer getReadCount() {
return readCount;
}
public void setReadCount(Integer readCount) {
this.readCount = readCount;
}
}
注意:这里使用到了@ExcelResources来自动识别表头信息及序号
获取模板文件的工具类
public class TemplateFileUtil {
public static FileInputStream getTemplates(String tempName) throws FileNotFoundException {
return new FileInputStream(ResourceUtils.getFile("classpath:excel-templates/"+tempName));
}
}
注意:从这里可以看出,所有的Excel模板文件都放在resources/excel-templates/目录下。
模板工具类
通过此类可以自动复制表样式等功能
/**
* 该类实现了基于模板的导出
* 如果要导出序号,需要在excel中定义一个标识为sernums
* 如果要替换信息,需要传入一个Map,这个map中存储着要替换信息的值,在excel中通过#来开头
* 要从哪一行那一列开始替换需要定义一个标识为datas
* 如果要设定相应的样式,可以在该行使用styles完成设定,此时所有此行都使用该样式
* 如果使用defaultStyls作为表示,表示默认样式,如果没有defaultStyles使用datas行作为默认样式
* Created by 钟述林 393156105@qq.com on 2016/10/28 23:38.
*/
public class ExcelTemplate {
/**
* 数据行标识
*/
public final static String DATA_LINE = "datas";
/**
* 默认样式标识
*/
public final static String DEFAULT_STYLE = "defaultStyles";
/**
* 行样式标识
*/
public final static String STYLE = "styles";
/**
* 插入序号样式标识
*/
public final static String SER_NUM = "sernums";
private static ExcelTemplate et = new ExcelTemplate();
private Workbook wb;
private Sheet sheet;
/**
<