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

问题描述

我将此 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;

    }