Java导出多个Sheet的Excel,并上传到Ftp

Java导出多个Sheet的Execl,并上传到Ftp

一、pom.xml 引入需要的依赖

<!--poi支持2003版本的excel(.xls)和2007版本的excel(.xlsx) -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.10-FINAL</version>
     </dependency>
     <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.10-FINAL</version>
     </dependency>

二、创建Execl 工具处理类ExcelSheetsUtil

import com.eiot.e_view.utils.common.ImageUtil;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;

public class ExcelSheetsUtil {
    /**
     * 设置正文单元样式
     *
     * @param workbook
     * @return
     */
    public static HSSFCellStyle createBodyCellStyle(HSSFWorkbook workbook) {
        HSSFCellStyle cellStyle = workbook.createCellStyle();
        HSSFFont font = workbook.createFont();
        font.setFontHeightInPoints((short) 8);
        font.setFontName(HSSFFont.FONT_ARIAL);//设置标题字体
        cellStyle.setFont(font);
        cellStyle = workbook.createCellStyle();
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
        return cellStyle;
    }

    /**
     * 设置正文单元时间样式
     *
     * @param workbook
     * @return
     */
    public static HSSFCellStyle createDateBodyCellStyle(HSSFWorkbook workbook) {
        HSSFCellStyle cellStyle = workbook.createCellStyle();
        HSSFFont font = workbook.createFont();
        font.setFontHeightInPoints((short) 8);
        font.setFontName(HSSFFont.FONT_ARIAL);//设置标题字体
        cellStyle.setFont(font);
        cellStyle = workbook.createCellStyle();
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
        HSSFDataFormat format = workbook.createDataFormat();
        cellStyle.setDataFormat(format.getFormat("yyyy-mm-dd"));
        return cellStyle;
    }

    /**
     * 设置标题单元样式
     *
     * @param workbook
     * @return
     */
    public static HSSFCellStyle createTitleCellStyle(HSSFWorkbook workbook) {
        HSSFCellStyle cellStyle = workbook.createCellStyle();
        HSSFFont font = workbook.createFont();
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        font.setFontHeightInPoints((short) 8);
        font.setFontName(HSSFFont.FONT_ARIAL);//设置标题字体
        cellStyle.setFont(font);
        cellStyle = workbook.createCellStyle();
        cellStyle.setFont(font);//设置列标题样式
        cellStyle.setFillForegroundColor(HSSFColor.SKY_BLUE.index);// 设置背景色
        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
        return cellStyle;
    }

    /**
     * 写入标题行
     *
     * @param sheet
     * @param cellStyle
     * @param cellValues 标题数组
     * @return
     */
    public static void writeTitleContent(HSSFSheet sheet, HSSFCellStyle cellStyle, String[] cellValues) {

        HSSFRow row = null;
        HSSFCell cell = null;
        //标题
        row = sheet.createRow(0);
        //第一行写入标题行
        for (int i = 0; i < cellValues.length; i++) {
            cell = row.createCell((short) i);//序号
            cell.setCellStyle(cellStyle);
            cell.setCellValue(cellValues[i]);
        }
    }

