2

Jersey を使用して XSSFWorkbook を作成しようとしています。

次のヘッダーを試しましたが、何も機能していないようです。

@Produces("アプリケーション/xml")

@Produces("application/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 応答を使用する代わりに、Jersey にそれを書き出させることを望んでいました。

ご協力ありがとうございました。

(私はジャージーと XSSF に少し慣れていないので、用語や理解が間違っている場合はご容赦ください)

4

2 に答える 2

2

Jersey経由でStreamingOutputを返すことで問題を解決できました。次に、StreamingOutput のバイトを OutputStream に書き出しました。OutputStream から byte[] を取得し、その 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();
        }
    }
于 2012-07-17T22:00:27.960 に答える
2

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>

Jersey は、この特定の形式を作成するために、独自のライターを作成します。申し訳ありませんが、XSSFWorkbook については何も知りません。

うまくいけば、あなたの問題を解決します。

于 2012-07-17T18:02:35.787 に答える