• easyexecl导出100万行execl报字体错误的解决办法


    使用easyexecl做100万行csv的导出,会报两个错误,都是因为openjdk精简版安装到docker内部,缺少字体的问题。

    错误明细:

    /usr/local/openjdk-17/lib/libfontmanager.so: libfreetype.so.6: cannot open shared object file: No such file or directory
    
    • 1
    2022-06-24 14:39:00.045  INFO 1 --- [nio-5010-exec-2] c.f.b.b.c.BillingDetailController        : 导出execl1656081540043
    2022-06-24 14:39:05.980 ERROR 1 --- [nio-5010-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.alibaba.excel.exception.ExcelGenerateException: java.lang.UnsatisfiedLinkError: /usr/local/openjdk-17/lib/libfontmanager.so: libfreetype.so.6: cannot open shared object file: No such file or directory] with root cause
    
    java.lang.UnsatisfiedLinkError: /usr/local/openjdk-17/lib/libfontmanager.so: libfreetype.so.6: cannot open shared object file: No such file or directory
     at java.base/jdk.internal.loader.NativeLibraries.load(Native Method) ~[na:na]
     at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:388) ~[na:na]
     at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:232) ~[na:na]
     at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:174) ~[na:na]
     at java.base/jdk.internal.loader.NativeLibraries.findFromPaths(NativeLibraries.java:315) ~[na:na]
     at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:285) ~[na:na]
     at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2398) ~[na:na]
     at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:818) ~[na:na]
     at java.base/java.lang.System.loadLibrary(System.java:1989) ~[na:na]
     at java.desktop/sun.font.FontManagerNativeLibrary$1.run(FontManagerNativeLibrary.java:58) ~[na:na]
     at java.base/java.security.AccessController.doPrivileged(AccessController.java:318) ~[na:na]
     at java.desktop/sun.font.FontManagerNativeLibrary.<clinit>(FontManagerNativeLibrary.java:33) ~[na:na]
     at java.desktop/sun.font.SunFontManager$1.run(SunFontManager.java:275) ~[na:na]
     at java.desktop/sun.font.SunFontManager$1.run(SunFontManager.java:273) ~[na:na]
     at java.base/java.security.AccessControlle
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    或者

    java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11FontManager
    
    • 1
    nerateException: java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11FontManager] with root cause
    
    java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11FontManager
     at java.base/java.lang.Class.forName0(Native Method) ~[na:na]
     at java.base/java.lang.Class.forName(Class.java:467) ~[na:na]
     at java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83) ~[na:na]
     at java.base/java.security.AccessController.doPrivileged(AccessController.java:318) ~[na:na]
     at java.desktop/sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:75) ~[na:na]
     at java.desktop/java.awt.Font.getFont2D(Font.java:526) ~[na:na]
     at java.desktop/java.awt.Font.canDisplayUpTo(Font.java:2282) ~[na:na]
     at java.desktop/java.awt.font.TextLayout.singleFont(TextLayout.java:469) ~[na:na]
     at java.desktop/java.awt.font.TextLayout.<init>(TextLayout.java:530) ~[na:na]
     at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:273) ~[poi-4.1.2.jar:4.1.2]
     at org.apache.poi.xssf.streaming.AutoSizeColumnTracker.<init>(AutoSizeColumnTracker.java:117) ~[poi-ooxml-4.1.2.jar:4.1.2]
     at org.apache.poi.xssf.streaming.SXSSFSheet.<init>(SXSSFSheet.java:82) ~[poi-ooxml-4.1.2.jar:4.1.2]
     at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:684) ~[poi-ooxml-4.1.2.jar:4.1.2]
     at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:705) ~[poi-ooxml-4.1.2.jar:4.1.2]
     at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:88) ~[poi-ooxml-4.1.2.jar:4.1.2]
     at com.alibaba.excel.util.WorkBookUtil.createSheet(WorkBookUtil.java:84) ~[easyexcel-core-3.1.1.jar:na]
     at com.alibaba.excel.context.WriteContextImpl.createSheet(WriteContextImpl.java:223) ~[easyexcel-core-3.1.1.jar:na]
     at com.alibaba.excel.context.WriteContextImpl.initSheet(WriteContextImpl.java:182) ~[easyexcel-core-3.1.1.jar:na]
     at com.alibaba.excel.context.WriteContextImpl.currentSheet(WriteContextImpl.java:135) ~[easyexcel-core-3.1.1.ja
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    需要重新做一个镜像,以openjdk17为例

    1、编辑dockerfile文件

    
    FROM openjdk:17-alpine
    
    # 解决easyExcel导出缺少字体bug
    RUN apk add --update ttf-dejavu fontconfig && rm -rf /var/cache/apk/*
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、IDEA配置docker插件

    安装步骤可以自己google一下
    在这里插入图片描述

    在这里插入图片描述

    3、安装Docker Desktop

    安装配置及其注册,可以google查询
    在这里插入图片描述
    在这里插入图片描述

    4、运行dockerfile

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    5、推送并查看docker-hub上是否有了,注意一定要以自己的用户名字打tag,要不然会推送失败

    在这里插入图片描述
    在这里插入图片描述

    6 、登录到需要的此镜像的服务器,将镜像拉下来或者配置gradle自动拉取镜像

    在这里插入图片描述
    或者配置依赖的镜像
    在这里插入图片描述

    7、重新部署应用,重新启动,即不报错

    在这里插入图片描述

    附注:esayExcel的导出代码

    /**
    	 * 导出excel
    	 */
    	@RequestMapping("/xxxexportcsv100")
    	fun export(response: HttpServletResponse) {
    		val startTime = System.currentTimeMillis()
    		logger.info("导出execl$startTime")
    		val outputStream: OutputStream = response.outputStream
    		val time = SimpleDateFormat("yyyy-MM-dd-hh-mm-ss").format(Date())
    		response.setHeader("Content-disposition", "attachment; filename=contract$time.xlsx")
    		response.contentType = "application/octet-stream;charset=UTF-8"
    		response.setHeader("Pragma", "No-cache")
    		response.setHeader("Cache-Control", "no-cache")
    		response.setDateHeader("Expires", 0)
    		val count: Int = billingDetailService.countByIdIsNotNull()
    		//如果总数据量多余10万,分页导出
    		if (count > 100000) {
    			//每页多少个
    			val max = 100000
    			//必须放到循环外,否则会刷新流
    			val excelWriter: ExcelWriter = EasyExcel.write(outputStream).build()
    			for (i in 0 until count / max + 1) {
    
    				val exportList: List<BillingDetailResourceDto> = billingDetailService.findAllBySize(i, max)
    
    				val writeSheet: WriteSheet =
    					EasyExcel.writerSheet(i, "账单" + (i + 1)).head(BillingDetailResourceDto::class.java)
    						.registerWriteHandler(LongestMatchColumnWidthStyleStrategy()).build()
    				excelWriter.write(exportList, writeSheet)
    				logger.info("100000行===${System.currentTimeMillis()}")
    			}
    			//刷新流
    			excelWriter.finish()
    		} else {
    			val exportList: List<BillingDetailResourceDto> = billingDetailService.findAllBySize(0, count)
    			EasyExcel.write(outputStream, BillingDetailResourceDto::class.java)
    				.registerWriteHandler(LongestMatchColumnWidthStyleStrategy()).sheet("账单").doWrite(exportList)
    		}
    		outputStream.flush()
    		response.outputStream.close()
    		val endTime = System.currentTimeMillis()
    		logger.info("导出execl结束$endTime==耗时=${endTime - startTime}")
    
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
  • 相关阅读:
    2023最全的性能测试种类介绍,这6个种类特别重要!
    【3D游戏建模全流程教学】在 ZBrush、Maya 和 Arnold 中制作雪矮人
    第十三届蓝桥杯 C++ B 组省赛 F 题——统计子矩阵 (AC)
    day08-注册功能、前端登录注册页面复制、前端登录功能、前端注册功能
    考研系列-数据结构第四章:字符串
    去耦电路设计应用指南(四)电源 PDN 配置
    Centos7 安装keepalived
    华为智能企业上网行为管理安全解决方案(2)
    家庭实验室系列文章-电脑如何配置网络唤醒 (WOL)?
    【自己犯过的蠢代码】
  • 原文地址:https://blog.csdn.net/sunyuhua_keyboard/article/details/125482353