创建自定义注解的过程与创建一般类的过程差不多,项目上右键——>new——>annotation,然后页面上弹出如下的界面:
在这个弹窗上,主要介绍下上述123位置处的三个注解:
TYPE:类,接口或者枚举
FIELD:属性字段,包含枚举常量
METHOD:方法
PARAMETER:参数
CONSTRUCTOR:构造方法
LOCAL_VARIABLE:局部变量
ANNOTATION_TYPE:注解类型
PACKAGE:包
SOURCE:源码级别保留,编译后即丢弃
CLASS:编译级别保留,编译后的class文件中存在,在jvm运行时丢弃,这是默认值。
RUNTIME: 运行级别保留,编译后的class文件中存在,在jvm运行时保留,可以被反射调用。
创建生成的注解类如下所示:
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Documented
@Retention(RUNTIME)
@Target(FIELD)
public @interface ExcelField {
/**
* excel表的列名
* @return
*/
String columnName() default "";
/**
* 设置excel的列号
* @return
*/
int index() default 1;
/**
* 设置excel的列宽
* @return
*/
int columnWidth() default 7000;
}
自定义注解的创建规则:
(1)注解类中参数成员只能用public或默认(default)这两个访问权修饰;
(2)参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String、Enum、Class、annotations等数据类型,以及这一些类型的数组;
(3)通过Java的反射技术来获取 -Annotation对象,从而来获取类方法和字段的注解信息。
完成了第一步就可以使用注解了,这里借助一个将表格数据下载到本地Excel表格的开发实例来阐述自定义注解的使用,在Java中Excel表格的开发需要用到apache POI这个组件,这里只介绍使用,其他的信息可以参考官网,地址:apache POI ;在项目中引入相关的依赖:
<dependency>
<groupId>org.apache.poigroupId>
<artifactId>poiartifactId>
<version>4.0.1version>
dependency>
<dependency>
<groupId>org.apache.poigroupId>
<artifactId>poi-ooxmlartifactId>
<version>4.0.1version>
dependency>
在Model层的实例中使用自定的注解来标注实例中的字段:
@Data
public class User {
@ExcelField(columnName="姓名",index=1,columnWidth=5000)
private String username;
@ExcelField(columnName="邮箱",index=3)
private String email;
@ExcelField(columnName="手机号",index=2)
private String mobileNumber;
.....其他的字段的就不一一列举了
}
POI的使用:
/**
* 生成一个XSSFWorkBook对象
* @param users
* @return
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
private XSSFWorkbook createExcelWorkBook(List<User> users) throws IllegalArgumentException, IllegalAccessException {
// 创建workbook
XSSFWorkbook wb = new XSSFWorkbook();
// 设置基本样式
XSSFCellStyle basicStyle=ExcelUtils.getStyle(wb, false);
basicStyle.setWrapText(true);// 设置单元格中的数据可以多行显示
// 创建sheet
XSSFSheet sheet=wb.createSheet("sheet名称");
// 先创建一个表头行
XSSFRow headRow=sheet.createRow(0);
headRow.setHeightInPoints(30);
// 编号单元格
ExcelUtils.createCell(0, "编号", headRow, basicStyle);
Field[] fields=User.class.getDeclaredFields();
for (int i = 0; i <fields.length; i++) {
fields[i].setAccessible(true);
ExcelField excelField=fields[i].getAnnotation(ExcelField.class);
if (excelField!=null) {
ExcelUtils.createCell(excelField.index(), excelField.columnName(), headRow, basicStyle);
sheet.setColumnWidth(excelField.index(), excelField.columnWidth());
}
}
int rowNum=1;
for (; rowNum < users.size()+1; rowNum++) {
// 创建行
XSSFRow dataRow=sheet.createRow(rowNum);
dataRow.setHeightInPoints(18);
// 设置编号列
ExcelUtils.createCell(0, String.valueOf(rowNum), dataRow, basicStyle);
// 添加其他数据列单元格
for (int i = 0; i<fields.length ; i++) {
fields[i].setAccessible(true);
ExcelField excelField=fields[i].getAnnotation(ExcelField.class);
if (excelField!=null) {
Object obj=fields[i].get(users.get(rowNum-1));
ExcelUtils.createCell(excelField.index(), obj, dataRow, basicStyle);
}
}
}
return wb;
}
这里我们用到了一个工具类(ExcelUtils),用于设置excel的基本格式:
public class ExcelUtils {
/**
* 设置Excel表格的基本样式
* @param workbook
* @param isSuperLink
* @return
*/
public static XSSFCellStyle getStyle(XSSFWorkbook workbook, boolean isSuperLink) {
// 设置字体;
XSSFFont font = workbook.createFont();
// 设置字体大小;
font.setFontHeightInPoints((short) 10);
// 设置字体名字;
font.setFontName("simsun");
// font.setItalic(true);
// font.setStrikeout(true);
if (isSuperLink) {
font.setUnderline((byte) 1);
font.setColor(IndexedColors.BLUE.index);
}
// 设置样式;
XSSFCellStyle style = workbook.createCellStyle();
// 设置底边框;
style.setBorderBottom(BorderStyle.THIN);
// 设置底边框颜色;
style.setBottomBorderColor(IndexedColors.BLACK.index);
// 设置左边框;
style.setBorderLeft(BorderStyle.THIN);
// 设置左边框颜色;
style.setLeftBorderColor(IndexedColors.BLACK.index);
// 设置右边框;
style.setBorderRight(BorderStyle.THIN);
// 设置右边框颜色;
style.setRightBorderColor(IndexedColors.BLACK.index);
// 设置顶边框;
style.setBorderTop(BorderStyle.THIN);
// 设置顶边框颜色;
style.setTopBorderColor(IndexedColors.BLACK.index);
// 在样式用应用设置的字体;
style.setFont(font);
// 设置自动换行;
style.setWrapText(false);
// 设置水平对齐的样式为居中对齐;
style.setAlignment(HorizontalAlignment.CENTER);
// 设置垂直对齐的样式为居中对齐;
style.setVerticalAlignment(VerticalAlignment.CENTER);
return style;
}
public static XSSFCell createCell(int cellnum, Object value, XSSFRow row,XSSFCellStyle style) {
XSSFCell cell = row.createCell(cellnum);
if (value == null) {
cell.setCellValue("");
cell.setCellStyle(style);
return cell;
}
if (value.getClass().getName().equals("java.lang.String")) {
cell.setCellValue(new XSSFRichTextString(value.toString()));
}else if (value.getClass().getName().equals("java.lang.Double")) {
cell.setCellValue((Double) value);
}else if (value.getClass().getName().equals("java.lang.Integer")) {
cell.setCellValue((Integer) value);
}else if (value.getClass().getName().equals("java.lang.Long")) {
cell.setCellValue((Long) value);
}else if (value.getClass().getName().equals("java.math.BigDecimal")) {
cell.setCellValue(((BigDecimal) value).doubleValue());
}else if (value.getClass().getName().equals("java.util.Date")) {
cell.setCellValue(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(value));
}
cell.setCellStyle(style);
return cell;
}
}
测试下载:
List<User> users = .........获取User集合;
XSSFWorkbook xssfWorkbook = createExcelWorkBook(users);
String fileName = "User-Informations" + System.nanoTime() + ".xlsx";
// 设置响应头,让浏览器下载文件
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
OutputStream output = response.getOutputStream();
xssfWorkbook.write(output);
output.flush();
output.close();
前端请求方式:
function sendMessage() {
var url = "http://xxxxxxx/...";
var token="XXJJDNNCCJ";
var xhr = new XMLHttpRequest();
xhr.open('post', url, true);
xhr.setRequestHeader("Authorization", token);
xhr.responseType = "blob";
xhr.onload = function () {
if (this.status === 200) {
var blob = this.response;
console.log(blob);
var reader = new FileReader();
reader.readAsDataURL(blob);
reader.onload = function (e) {
var a = document.createElement('a');
a.download = '表格.xlsx';
a.href = e.target.result;
$("body").append(a);
a.click();
$(a).remove();
}
}else if(this.status === 401){
alert("未登录!");
}
};
xhr.send();
}