96SEO 2026-02-20 09:39 10
pIdartifactIdeasyexcel/artifactId/dependency实现功能

结合Vue前端实现浏览器页面直接导出日志文件实现文件的灵活导入文件导出
实体类里有自定义转换器用于Java类型数据和Excel类型数据的转换非常使用。
结合注解可以非常方便的进行Excel文件导出。
/***
实体类中如果使用Accessorychaintrue,那么导入的数据无法填充到实例中,导出数据不受影响*/
operUserId;ExcelProperty({操作日志,
operUserName;ExcelProperty({操作日志,
operMethod;ExcelProperty({操作日志,
operRequWay;ExcelProperty(value
CustomRequestTimeConverter.class)ApiModelProperty(value
operRequTime;ExcelProperty({操作日志,
operRequParams;ExcelProperty({操作日志,
operRequBody;ExcelProperty({操作日志,
operRequIp;ExcelProperty({操作日志,
operRequUrl;ExcelProperty(value
CustomLogFlagConverter.class)ApiModelProperty(value
操作状态:1-成功,0-失败)TableField(value
success;ExcelIgnoreApiModelProperty(value
CustomTimeFormatConverter.class)ApiModelProperty(value
导出操作日志,写出到响应流中)ApiOperation(value
true)PostMapping(/oper/export)public
{operationalLogService.operLogExport(logIds,
自定义导出策略HorizontalCellStyleStrategy自定义导出拦截器CellWriteHandler更加精确的自定义导出策略/***
operationalLogs;LambdaQueryWrapperOperationalLog
LambdaQueryWrapperOperationalLog().orderByDesc(OperationalLog::getGmtCreate);//
如果logIds不为null,按照id查询信息,否则查询全部if
(!CollectionUtils.isEmpty(logIds))
this.list(queryWrapper);}outputStream
获取单元格样式HorizontalCellStyleStrategy
MyCellStyleStrategy.getHorizontalCellStyleStrategy();//
写入响应输出流数据EasyExcel.write(outputStream,
OperationalLog.class).excelType(ExcelTypeEnum.XLSX).sheet(操作信息日志)//
LongestMatchColumnWidthStyleStrategy())
自适应列宽(不是很适应,效果并不佳).registerWriteHandler(strategy)
注册上面设置的格式策略.registerWriteHandler(new
设置自定义格式策略.doWrite(operationalLogs);}
{log.error(ExceptionUtils.getMessage(e));throw
BlogException(ResultCodeEnum.EXCEL_DATA_EXPORT_ERROR);}
getHorizontalCellStyleStrategy()
表头水平对齐居中headerCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);//
背景色headerCellStyle.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex());WriteFont
WriteFont();headerFont.setFontHeightInPoints((short)
14);headerCellStyle.setWriteFont(headerFont);//
自动换行headerCellStyle.setWrapped(Boolean.FALSE);//
设置数据允许的数据格式,这里49代表所有可以都允许设置contentCellStyle.setDataFormat((short)
为FillPatternType.SOLID_FOREGROUND
FillPatternType所以可以不指定contentCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);contentCellStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());//
设置内容靠左对齐contentCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);//
WriteFont();contentFont.setFontHeightInPoints((short)
12);contentCellStyle.setWriteFont(contentFont);//
设置自动换行contentCellStyle.setWrapped(Boolean.FALSE);//
设置边框样式和颜色contentCellStyle.setBorderLeft(MEDIUM);contentCellStyle.setBorderTop(MEDIUM);contentCellStyle.setBorderRight(MEDIUM);contentCellStyle.setBorderBottom(MEDIUM);contentCellStyle.setTopBorderColor(IndexedColors.RED.getIndex());contentCellStyle.setBottomBorderColor(IndexedColors.GREEN.getIndex());contentCellStyle.setLeftBorderColor(IndexedColors.YELLOW.getIndex());contentCellStyle.setRightBorderColor(IndexedColors.ORANGE.getIndex());//
HorizontalCellStyleStrategy(headerCellStyle,
LoggerFactory.getLogger(CustomCellWriteHandler.class);Overridepublic
beforeCellCreate(WriteSheetHolder
afterCellCreate(WriteSheetHolder
afterCellDataConverted(WriteSheetHolder
设置第一行第一列的头超链接到EasyExcel的官网(本系统的导出的excel
afterCellDispose(WriteSheetHolder
cell.getColumnIndex());CreationHelper
writeSheetHolder.getSheet().getWorkbook().getCreationHelper();Hyperlink
helper.createHyperlink(HyperlinkType.URL);hyperlink.setAddress(https://github.com/alibaba/easyexcel);cell.setHyperlink(hyperlink);}//
(cell.getStringCellValue().equals(请求参数)
cell.getStringCellValue().equals(请求Body));if
{logger.info(第{}行第{}列单元格样式设置完成。
,
writeSheetHolder.getSheet().getWorkbook();CellStyle
workbook.createCellStyle();Font
workbook.createFont();cellFont.setBold(Boolean.TRUE);cellFont.setFontHeightInPoints((short)
14);cellFont.setColor(IndexedColors.SEA_GREEN.getIndex());cellStyle.setFont(cellFont);cell.setCellStyle(cellStyle);}}
前端在基于VueElement的基础上实现了点击导出按钮在浏览器页面进行下载。
//
[]this.multipleSelection.forEach(item
/admin/blog/log/oper/export,method:
type类型可以设置为文本类型这里是新版excel类型const
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charsetutf-8
window.URL.createObjectURL(blob)const
document.createElement(a)link.href
pdfUrllink.setAttribute(download,
fileName)document.body.appendChild(link)link.click()window.URL.revokeObjectURL(pdfUrl)
浏览器兼容方法window.navigator.msSaveBlob(blob,
fileName)}})}测试结果还行基本实现了页面下载的功能
LoggerFactory.getLogger(MyExcelImportConfig.class);/***
JacksonUtils.objToString(data));list.add(data);if
doAfterAllAnalysed(AnalysisContext
list.size());list.forEach(System.out::println);logger.info(
获取其他异常下会调用本接口。
我们如果捕捉并手动抛出异常则停止读取。
如果这里不抛出异常则
exception;logger.error(第{}行第{}列数据解析异常,
convertException.getRowIndex(),
convertException.getColumnIndex());}}}
true)PostMapping(/import)public
{EasyExcel.read(file.getInputStream(),
MyExcelImportConfig(operationalLogService)).sheet().doRead();return
R.ok().message(文件导入成功);}附上自定义属性转换器
转换器的属性内容转换需要根据自己的实际业务需求而定这里仅作为简单示例
excel内部的数据类型,因为请求耗时是long类型,对应excel是NUMBER类型,但是加上ms后对应的是STRING类型**
cellData.getStringValue();return
Long.valueOf(value.substring(0,
CellData(String.valueOf(value).concat(ms));}
CellDataTypeEnum.STRING;}Overridepublic
cellData.getStringValue();return
DatePattern.NORM_DATETIME_PATTERN);}Overridepublic
CellData(DateUtil.format(value,
DatePattern.NORM_DATETIME_PATTERN));}
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback