Java代码实现Excel导出多份文件并压缩成zip包保存到OSS服务器返回URL访问下载

1、首先引入maven依赖

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.1</version>
 </dependency>

2、实际导出工具类方法

public static byte[] exportExcel(Map<String, List<List<String>>> fieldMap, Map<String, List> valueMap, String sheetName) {
        if (Objects.isNull(valueMap) || 0 == valueMap.size()) {
            throw new RuntimeException("导出数据不可以为空");
        }
        if (StringUtils.isBlank(sheetName)) {
            throw new RuntimeException("Excel单元格sheet名称不可以为空");
        }
        if (Objects.isNull(fieldMap)) {
            throw new RuntimeException("Excel导出渲染模版不可以为空");
        }
        //这里直接使用 try 新特性创建流,会自动关闭,不需要手动关闭流
        //如果需要导出到浏览器用户直接下载 这里使用 response 的输出流到浏览器 需要传参 HttpServletResponse response
       //  try (ServletOutputStream outputStream = response.getOutputStream(); ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream)) {
       //这里如果需要导出转换为byte数组上传OSS的话 使用ByteArrayOutputStream 字节流
        try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream)) {
        //如果需要导出到浏览器 需要设置格式跟字符类型 否则会乱码跟格式错误
//            response.setCharacterEncoding("utf-8");
//            response.setContentType("application/zip");
//            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            for (Map.Entry<String, List> entry : valueMap.entrySet()) {
                String key = entry.getKey();
                List value = entry.getValue();
                List<List<String>> lists = fieldMap.get(key);
                //构建一个excel对象,这里注意type要是xls不能是xlsx,否则下面的写入后流会关闭,导致报错
                ExcelWriter excelWriter = EasyExcel.write().excelType(ExcelTypeEnum.XLS).build();
                //构建一个sheet页
                WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).build();
                //构建excel表头信息
                WriteTable writeTable0 = EasyExcel.writerTable(0).head(lists).needHead(Boolean.TRUE).build();
                //将表头和数据写入表格
                excelWriter.write(value, writeSheet, writeTable0);
                //创建压缩文件 这里设置导出Excel的名称 记得添加后缀 否则导出文件没后缀
                ZipEntry zipEntry = new ZipEntry(key + ModelCustomizeRuleServiceImpl.timeStamp2Date(System.currentTimeMillis(), "yyyyMMddHHmmss") + ".xls");
                zipOutputStream.putNextEntry(zipEntry);
                Workbook workbook = excelWriter.writeContext().writeWorkbookHolder().getWorkbook();
                //将excel对象以流的形式写入压缩流
                workbook.write(zipOutputStream);
            }
            //记得关闭实体 否则导出的zip包会丢失最后一份数据
            zipOutputStream.closeEntry();
            zipOutputStream.flush();
            //需要转换为byte数组则调用该方法 导出浏览器直接void类型即可
            return outputStream.toByteArray();
        } catch (Exception e) {
            log.error("导出Excel压缩出现异常,信息" + e.getMessage());
            //抛出异常结束程序
            throw new RuntimeException("数据导出接口异常:" + e.getMessage());
        }
    }

3、测试Demo案例,直接拿来即可用,测结果

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.WriteTable;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @author shilei
 * @create 2021-03-15 17:51
 */
@RestController
@Slf4j
public class TestDemo {

    @GetMapping(value = "/TEST2")
    public void unDirectExport(HttpServletResponse response) throws Exception {
        String fileName = "test2.zip";
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/zip");
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        List<AAAA> list = get96Time();
        List<AAAA> list2 = get96Time();
        //按某个条件分组
        Map<String, List<AAAA>> map = new HashMap();
        map.put("test1.xls", list);
        map.put("test2.xls", list2);
        exportExcel(response, map);

    }

