我试图使用产生泽西岛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,所以请容忍我,如果我关上我的术语或理解)
你需要编写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。
希望能解决你的问题。
我能够通过泽西返回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();
}
}