编码技巧——导出工具类( 二 )

rowRef = new AtomicReference<>();List result = new LinkedList<>();for (int i = 0; i < data.size(); i++) {rowRef.set(i);List rowItems = Stream.of(clazz.getDeclaredFields()).parallel()// 先反射获取T的所有成员Field.peek(field -> field.setAccessible(true))// 打了注解才导出.filter(field -> {ExcelExport excelExport = field.getAnnotation(ExcelExport.class);return (null != excelExport);}).map(field -> {final String defaultCeilValue = http://www.kingceram.com/post/field.getAnnotation(ExcelExport.class).defaultCeilValue();try {Object item = data.get(rowRef.get());// 通过field.get(Object)反射获取Object的成员对象Object value = field.get(item);// 1. 为空值时填充表格默认值if (value == null) {return defaultCeilValue;}// 2. 对于Date类,转换Date类型的格式 yyyy-MM-dd HH:mm:ssif (field.getType().equals(Date.class)) {SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DateUtils.DATETIME_FORMAT_1);return simpleDateFormat.format((Date) value);}// [warning]防止格式自动转换,加了转义符return value.toString() +"\t";} catch (IllegalAccessException e) {log.error("IllegalAccessException! {}", e.getMessage());return null;}}).collect(Collectors.toList());result.add(rowItems);}return result;}/*** 获取属性名-列名*/public static synchronized List getHeaders(Class clazz) {List cachedHeaders = headersMap.get(clazz);if (CollectionUtils.isNotEmpty(cachedHeaders)) {return cachedHeaders;}List headers = new ArrayList<>();Field[] fields = clazz.getDeclaredFields();Stream.of(fields).forEach(field -> {// 每个属性获取其注解field.setAccessible(true);ExcelExport excelExport = field.getAnnotation(ExcelExport.class);// 未打注解则跳过该属性if (null == excelExport) {return;}// 否则取别名headers.add(StringUtils.isBlank(excelExport.alias()) ? field.getName() : excelExport.alias());});headersMap.put(clazz, headers);return headers;}/*** 获取编码的文件名*/public String getFileName(String fileName) {if (StringUtils.isEmpty(this.fileType)) {log.error("init before getFileName!");throw new RuntimeException();}fileName = StringUtils.isEmpty(fileName) ? StringUtils.EMPTY : fileName;String originFileName = fileName + DateUtil.toStringByFormat(new Date(), DateUtil.DATETIME_FORMAT_2).trim() + fileType;try {return new String(originFileName.getBytes("GBK"), StandardCharsets.ISO_8859_1);} catch (UnsupportedEncodingException e) {log.error("failed to encode export fileName!");throw new RuntimeException();}}}

编码技巧——导出工具类

文章插图
(4)实现类-导出为excel:
package com.AA.common.utils.exporter;import lombok.extern.slf4j.Slf4j;import org.apache.poi.xssf.usermodel.*;import java.io.IOException;import java.io.OutputStream;import java.util.List;/*** @author AA* @description excel导出工具* @date 2021/3/9*/@Slf4jpublic class ExcelExporter extends AbstractFileExporter {/*** excel文件对象*/private XSSFWorkbook workbook;/*** sheet单张表*/XSSFSheet sheet;/*** 初始化导出工具** @param clazz*/@Overridevoid initExporter(Class clazz) {workbook = new XSSFWorkbook();sheet = workbook.createSheet();List headers = getHeaders(clazz);buildTitle(sheet, headers);}/*** 填充数据行,数据可以是不对齐的** @param rows*/@Overridevoid writeRows(List rows) {int columns = getHeaders(clazz).size();for (int rownum = 0; rownum < rows.size(); rownum++) {XSSFRow row = sheet.createRow(rownum + 1);for (int col = 0; col < columns; col++) {row.createCell(col).setCellValue(rows.get(rownum).get(col));}}}/*** 写输出流** @param outputStream*/@Overridepublic void writeStream(OutputStream outputStream) {try {workbook.write(outputStream);} catch (IOException e) {log.error("failed to writeStream of Excel! e:{}", e.getMessage(), e);}}/*** 设置sheet的表头*/private static void buildTitle(XSSFSheet sheet, List headers) {int columns = headers.size();XSSFRow row = sheet.createRow(0);for (int i = 0; i < columns; i++) {XSSFCell cell = row.createCell(i);XSSFRichTextString text = new XSSFRichTextString(headers.get(i));cell.setCellValue(text);}}}