    private void exportExcel(HttpServletResponse response, Map<String, List<AAAA>> map) throws IOException {
        ServletOutputStream outputStream = response.getOutputStream();
        ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);
        try {
            for (Map.Entry<String, List<AAAA>> entry : map.entrySet()) {
                String k = entry.getKey();
                List<AAAA> value = entry.getValue();
                //构建一个excel对象,这里注意type要是xls不能是xlsx,否则下面的写入后流会关闭,导致报错
                ExcelWriter excelWriter = EasyExcel.write().excelType(ExcelTypeEnum.XLS).build();
                //构建一个sheet页
                WriteSheet writeSheet = EasyExcel.writerSheet("薪资单").build();
                //构建excel表头信息
                WriteTable writeTable0 = EasyExcel.writerTable(0).head(AAAA.class).needHead(Boolean.TRUE).build();
                //将表头和数据写入表格
                excelWriter.write(value, writeSheet, writeTable0);

                //创建压缩文件
                ZipEntry zipEntry = new ZipEntry(k);
                zipOutputStream.putNextEntry(zipEntry);
                Workbook workbook = excelWriter.writeContext().writeWorkbookHolder().getWorkbook();
                //将excel对象以流的形式写入压缩流
                workbook.write(zipOutputStream);
            }
            zipOutputStream.flush();
        } catch (Exception e) {
            log.error("导XXX失败,原因" + e.getMessage());
            log.error(e.getMessage(), e);
            //抛出异常结束程序
            throw new RuntimeException("数据导出接口异常");
        } finally {
            //关闭数据流,注意关闭的顺序
            zipOutputStream.close();
            outputStream.close();
        }
    }
    private List<AAAA> get96Time() {
        List<AAAA> res = new ArrayList<>(96);
        LocalDate localDate = LocalDate.now();
        LocalDateTime now = LocalDateTime.of(localDate.getYear(), localDate.getMonth(), localDate.getDayOfMonth(), 0, 0);
        for (int i = 1; i < 96; i++) {
            AAAA a = new AAAA();
            String format = now.plusMinutes(15 * i).format(DateTimeFormatter.ofPattern("HH:mm"));
            a.setName(format);
            a.setAge(i);
            res.add(a);
        }
        return res;
    }

    @Data
    class AAAA {
        private Integer age;
        private String name;

    }
}

4、最后导出样式展示
在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Android中,可以使用adb命令通过IP地址连接手机。首先,确保手机和计算机连接在同一个网络下,并且已经打开了USB调试模式。接下来,打开命令行终端或者命令提示符窗口,在命令行中输入以下命令: 1. 首先,使用adb devices命令查看设备列表,确认设备已被识别并连接。 ``` adb devices ``` 2. 接下来,使用adb tcpip命令,将设备切换至TCP/IP模式。此时,设备将在5555端口等待连接。 ``` adb tcpip 5555 ``` 3. 然后,使用手机的IP地址替换下方命令示例中的"设备IP",输入以下命令连接设备: ``` adb connect 设备IP:5555 ``` 4. 如果连接成功,终端会返回"connected to 设备IP:5555"的信息,并且设备列表中将显示已连接的设备。 5. 现在,您可以使用adb命令与该设备进行交互,例如通过adb shell命令进入设备的shell,进行文件操作、安装应用程序等。 ``` adb shell ``` 6. 如果需要切换回USB模式,使用以下命令: ``` adb usb ``` 通过以上步骤,您可以在不使用USB线缆的情况下通过IP地址连接Android手机,并使用adb命令进行设备管理和调试操作。请注意,如果设备的IP地址发生变化或重启,您可能需要重新执行步骤2和步骤3来重新连接设备。 ### 回答2: 在Android中,我们可以使用adb命令通过IP地址连接手机。首先,确保手机和电脑连接到同一个WiFi网络上。 步骤如下: 1. 打开手机的设置菜单,并找到“关于手机”选项。 2. 在“关于手机”选项中,查找和点击“状态”或“网络信息”。 3. 在“状态”或“网络信息”中,可以找到手机的IP地址。 4. 在电脑上打开命令提示符或终端窗口,输入以下adb命令:adb connect <手机IP地址>:<端口号>。例如,adb connect 192.168.0.100:5555。 5. 如果一切正常,命令提示符或终端窗口将显示“已连接到<手机IP地址>:<端口号>”。 6. 现在,您可以使用其他adb命令与连接的手机进行交互了,例如安装应用程序、传输文件等。 需要注意以下事项: 1. 手机和电脑必须连接到相同的WiFi网络上,否则无法建立连接。 2. 在一些手机上,需要在开发者选项中启用网络调试模式。 3. 如果连接不成功,可以尝试断开连接并重新连接手机,或者重新启动手机和电脑后再次尝试。 通过上述步骤,您就可以在Android中使用adb命令通过IP地址连接手机,并且可以方便地使用各种adb命令来管理和调试您的设备。 ### 回答3: 在Android中,使用adb命令通过IP地址连接手机是非常方便的。步骤如下: 首先,确保手机和电脑连接在同一个局域网环境中。 其次,在电脑上打开终端或命令提示符窗口,进入adb命令所在的目录。如果你已经将adb添加到环境变量中,可以直接在任何路径下使用adb命令。 接下来,通过以下命令查找设备的IP地址:adb shell ifconfig或adb shell ip addr。在返回结果中,找到设备的IP地址。 然后,使用以下命令连接到设备的IP地址:adb connect 设备IP地址。例如,adb connect 192.168.0.100。 最后,在连接成功后,你可以像正常连接设备一样使用adb命令来操作手机了。例如,adb shell可以进入设备的命令行界面,adb install可以安装应用程序等。 需要注意的是,通过IP地址连接手机的方式可能不如通过USB连接稳定和快速,因此在进行开发或调试时,建议使用USB连接。此外,某些设备可能需要在设置中启用ADB网络调试模式才能通过IP地址连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值