将byte []转换为excel时,Excel文件被破坏

时间:2013-01-04 11:36:37

标签: java

在我的应用程序中,我将块中的excel文件作为输入。假设,如果excel文件大小为20 MB,那么我将获得4个块,其中每个块(byte [])为5MB。我正在将每个块(byte [])写入临时文件(没有扩展名)。我正在使用此临时文件重新生成实际的excel文件,该文件以多个块的形式发送给我。我的要求是生成的excel文件必须与我在块中获得的excel文件相同。

示例代码:

  1. 读取excel文件,转换为块并将这些块写入临时文件。

    public static void readExcelFileBytes(String srcFile)抛出IOException {

    File file = new File(srcFile);
    
    FileInputStream fis = new FileInputStream(file);
    
    byte[] buf = new byte[1024 * 5]; // 5KB
    int totalNoOfBytes = 0;
    try {
        for (int readNum; (readNum = fis.read(buf)) != -1;) {               
            appendByteArrayToTempFile(buf);
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    System.out.println("Read: Total Size Bytes" + totalNoOfBytes);
    
    }
    
    public static boolean appendByteArrayToTempFile(byte[] byteArray) {
    
    boolean result = false;
    BufferedWriter writeout = null;
    File bodfile = null;
    FileOutputStream out = null;
    try {
        bodfile = new File("C://tempFile");
        out = new FileOutputStream(bodfile, true);
        out.write(byteArray);           
    
        result = true;
    
    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        try {
            //writeout.close();
            out.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    return result;
    }
    
  2. 使用temp byte []重新生成excel文件。

  3. public static void tempToFile(String srcFilePath)抛出IOException {

       File file = new File("C://tempFile");
    
       FileInputStream fis = new FileInputStream(file);
    
       ByteArrayOutputStream bos = new ByteArrayOutputStream();
       byte[] buf = new byte[1024];
       try {
           for (int readNum; (readNum = fis.read(buf)) != -1;) {
               bos.write(buf, 0, readNum); //no doubt here is 0                
    
           }
       } catch (IOException ex) {
           ex.printStackTrace();
       }
       byte[] bytes = bos.toByteArray();
    
       // Create source file from Temp's byte array
       FileOutputStream fileOuputStream =  new FileOutputStream(srcFilePath); 
       fileOuputStream.write(bytes);
       fileOuputStream.flush();
       fileOuputStream.close();
    }
    

    问题:

    public static void main(String s [])抛出IOException {

        // XLS POC
        readExcelFileBytes("C://Input.xlsx");
        tempToFile("C://Output.xlsx");
    
    }
    

    但是当使用临时文件byte []生成excel文件时,它会被获取。有人可以帮助我是否遵循使用临时文件byte []?

    重新生成excel文件的正确方法

2 个答案:

答案 0 :(得分:2)

使用现有的自动复制文件的库不是更好吗?

其中一个图书馆是Jakarta Commons

它已被数百名开发人员使用;它经过了很好的测试,肯定会帮助您完成文件复制任务。

修改

如果您收到损坏的文件,最好的方法是检查文件复制机制(您自己的库中的任何一个)是否正常工作以检查输入和输出文件校验和。输入文件校验和应与输出文件校验和相同。

假设您的输入java.io.Fileinput且输出Fileoutput,则您的代码检查文件校验和可能如下所示:

long inputChecksum = FileUtils.checksumCRC32(input);

// if there is an issue with file copy IOException is thrown
FileUtils.copyFile(input, output);

// inputChecksum should be the same as outputChecksum
long outputChecksum = FileUtils.checksumCRC32(output);

答案 1 :(得分:2)

这段代码肯定是错的:

for (int readNum; (readNum = fis.read(buf)) != -1;) {               
    appendByteArrayToTempFile(buf);
}

您忽略实际读入buf的字节数,并且每次都无条件地写出整个buf。你需要

for (int readNum; (readNum = fis.read(buf)) != -1;) {               
    appendByteArrayToTempFile(buf, readNum);
}

并相应地实施appendByteArrayToTempFile