2017-02-22 5 views
1

У меня есть требование сохранить загруженную электронную таблицу на диск. Я использую приведенный ниже код, чтобы сделать то же самое, и получение файла является поврежденной ошибкой от excel.Сохранение таблицы на диск с использованием java

byte[] bytes = null; 
    File uploadedFile = new File("D://xlsxTest//BNG Issue.xlsx"); 
    File file = new File("D://xlsxTest//sample1.xlsx"); 

    FileOutputStream outStream = null; 

    InputStream inputStream = null; 

    try{ 
    if(!file.exists()){ 
     file.createNewFile(); 
    } 
    outStream = new FileOutputStream(file); 

    if (uploadedFile != null) { 

     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
     inputStream = new FileInputStream(uploadedFile);; 

     int c = 0; 
     while (c != -1) { 
      c = inputStream.read(); 
      byteArrayOutputStream.write((char) c); 

     } 
     bytes = byteArrayOutputStream.toByteArray(); 

    } 

    outStream.write(bytes); 
      }catch(Exception e){ 
     e.printStackTrace(); 
    }finally{ 
     try{ 
     outStream.close(); 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

Я пробовал использовать файл размером 83 КБ, а полученный файл - 82.5KB. Любая помощь будет оценена по достоинству. Спасибо.

+0

Похоже, вы сохранили его правильно и не можете прочитать текст внутри? –

+0

Попробуйте добавить 'outStream.flush()' перед тем, как закрыть его. – Berger

+0

Невозможно воспроизвести. Вы код просто добавляет дополнительный байт (-1) в конце файла, потому что тест для конца файла происходит ** после ** записи. Но это не должно приводить к более короткой копии. Можете ли вы подтвердить, что с приведенным выше кодом «D: //xlsxTest//sample1.xlsx» короче, чем «D: // xlsxTest // BNG Issue.xlsx»? –

ответ

1

Попробуйте использовать Apace POI, преобразовать файлы .xls или .xlsx в байтовый массив, используя OPCPackage и XSSFWorkbook с кодом ниже.

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    OPCPackage pkg = OPCPackage.open(new File(fullFileName)); 
    XSSFWorkbook wb = new XSSFWorkbook(pkg); 
    wb.write(baos); 
    byte[] fileContent = baos.toByteArray(); 

Apache POI заботится о том, чтобы извлечь всю информацию о файле excel при преобразовании в массив байтов.

+0

Проблема решена, если я пишу код выше. Но у меня может быть возможность получить очень большой файл и XSSFWorkbook wb = new XSSFWorkbook (pkg); приводит к возникновению неполученных проблем. Поэтому хотелось избежать того же. – Vasantha

+0

Есть ли ячейки формулы в файле excel? Если существует циклическая ссылка или имеются недопустимые формулы, вы получите ошибку StackOverflow. –

+0

Я не получаю ошибку StackOverflow. Файл сохраняется, но при открытии Excel говорят, что файл поврежден. – Vasantha

Смежные вопросы