2012-07-17 2 views
2

저지를 사용하여 XSSFWorkbook을 제작하려고합니다. 나는 다음과 같은 헤더와 아무것도 시도저지 @Produces Apache XSSFWorkbook

가 작동하는 것 같다 :

@Produces ("응용 프로그램/XML")

@Produces ("응용 프로그램/vnd.openxmlformats-officedocument.spreadsheetml.sheet")

@Produces ("응용 프로그램/vnd.openxml"모든 다음과 같은 오류 반환

:

Caused by: com.sun.jersey.api.MessageException: A message body writer for Java class org.apache.poi.xssf.usermodel.XSSFWorkbook, and Java type class org.apache.poi.xssf.usermodel.XSSFWorkbook, and MIME media type application/xml was not found ... 37 more

필자는 XSSFWorkbook을 만드는 기능을 가지고 있으며 사용자가 다운로드 할 수 있도록 작성하고 싶습니다. 나는 그것을 할 수있다 :

그러나 나는 또한 다른 이유로 XSSFWorkbook을 반환하는 함수가 필요하다. Jersey가 웹 응답을 쓸 수 있도록 웹 응답을 사용하는 대신 바랬습니다.

도움 주셔서 감사합니다.

당신은 (하나 또는 찾기) XSSFWorkbook에 대한 사용자 정의 라이터를 작성해야

답변

2

과 플러그 (I 그래서 나는 내 용어 나 이해 오프입니다 경우에 저 참아주세요, 저지 및 XSSF 다소 새로운 오전) 뉴저지에 좋아 :

<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> 

뉴저지 것이다 당신의 O를 :

@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이 클래스의 패키지를 추가해야 이 특정 형식을 생성하는 작가. 죄송합니다. XSSFWorkbook에 대해 아무것도 모릅니다.

잘하면 문제를 해결할 것입니다.

+0

이 정확히 내가 필요한 것 같습니다! 불행히도 이미 다른 방식으로 구현했는데 아래에 게시 할 것입니다. 나는 나중에 그것을 시도 할 것이고 그것이 또한 효과가 있는지 알 것이다. 당신의 답변에 감사드립니다. – AlexIIP

+0

도와 줘서 기쁩니다 :-) –

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(); 
     } 
    }