Java 使用ApachePOI从字符串读取excel文件

Java 使用ApachePOI从字符串读取excel文件,java,excel,apache-poi,Java,Excel,Apache Poi,我正在尝试使用ApachePOI3.9从字符串中读取excel文件,但没有成功。我对java不太熟悉 只是想澄清一下,在我的程序中,我已经将excel文件作为字符串,我正在使用readFile函数模拟这种行为 节目: import java.io.ByteArrayInputStream; 导入java.io.IOException; 导入java.io.InputStream; 导入java.nio.ByteBuffer; 导入java.nio.charset.charset; 导入java.

我正在尝试使用ApachePOI3.9从字符串中读取excel文件,但没有成功。我对java不太熟悉

只是想澄清一下,在我的程序中,我已经将excel文件作为字符串,我正在使用readFile函数模拟这种行为

节目:

import java.io.ByteArrayInputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.nio.ByteBuffer;
导入java.nio.charset.charset;
导入java.nio.charset.StandardCharset;
导入java.nio.file.Files;
导入java.nio.file.path;
导入org.apache.poi.openxml4j.exceptions.InvalidFormatException;
导入org.apache.poi.ss.usermodel.工作簿;
导入org.apache.poi.ss.usermodel.WorkbookFactory;
公开课考试{
静态字符串读取文件(字符串路径、字符集编码)引发IOException
{
byte[]encoded=Files.readAllBytes(path.get(path));
返回encoding.decode(ByteBuffer.wrap(encoded)).toString();
}
公共静态void main(字符串[]args)引发IOException、InvalidFormatException{
字符串结果=readFile(“data.xlsx”,StandardCharsets.UTF_8);
InputStream is=newbytearrayinputstream(result.getBytes(“UTF-8”);
工作簿=WorkbookFactory.create(is);
}
}
我得到的错误是:

线程“main”java.util.zip.ZipException中的异常:无效的块类型 位于java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164) 位于java.util.zip.ZipInputStream.read(ZipInputStream.java:193) 在java.io.FilterInputStream.read(FilterInputStream.java:107)中 位于org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource$FakeZipEntry.(ZipInputStreamZipEntrySource.java:127) 位于org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.(ZipInputStreamZipEntrySource.java:55) 在org.apache.poi.openxml4j.opc.ZipPackage.(ZipPackage.java:83) 位于org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:267) 在org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:73)上 at Test.main(Test.java:28) 任何帮助都将不胜感激


干杯你在干什么?您正在将二进制文件读入
字节[]
,并使用UTF-8将其转换为
字符串。稍后,您将再次使用UTF-8将其转换回字节流。为何跳过以下步骤之间的所有步骤:

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

看来你把这条路弄得太复杂了。只需遵循,这建议使用
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"));

所以我的问题的解决办法是

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);
    }

}

这件事让我烦了一会儿。建议的修复方案对我都不起作用。解决这个问题的方法是在maven资源插件中添加一个

        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.5</version>
            <configuration>
              <encoding>UTF-8</encoding>
              <nonFilteredFileExtensions>
                <nonFilteredFileExtension>docx</nonFilteredFileExtension>
                <nonFilteredFileExtension>xls</nonFilteredFileExtension>
                <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
              </nonFilteredFileExtensions>
            </configuration>
        </plugin>   

maven资源插件
2.5
UTF-8
docx
xls
xlsx

我已对我的问题进行了澄清。不清楚为什么您认为在创建
工作簿之前需要将文件内容转换为
字符串。你没必要这么做,我同意。但在我的程序中,我想在我的一些代码上构建一个抽象。我认为字符串会有错误的东西,而输入流是一个更好的主意。你为什么要这样做?如中所述,通过流执行此操作的原因是我在web服务中获取此文件。您可能会发现此库非常有用: