【SpringBoot】SpringBoot中自定义注解的使用及后端进行Excel的生成、下载操作

1、创建一个自定义的注解

创建自定义注解的过程与创建一般类的过程差不多,项目上右键——>new——>annotation,然后页面上弹出如下的界面:

在这个弹窗上,主要介绍下上述123位置处的三个注解:

  • @Target
    指示这个注解的使用范围,即被描述的注解可以用在哪里,常用的值如下:
TYPE:类,接口或者枚举
FIELD:属性字段,包含枚举常量
METHOD:方法
PARAMETER:参数
CONSTRUCTOR:构造方法
LOCAL_VARIABLE:局部变量
ANNOTATION_TYPE:注解类型
PACKAGE:
  • @Retention
    指明修饰的注解的生存周期,即会保留到哪个阶段,常用的值如下:
SOURCE:源码级别保留,编译后即丢弃
CLASS:编译级别保留,编译后的class文件中存在,在jvm运行时丢弃,这是默认值。
RUNTIME: 运行级别保留,编译后的class文件中存在,在jvm运行时保留,可以被反射调用。
  • @Documented
    表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中,是一个标记注解,没有成员。

创建生成的注解类如下所示:

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对象,从而来获取类方法和字段的注解信息。

2、自定义注解的使用

完成了第一步就可以使用注解了,这里借助一个将表格数据下载到本地Excel表格的开发实例来阐述自定义注解的使用,在Java中Excel表格的开发需要用到apache POI这个组件,这里只介绍使用,其他的信息可以参考官网,地址:apache POI ;在项目中引入相关的依赖:

		<!-- apache POI -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>4.0.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>4.0.1</version>
		</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();
	}

猜你喜欢

转载自blog.csdn.net/qgnczmnmn/article/details/107319994
今日推荐