微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从工作簿中以字节 [] 形式返回特定工作表

如何解决从工作簿中以字节 [] 形式返回特定工作表

我将此 Excel 工作簿存储在我的资源文件夹中。考虑到这个 excel 有 9 页,我想提取一个特定的页面并将其从字节 [] 中返回。

我创建了这个控制器

@GetMapping(value = "/getSinglePage/{pageNumber}")
    private ResponseEntity<byte[]> getExcelByPageNumber(@PathVariable Integer pageNumber) throws IOException {
        return new ResponseEntity<>(service.getExcelByPageNumber(pageNumber),HttpStatus.OK);
    }

服务代码包含--

public byte[] getExcelByPageNumber(Integer pageNumber) throws IOException {
        
        Workbook workbook = null;
        byte[] byteArray = null;
        // here file.xls is my excel sheet that contains 9 sheet for example

        workbook = WorkbookFactory.create(loader.getResource("classpath:file.xls").getInputStream());
        //gets the sheet from given page number 
        Sheet sheet = workbook.getSheetAt(pageNumber);
    
        // Now i want to return this sheet in the form of byte[]
        return byteArray;
    }

我应该如何将其返回为byte[]的形式?

解决方法

通过做一些 POC,我了解到没有自己的工作簿就不可能存在单个工作表。并且 Workbook 限制了可以使用的库。所以显然我找不到任何直接的解决方案来复制或附加工作表。

我所做的是删除了不需要的工作表,这些工作表只保留工作簿中的工作表,然后使用 ByteArrayOutputStream 编写。

 public byte[] getExcelByPageNumber(Integer pageNumber) throws IOException {
        // TODO Auto-generated method stub
        Workbook workbook = new XSSFWorkbook();
        workbook = WorkbookFactory.create(loader.getResource("classpath:file.xls").getInputStream());
        Sheet tmpSheet = workbook.getSheetAt(pageNumber - 1);
        for (int i = workbook.getNumberOfSheets() - 1; i >= 0; i--) {

            String sheetName = workbook.getSheetName(i).trim();

            if (!tmpSheet.getSheetName().equals(sheetName)) {
                workbook.removeSheetAt(i);
            }

        }

        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        try {
            workbook.write(bos);
        } finally {
            bos.close();
        }
        byte[] bytes = bos.toByteArray();
        return bytes;

    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。