Java Oracle Blob到XLS工作表

Java Oracle Blob到XLS工作表,java,excel,oracle11g,apache-poi,ibatis,Java,Excel,Oracle11g,Apache Poi,Ibatis,编辑:已解决。我绕过了ibatis/ApachePOI,将jdbc连接器写入数据库,获取blob并将其转储到文件中。总有一天,我想知道为什么事情会搞砸——但今天我很高兴这件事已经过去了 小结:我正在获取Oracle blob,并使用ApachePOI重构Excel二进制文件以通过SOAP服务层。Net客户端正在将这些文件写入.xls文件,但在写入UNIX目录时文件已损坏 详情: 我将Excel Blob存储在oracle表中。这些blob是使用iBatis编写的,并使用这个(被截断的)结果映射进

编辑:已解决。我绕过了ibatis/ApachePOI,将jdbc连接器写入数据库,获取blob并将其转储到文件中。总有一天,我想知道为什么事情会搞砸——但今天我很高兴这件事已经过去了

小结:我正在获取Oracle blob,并使用ApachePOI重构Excel二进制文件以通过SOAP服务层。Net客户端正在将这些文件写入.xls文件,但在写入UNIX目录时文件已损坏

详情: 我将Excel Blob存储在oracle表中。这些blob是使用iBatis编写的,并使用这个(被截断的)结果映射进行拉取

<resultMap id="report" class="Report">      
  <result column="content" property ="content" typeHandler="BlobByteArrayTypeHandler"/>
为了诊断这一点,我尝试从Oracle获取blob,并将其保存到一个文件中。在一个简单的jar可执行文件中,我已经能够从这个文件中读取字节,并在我们的UNIX机器上使用上述方法重写它——它们都可以工作

但是,从我们的代码来看,excel文件都已损坏,或者Apache.POI中缺少标题信息。在文本编辑器中打开损坏/损坏的二进制文件会显示64字节的重复模式。它不是有效的xls二进制文件

有东西在往一边走。blob是一个有效的xls二进制文件,我们只是获取字节(使用上面的iBatis)并通过HSSFWorkbook对象将它们传回,然后尝试使用我所展示的方法进行写入

    /**
 * Return the byte array based on the workbook.
 * 
 * @return
 * @throws IOException
 */
public byte[] getContent() throws IOException
{
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    this.workBook.write(bos);   
    return bos.toByteArray();
}
我在使用Apache POI时遇到的具体错误是:

java.io.IOException: block[ 0 ] already removed
at org.apache.poi.poifs.storage.BlockListImpl.remove(BlockListImpl.java:97)
at org.apache.poi.poifs.storage.BlockAllocationTableReader.fetchBlocks(BlockAllocationTableReader.java:190)
at org.apache.poi.poifs.storage.BlockListImpl.fetchBlocks(BlockListImpl.java:130)
at org.apache.poi.poifs.property.PropertyTable.<init>(PropertyTable.java:79)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:171)
java.io.IOException:块[0]已删除
在org.apache.poi.poifs.storage.blocklistempl.remove(blocklistempl.java:97)上
位于org.apache.poi.poifs.storage.BlockAllocationTableReader.fetchBlocks(BlockAllocationTableReader.java:190)
位于org.apache.poi.poifs.storage.blocklistempl.fetchBlocks(blocklistempl.java:130)
位于org.apache.poi.poifs.property.PropertyTable。(PropertyTable.java:79)
位于org.apache.poi.poifs.filesystem.poifsffilesystem.(poifsffilesystem.java:171)

我编写了一个直接到DB的jdbc调用,忽略了ibatis和ApachePOI的所有废话。使用各种磁盘写入方法工作正常。

Excel文件是二进制数据。您似乎正在使用编写器和编码,这应该只用于纯文本。将它们与二进制数据一起使用会破坏一切!如果清除所有写入程序并只处理字节/流,会发生什么情况?我的第一个示例使用FileOutputStream只进行写入,这与正在运行的.Net代码非常类似,但在Unix中不起作用。
java.io.IOException: block[ 0 ] already removed
at org.apache.poi.poifs.storage.BlockListImpl.remove(BlockListImpl.java:97)
at org.apache.poi.poifs.storage.BlockAllocationTableReader.fetchBlocks(BlockAllocationTableReader.java:190)
at org.apache.poi.poifs.storage.BlockListImpl.fetchBlocks(BlockListImpl.java:130)
at org.apache.poi.poifs.property.PropertyTable.<init>(PropertyTable.java:79)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:171)