Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

不同linux镜像版本下的fastexcel导出功能存在报错情况 #221

Open
jackhongf opened this issue Feb 8, 2025 · 2 comments
Open
Assignees
Labels
documentation Improvements or additions to documentation suggest Suggestion

Comments

@jackhongf
Copy link

jackhongf commented Feb 8, 2025

背景信息:
框架: springboot 3.3.5
fastexcel版本: 1.0.0
jdk版本: 21

controller 代码 : 目的是为了导出一个excel 模板

@RestController
@RequestMapping("/test")
public class TestController {
    @PostMapping("/downloadTemplate1")
    public void downloadTemplate3(HttpServletResponse response) throws IOException {
        String fileName = "名单上传模板" + System.currentTimeMillis() + ".xlsx";
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        String excelFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8).replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + excelFileName);
        FastExcel.write(response.getOutputStream(), RskListDataExcelDTO.class)
                .sheet("名单列表")
                .doWrite(ListUtil.empty());
    }

@Data
public class RskListDataExcelDTO {
    /**
     * 列表内容
     */
    @ColumnWidth(20)
    @ExcelProperty(value = "名单列表", order = 1)
    private String content;
}

dockerfile 使用的镜像源为 : FROM dragonwell-registry.cn-hangzhou.cr.aliyuncs.com/dragonwell/dragonwell:21-standard-ga-alpine
使用 21-standard-ga-alpine 会报错 :

org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.util.LinkedHashMap] with preset Content-Type 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
        at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:319)
        at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:245)
        at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:136)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)
        at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
        at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:632)
        at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:510)
        at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:453)
        at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:343)
        at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:222)
        at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:308)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:149)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
        at java.base/java.lang.Thread.run(Thread.java:1583)
(END)

dockerfile 使用的镜像源为 :FROM crpi-oyqw71u5mmq03esl.cn-shanghai.personal.cr.aliyuncs.com/cssk/liberica-openjdk-debian:21-cds
liberica-openjdk-debian:21-cds 下的fastexcel 可以正常的下载出.

还请大佬分析下,fastexcel 会跟linux发行版本有关系吗? 会不会是因为 liberica-openjdk-debian:21-cds 自带字体库的原因?

@jackhongf
Copy link
Author

大佬, 目前我自己用排除法的方式,排查下来, 应该是因为 在使用 dragonwell:21-standard-ga-alpine 镜像是没有字体的, 会报错如上错误, 在当前dockerfile 内执行安装字体库的 命令, RUN echo "#aliyun" > /etc/apk/repositories RUN echo "https://mirrors.aliyun.com/alpine/v3.9/main/" >> /etc/apk/repositories RUN echo "https://mirrors.aliyun.com/alpine/v3.9/community/" >> /etc/apk/repositories #安装必要软件 RUN apk update RUN apk add ttf-dejavu fontconfig
在这个运行环境下不回报这个错误. 这个错误报的特别隐晦, 很难发现是因为字体原因造成的。 我是在当前项目另外一个组件使用poi方式导出报错,系统缺少字体库的报错才联想到 fastexcel导出的这个问题。

@psxjoy
Copy link
Member

psxjoy commented Feb 10, 2025

Thanks a lot for your feedback and troubleshooting!
Maybe we should add font installation steps to the documentation,
or consider not loading extra Chinese fonts by default?
@zhuangjiaju @Chat2DB-Pro

@psxjoy psxjoy added documentation Improvements or additions to documentation suggest Suggestion labels Feb 10, 2025
@psxjoy psxjoy self-assigned this Feb 10, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation suggest Suggestion
Projects
None yet
Development

No branches or pull requests

2 participants