我正在尝试使用Jersey生产XSSFWorkbook。
我尝试了以下标头,但似乎没有任何效果:
@Produces(“ application / xml”)
@Produces(“ application / vnd.openxmlformats-officedocument.spreadsheetml.sheet”)
@Produces(“ application / 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。我希望不要使用网络响应,而让Jersey将其写出来。
谢谢您的帮助。
(我对Jersey和XSSF有点陌生,所以如果我对术语或理解不满意,请多多包涵)
最佳答案
您需要为XSSFWorkbook编写自定义作家(或找到一个作家),然后将其插入Jersey:
@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一无所知。
希望能解决您的问题。