    /**
     * 设置列宽
     *
     * @param sheet
     */
    public static void setSheetColumn(HSSFSheet sheet) {
        sheet.setColumnWidth((short) 2, (short) 3200);//设置列宽
        sheet.setColumnWidth((short) 4, (short) 3200);
        sheet.setColumnWidth((short) 7, (short) 5250);
        sheet.setColumnWidth((short) 8, (short) 6250);
    }
	/**
	 * 数据导入Excle 中
	 * @param sheetNameList sheet 名字集合
	 * @param dataMap 数据域
	 * @param cellValues  标题名字
	 * @return
	 */
    public static String dataToExcel(List<String> sheetNameList, Map<String, List<List<String>>> dataMap, String[] cellValues) {
        HSSFWorkbook workbook = new HSSFWorkbook();//创建excel
        ByteArrayOutputStream ops = null;
        ByteArrayInputStream in = null;
        HSSFRow row = null;//创建一行
        HSSFCell cell = null;//每个单元格
        HSSFSheet sheet = null;
        String filePath = "";
        for (String sheetName : sheetNameList) {
            List<List<String>> valueList = dataMap.get(sheetName);
            sheet = null;
            int bodyRowCount = 1;//正文内容行号
            sheet = workbook.createSheet(sheetName);//创建一个工作薄
            ExcelSheetsUtil.setSheetColumn(sheet);//设置工作薄列宽
            HSSFCellStyle titleCellStyle = ExcelSheetsUtil.createTitleCellStyle(workbook);
            ExcelSheetsUtil.writeTitleContent(sheet, titleCellStyle, cellValues); //写入标题
            //正文内容
            for (List<String> item : valueList) {
                row = sheet.createRow(bodyRowCount++);
                //第二行写开始写入正文内容
                for (int i = 0; i < cellValues.length; i++) {
                    cell = row.createCell((short) i);
                    cell.setCellValue(item.get(i));
                }
            }
        }
        ops = new ByteArrayOutputStream();
        try {
            workbook.write(ops);
            byte[] b = ops.toByteArray();
            in = new ByteArrayInputStream(b);
            // 请求Ftp,文件上传
            filePath = ImageUtil.uploadExeclFile(in, new Date().getTime() + "execl.xlsx"); 
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                ops.flush();
                ops.close();
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return filePath;
    }
} 

三、ftp 上传文件流

public static String uploadExeclFile(InputStream inputStream,String fileName) {
    //获取文件的格式
    String fileType = fileName.substring(fileName.indexOf(".")).toLowerCase().trim();
    //生成一个随机的文件名,避免重名覆盖
    String randomString = UUID.randomUUID().toString().replaceAll("-", "");
    String fileNewName = randomString + fileType;
    FTPClient ftpClient = new FTPClient();
    try {
        /*
         *  主动模式 enterLocalActiveMode()->
         *  FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端随机开放一个端口(1024以上),发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;
         *  FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据
         *  被动模式enterLocalPassiveMode()->
         *  FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),
         *  然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输
         * */
        // ftpClient.enterLocalActiveMode();    //主动模式
        ftpClient.connect(EViewConstant.FtpFileServer.HOST, EViewConstant.FtpFileServer.PORT);
        ftpClient.login(EViewConstant.FtpFileServer.USER_NAME, EViewConstant.FtpFileServer.PASSWORD);

        //ftp上传文件是以文本形式传输的,所以多媒体文件会失真,需要转为二进制形式传输
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
        if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
            log.error("未连接到FTP,用户名或密码错误。");
            ftpClient.disconnect();
        } else {
            log.info("FTP连接成功");
        }
        long start = System.currentTimeMillis();
        ftpClient.setControlEncoding("UTF-8");
        //设置成被动模式
        ftpClient.enterLocalPassiveMode();
        boolean fig = ftpClient.storeFile(fileNewName, inputStream);
        if (fig) {
            long end = System.currentTimeMillis();
            log.info(String.format("文件:%s上传成功,耗时:%d毫秒", fileNewName, (end - start)));
        } else {
            log.error("上传失败;ftpClient.storeFile()返回false");
            return "";
        }
    } catch (IOException io) {
        io.printStackTrace();
        log.error("保存Execl到文件服务器ERROR:" + io.getMessage());
        return "";
    } finally {
        //关闭资源
        try {
            if (null != inputStream) {
                inputStream.close();
            }
            //退出
            ftpClient.logout();
            //断开连接
            ftpClient.disconnect();
        } catch (IOException io) {
            log.error("保存Execl到文件服务器关闭资源ERROR" + io.getMessage());
        }
    }
    return EViewConstant.FtpFileServer.IMAGE_URL + fileNewName;
}

四、调用演示

/**
 * 井盖下线缆历史数据导出
 *
 * @param req
 * @return
 */
@Override
public BaseDataRespDTO LineDataListToExcel(DataQueryReq req) {
    // 获取线缆历史数据
    DataLineResultVO lineDataResultVO = this.getLineDataList(req);
    List<Line> lineInfoList = lineDataResultVO.getLineInfoList();
    Map<Integer, List<DataLineHistoryVO>> lineDateMap = lineDataResultVO.getLineDateMap();
    DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    int bodyRowCount = 1;
    String[] cellValues = {"序号", "线缆温度", "电流", "电压", "电池电流", "震动", "433节点数据", "信号强度", "板子温度", "数据时间"};
    List<String> sheetNameList = lineInfoList.stream().map(item-> item.getName()+"_"+item.getId()
    ).collect(Collectors.toList());

    Map<String,List<List<String>>> dataMap = new HashMap<>();
    for (Line line : lineInfoList) {
        //正文内容
        List<List<String>> valueList = new ArrayList<>();
        List<DataLineHistoryVO> dateList = lineDateMap.get(line.getId());
        for (DataLineHistoryVO item : dateList) {
            List<String> list = new ArrayList<>();
            list.add(String.valueOf(bodyRowCount++));
            list.add(item.getLineTemp());
            list.add(item.getLineA());
            list.add(item.getLineV());
            list.add(item.getBatteryA());
            list.add(item.getShake());
            list.add(item.getNode433());
            list.add(item.getSignal());
            list.add(item.getCBTemp());
            list.add(df.format(item.getCreateTime()));
            valueList.add(list);
        }
        bodyRowCount = 1;
        dataMap.put(line.getName()+"_"+line.getId(),valueList);
    }
    return new BaseDataRespDTO(ReturnCodeConstant.SUCCESS,ExcelSheetsUtil.dataToExcel(sheetNameList,dataMap,cellValues));
}

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值