当前位置: 首页 > 知识库问答 >
问题:

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

童花蜂
2023-12-29

三方提供了导出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

共有2个答案

魏凯捷
2023-12-29

解决了,需求是前端要导出,但因各种原因没法直接调服务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);            }        }    }
张锐藻
2023-12-29

这个字符串流看起来像是二进制数据,这是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"的列。你需要根据实际情况调整这个代码以适应你的需求。

 类似资料:
  • 问题内容: 我想将ArrayList保存到SharedPreferences,因此需要将其转换为字符串然后返回,这就是我正在做的事情: 我可以用它来检索它,但我不知道如何将arrayString转换回ArrayList。如何做呢? 我的数组看起来像: 问题答案: 您有2个选择: 手动解析字符串并重新创建arraylist。这将是非常乏味的。 使用Google的Gson库之类的JSON库,以JSON

  • 我对编码非常陌生,刚刚接触过静态方法,所以我为这些愚蠢的错误提前道歉。在main下调用该方法时,该方法应该显示一个三角形,但我得到的控制台是空的,没有输出。但是,如果我将此写在main下: 然后,三角形将显示在控制台中,但是对于这个赋值,字符串/三角形必须仅通过使用来调用

  • 本文向大家介绍java编程中字节流转换成字符流的实现方法,包括了java编程中字节流转换成字符流的实现方法的使用技巧和注意事项,需要的朋友参考一下 java编程中字节流转换成字符流的实现方法 以上这篇java编程中字节流转换成字符流的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 问题内容: 我发现了有关从java字符串获取java.util.streams.IntStream的问题,但是由于我使用的是Java 8,所以我没有找到此方法。 更正:正如你们指出的那样,我正在使用Java7。现在该方法就在那里。但问题仍然适用: 如何从字符串中获取a ? 问题答案: 我会指出较早的关于这个主题的答案,但是事实证明您已经与这个问题联系了。在对方的回答也提供了有用的信息。 如果需要值

  • 我正在尝试编写一个Java类来执行基本的字符串操作函数。 我希望这个类可以以如下方式调用: 或者 我在努力思考如何组织这个课程。我猜类中的一些方法或变量将是静态的,并且这些方法将返回“this”。那么如果我的RemoveSlashes方法返回一个字符串给' tmp ',它会怎么做呢?我会被迫使用RemoveSlashes.toString()或RemoveSlashes.getString()或类

  • 问题内容: 是否可以将字符串转换为字节数组,然后在Java或Android中将其转换回原始字符串? 我的目标是将一些字符串发送到微控制器(Arduino)并将其存储到EEPROM(仅1 KB)中。我尝试使用MD5哈希,但它似乎只是一种单向加密。我该怎么办? 问题答案: 我建议使用字符串的成员,但 使用显式编码 : 通过使用一种显式编码(以及一种支持所有Unicode的编码),您可以避免仅调用等问题