2013-11-11 4 views
2

Я пытаюсь прочитать файл excel из строки с использованием Apache POI 3.9 без каких-либо успехов. Я не очень хорошо знаком с java.Чтение файла excel из строки с использованием Apache POI

Чтобы уточнить, в моей программе у меня уже есть файл excel в виде строки, и я издеваюсь над этим поведением с помощью функции readFile.

Программа:

import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.nio.ByteBuffer; 
import java.nio.charset.Charset; 
import java.nio.charset.StandardCharsets; 
import java.nio.file.Files; 
import java.nio.file.Paths; 

import org.apache.poi.openxml4j.exceptions.InvalidFormatException; 
import org.apache.poi.ss.usermodel.Workbook; 
import org.apache.poi.ss.usermodel.WorkbookFactory; 

public class Test { 

    static String readFile(String path, Charset encoding) throws IOException 
    { 
     byte[] encoded = Files.readAllBytes(Paths.get(path)); 
     return encoding.decode(ByteBuffer.wrap(encoded)).toString(); 
    } 

    public static void main(String[] args) throws IOException, InvalidFormatException { 
     String result = readFile("data.xlsx", StandardCharsets.UTF_8); 

     InputStream is = new ByteArrayInputStream(result.getBytes("UTF-8")); 

     Workbook book = WorkbookFactory.create(is); 
    } 

} 

Ошибка я получаю:

Exception in thread "main" java.util.zip.ZipException: invalid block type 
    at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164) 
    at java.util.zip.ZipInputStream.read(ZipInputStream.java:193) 
    at java.io.FilterInputStream.read(FilterInputStream.java:107) 
    at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource$FakeZipEntry.<init>(ZipInputStreamZipEntrySource.java:127) 
    at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.<init>(ZipInputStreamZipEntrySource.java:55) 
    at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:83) 
    at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:267) 
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:73) 
    at Test.main(Test.java:28) 

Любая помощь будет оценена.

cheers

+0

Вы можете найти эту библиотеку полезной: https://github.com/ eaorak/excelr – noego

ответ

0

Что вы делаете? Вы читаете двоичный файл в byte[] и конвертируете его в String с использованием UTF-8. Позже вы снова конвертируете его в поток байтов, используя UTF-8. Зачем? Пропустите все шаги между ними:

public static void main(String[] args) throws IOException, InvalidFormatException { 
    InputStream is = new FileInputStream("data.xlsx"); 
    Workbook book = WorkbookFactory.create(is); 
} 
3

Похоже, вы слишком усложняетесь. Просто следуйте Apache POI Quick Guide, который предлагает прочитать файл с FileInputStream. Нет необходимости считывать байты в массив байтов и использовать ByteArrayInputStream.

Используйте один из следующих скопирована из руководства:

// Use a file 
Workbook wb = WorkbookFactory.create(new File("MyExcel.xls")); 

// Use an InputStream, needs more memory 
Workbook wb = WorkbookFactory.create(new FileInputStream("MyExcel.xlsx")); 
+0

Я добавил разъяснение к моему вопросу. – ducky

+2

Непонятно, почему вы считаете, что вам нужно преобразовать содержимое файла в 'String', прежде чем создавать« книгу ». Вам не нужно это делать. – rgettman

+0

Согласен. Но в моей программе я хотел создать абстракцию над некоторым из моего кода. Я думаю, что у String было бы неправильное дело, а InputStream - лучшая идея. – ducky

3

Так что исправление для моей проблемы был

import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.nio.file.Files; 
import java.nio.file.Paths; 

import org.apache.poi.openxml4j.exceptions.InvalidFormatException; 
import org.apache.poi.ss.usermodel.Workbook; 
import org.apache.poi.ss.usermodel.WorkbookFactory; 

public class Test { 

    public static void main(String[] args) throws IOException, InvalidFormatException { 
     byte[] result = Files.readAllBytes(Paths.get("data.xlsx"));  
     InputStream is = new ByteArrayInputStream(result); 
     Workbook book = WorkbookFactory.create(is); 
    } 

} 
+0

Почему вы это делаете? Как описано в [документации] (http://poi.apache.org/spreadsheet/quick-guide.html#FileInputStream), переход через поток [использует больше памяти, чем использование файла напрямую) (http: // poi. apache.org/spreadsheet/quick-guide.html#FileInputStream) – Gagravarr

+1

Причина, по которой я делаю это, заключается в том, что я получаю этот файл в веб-службе. – ducky

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