Java后端调用三方导出接口返回的字符串流能转换成excel吗?

三方提供了导出excel的接口,然后我这边用Java后端调用该接口返回了这种字符串,这是excel文件流数据吗?如何将这种数据转换成excel再给前端导出?

PK 0��W               _rels/.rels���J1���Pr���
����(�A-�p(�t�f�Ȅ/ґ� ��,H�����eY�'z��8�R� �幓    �&zXc���E8k\�=�(z�[�ʝ4~��gH���LP<�� =�E_�?ID����PK�c��@  2  PK 0��W               docProps/app.xmlM��
�0D��ro�z�4� �'{����MHV�盓z���T��E�1e�����Ɇ�ѳ����:�No7jH!bb�Y��V��������T�)$o���0M��9ؗGb�7�pe��*~�R�>��Y�EB���nW������ PK6n�!�   �   PK 0��W               docProps/core.xmlm��J�0F��!�M�����"ʂ��`E�.$c[l~H�]�޴�[A���3���\�Ԁ>����
�i�had��
�@
(���<���)���<Yȝ�j�t,f.^���������������A΄@��`���T���������f�Hr���&[��V�ג���+��q�U��}��ȥ!�'���PK��{�  �  PK 0��W               xl/sharedStrings.xml=�A
阅读 1.3k
avatarAI BotBETA

这个字符串流看起来像是二进制数据,这是Excel文件流数据的一种常见格式。要将这种数据转换成Excel文件,你可以使用Apache POI库。

Apache POI是一个用于处理Microsoft Office格式文件的Java API,包括Excel、Word、PowerPoint等。通过它,你可以创建、修改、读取这些文件。

以下是使用Apache POI将二进制数据(byte array)写入Excel文件的一个简单示例:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

public class ExcelWriter {
    public static void writeExcel(List<String> data, String filename) {
        Workbook workbook = new XSSFWorkbook(); // 创建新的Excel工作簿
        Sheet sheet = workbook.createSheet("Sheet1"); // 创建新的工作表
        Row headerRow = sheet.createRow(0); // 创建表头行
        headerRow.createCell(0).setCellValue("Data"); // 设置表头

        int rowNum = 1;
        for (String item : data) {
            Row row = sheet.createRow(rowNum++); // 创建新行
            row.createCell(0).setCellValue(item); // 设置单元格值
        }

        try (FileOutputStream outputStream = new FileOutputStream(filename)) {
            workbook.write(outputStream); // 将工作簿写入文件
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                workbook.close(); // 关闭工作簿
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

这个示例假设你的数据是一个字符串列表,并且你想要将数据写入一个名为"filename"的Excel文件。这个Excel文件将有一个名为"Sheet1"的工作表,该工作表包含一个名为"Data"的列。你需要根据实际情况调整这个代码以适应你的需求。

1 个回答

解决了,需求是前端要导出,但因各种原因没法直接调服务2的导出接口,需要服务1中转一下。
服务1接收到前端请求后,调用服务2的controller,服务2正常执行,服务1拿到数据转成byte[],然后写入到outputStream中就可以了

服务2公用导出方法

/**
     * 导出Excel
     *
     * @param response   响应实体
     * @param fileName   文件名
     * @param exportList 数据列表
     * @param clazz      映射类
     */
    public static void exportExcel(HttpServletResponse response, String fileName, List exportList, Class<?> clazz) {
        ServletOutputStream out = null;
        try {
            out = response.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        ExcelWriterBuilder builder = new ExcelWriterBuilder();
        builder.file(out).excelType(ExcelTypeEnum.XLSX).autoCloseStream(true).head(clazz);
        ExcelWriter writer = builder.build();
        WriteSheet sheet = EasyExcel.writerSheet().build();
        writer.write(exportList, sheet);
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
        try {
            response.setHeader("content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            response.setHeader("Pragma", "public");
            response.setHeader("Cache-Control", "no-store");
            response.addHeader("Cache-Control", "max-age=0");
            out.flush();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            writer.finish();
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

服务1中转接口

    @Resource
    private RestTemplate restTemplate;
public void export(@RequestBody Map<String, Object> paramMap,HttpServletResponse response) {
        // 构建请求实体信息
        HttpEntity<String> requestEntity = RestTemplateHttpUtils.buildHttpEntity(paramMap);

        String url = "xxxxxxxxxxx";
        ServletOutputStream outputStream = null;
        InputStream inputStream = null;
        try {
            outputStream = response.getOutputStream();
            byte[] bytes = restTemplate.postForObject(url, requestEntity, byte[].class);
            /// 将Excel流文件字符串转换为字节数组输入流
            inputStream = new ByteArrayInputStream(bytes);

            byte[] buffer = new byte[1024];
            int bytesRead;

            // 循环读取输入流的数据并写入输出流
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
            outputStream.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.close();
                inputStream.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题