2

Java を使用して空白の docx ファイルを生成し、テキストを追加してから、ドキュメント処理エンジン (PL/SQL と Java のカスタム混乱) に返すことができる BLOB に書き込もうとしています。Oracle 10g 内で 1.4 JVM を使用する必要があるため、Java 1.5 は使用しません。ローカル マシン上のファイルに docx を書き込むのに問題はありませんが、BLOB に書き込もうとするとゴミが発生します。私は愚かなことをしていますか?どんな助けでも大歓迎です。以下のコードでは、すべての get[name]Xml() メソッドが org.w3c.dom.Document を返すことに注意してください。

public void save(String fileName) throws Exception {
    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(fileName));
    addEntry(zos, getDocumentXml(), "word/document.xml");
    addEntry(zos, getContentTypesXml(), "[Content_Types].xml");
    addEntry(zos, getRelsXml(), "_rels/.rels");
    zos.flush();
    zos.close();
}

public java.sql.BLOB save() throws Exception {
    java.sql.Connection conn = DbUtilities.openConnection();
    BLOB outBlob = BLOB.createTemporary(conn, true, BLOB.DURATION_SESSION);
    outBlob.open(BLOB.MODE_READWRITE);
    ZipOutputStream zos = new ZipOutputStream(outBlob.setBinaryStream(0L));
    addEntry(zos, getDocumentXml(), "word/document.xml");
    addEntry(zos, getContentTypesXml(), "[Content_Types].xml");
    addEntry(zos, getRelsXml(), "_rels/.rels");
    zos.flush();
    zos.close();
    return outBlob;
}

private void addEntry(ZipOutputStream zos, Document doc, String fileName) throws Exception {
    Transformer t = TransformerFactory.newInstance().newTransformer();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    t.transform(new DOMSource(doc), new StreamResult(baos));
    ZipEntry ze = new ZipEntry(fileName);
    byte[] data = baos.toByteArray();
    ze.setSize(data.length);
    zos.putNextEntry(ze);
    zos.write(data);
    zos.flush();
    zos.closeEntry();
}
4

1 に答える 1

0

問題はドキュメント処理エンジンにあったようです。圧縮されたdocxが必要でした。コードを適切に文書化できたことをうれしく思います。

とにかく、私の問題を見てくれたみんなに感謝します。

于 2010-03-12T01:30:14.940 に答える