新泽西@Produces阿帕奇XSSFWorkbook(Jersey @Produces Apach

2019-09-19 15:42发布

我试图使用产生泽西岛XSSFWorkbook。

我曾尝试以下标题和似乎没有任何工作:

@Produces( “应用程序/ XML”)

@Produces( “应用程序/ vnd.openxmlformats-officedocument.spreadsheetml.sheet”)

@Produces( “应用程序/ vnd.openxml”

所有返回以下错误:

com.sun.jersey.api.MessageException:消息正文作家Java类org.apache.poi.xssf.usermodel.XSSFWorkbook和Java类型的类org.apache.poi.xssf.usermodel.XSSFWorkbook和MIME所致媒体类型application / XML没有被发现... 37个

基本上我有创建XSSFWorkbook的功能,我想将它写出来供用户下载。 我能做到这一点的:

 /*
    HttpServletResponse response;
    XssfWorkbook excel.write(response.getOutputStream());
    */
    @GET
    @Path("/excel/")
    @Produces("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    public XSSFWorkbook exportReadingsAsExcel(@Context HttpServletResponse webResponse)
    {
        XSSFWorkbook excel = createExcel();
        setHeader(webResponse, "export.xlsx");
    try {
        excel.write(webResponse.getOutputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }
        return excel; //ERROR IS HERE
    }

但我也需要函数返回XSSFWorkbook其他原因。 我希望,而不是使用Web响应我可以写新泽西出来。

谢谢您的帮助。

(我有点新的新泽西州和XSSF,所以请容忍我,如果我关上我的术语或理解)

Answer 1:

你需要编写XSSFWorkbook您的自定义作家(或找到一个),并将其插入新泽西州这样的:

@Provider
@Produces("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
public class CustomXSSFWorkbookWriter implements MessageBodyWriter {
    //This methode is the most important for you
    @Override
public void writeTo(Object target, Class type, Type genericType,
        Annotation[] annotations, MediaType mediaType,
        MultivaluedMap httpHeaders, OutputStream outputStream)
        throws IOException {

然后,你有这个类的包添加到您web.xml是这样的:

<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.packages.to.your.views;com.packages.to.your.providers</param-value>
    </init-param>

新泽西州将你自己的作家产生这种特定的格式。 对不起,我不知道什么XSSFWorkbook。

希望能解决你的问题。



Answer 2:

我能够通过泽西返回StreamingOutput来解决这个问题。 然后,我写了StreamingOutput的字节到的OutputStream。 我从OutputStream的字节[]中写道,为OutputStream进入的InputStream,然后从InputStream中创建一个新的XSSFWorkbook。 我知道这是做的一个非常肮脏的方式。 我会尽量-Camille [R建议的方式上面什么我希望将是一个更清洁的解决方案。 但在此期间...

    @GET
    @Path("/excel/")
    @Produces("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    public StreamingOutput exportReadingsAsExcel(@Context HttpServletResponse webResponse)
    {
        XSSFWorkbook excel = createExcel();
        setHeader(webResponse, "export.xlsx");
        StreamingOutput streamOutput = new StreamingOutput(){
            public void write(OutputStream output) throws IOException, WebApplicationException {
                try {
                    excel.write(output);
                } catch (Exception e) {
                    throw new WebApplicationException(e);
                }
            }
        };
        return streamOutput;
      }

在接收器功能:

private XSSFWorkbook createExcel(StreamingOutput mStream){
        XSSFWorkbook excel = new XSSFWorkbook();
        try {
            ExcelOutputStream out = new ExcelOutputStream();
            excel.write(out);
            ByteArrayInputStream inputStream = new ByteArrayInputStream(out.getBytes());
            excel = new XSSFWorkbook(inputStream ;
        } catch (WebApplicationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
    class MyOutputStream extends OutputStream {
        private ByteArrayOutputStream myByteArray;
        public MyOutputStream(){
            myByteArray = new ByteArrayOutputStream();
        }
        @Override
        public void write(int b) throws IOException {
            // TODO Auto-generated method stub
            myByteArray.write(b);
        }
        public byte[] getBytes(){
            return myByteArray.toByteArray();
        }
    }


文章来源: Jersey @Produces Apache XSSFWorkbook