【问题标题】:XSSFSheet cannot be cast to java.io.FileXSSFSheet 无法转换为 java.io.File
【发布时间】:2018-01-09 22:04:41
【问题描述】:

我正在从一张特殊的 Excel 工作簿中读取一些值。我正在将这些值添加到我的数据库中。这个没有问题

但我还想将工作簿的工作表存储到我的数据库 BLOB 单元格中。

我正在尝试将工作表转换为字节 []。我使用下面的代码。

我正在尝试将工作表转换为 java.io.File。但我得到以下异常

线程“AWT-EventQueue-0”java.lang.ClassCastException 中的异常: org.apache.poi.xssf.usermodel.XSSFSheet 无法转换为 java.io.File

public  byte[] convertPDFToByteArray() {

    InputStream inputStream = null;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    File file = (File) oku.wb.getSheet("İN");

    try {

        inputStream = new FileInputStream(file);

        byte[] buffer = new byte[1024];
        baos = new ByteArrayOutputStream();

        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            baos.write(buffer, 0, bytesRead);
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return baos.toByteArray();
    }

有没有办法将 "wb.getSheet("İN");" 转换为 java.io.File 或任何更好的方法?

【问题讨论】:

  • 不,没有办法将 XSSFSheet 转换为文件。您可以使用 XSSFWorkbook.write() 方法将整个 xlsx 文档保存到文件中

标签: java database apache-poi inputstream


【解决方案1】:

您不能只在两个不相关的类之间进行转换。 在你的情况下,我认为你应该使用工作表工作簿的getBytes(),因为工作表对象没有这个:

byte[] buffer = sheet.getWorkbook().getBytes();

您的oku.wb 似乎已经包含工作簿,在这种情况下,您可以直接在oku.wb 上调用getBytes()

byte[] buffer = oku.wb.getBytes();

编辑 Blast,我从我自己的一个项目中选择了这段代码,但它使用了HSSFSheet 而不是XSSFSheet。因此,最好的办法是使用工作簿的 write() 方法,如 cmets 中所述:

public byte[] convert(XSSFSheet sheet) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        sheet.getWorkbook().write(baos);
    } catch (IOException e) {
        // blah
    }
    return baos.toByteArray();
}

【讨论】:

  • 感谢您的回答。这段代码可以工作,但有一点问题。这是存储整个工作簿。我想存储唯一名为“İN”的工作表
  • XSSFSheet始终包含在 XSSFWorkbook 中,因此您无法单独保存它们。最好的办法是尝试使用 wb.cloneSheet() 方法,看看是否可以创建一个只包含工作表的新工作簿。
猜你喜欢
  • 2019-04-10
  • 1970-01-01
  • 2013-07-21
  • 2014-05-12
  • 2013-06-03
  • 2018-08-11
  • 1970-01-01
  • 2019-07-19
  • 2021-12-27
相关资源
最近更新 更多