• Java后端导出Excel


    1、技术概述,描述这个技术是做什么?学习该技术的原因,技术的难点在哪里。

    1.1技术概述

    使用Apache POI实现JAVA后端导出Excel文件。

    1.2原因

    学习该技术主要是因为,我负责的部分要完成Java后端导出Excel文件到前端,为完成此功能而学习。

    1.3难点

    我认为该技术的难点在于Apache POI的引用jar包的导入和Excel导出文件格式的设计。

    2、技术详述

    2.1Apache POI的下载和导入

    首先下载poi-3.6-20091214.jar,下载地址如下:https://download.csdn.net/detail/evangel_z/3895051

    或者使用Maven仓库管理,在pom文件添加坐标

    <!--poi -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>4.0.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>4.0.1</version>
            </dependency>
    

    2.2依赖包

    commons-io-2.4.jar
    poi-4.0.1.jar

    2.3Excel生成工具类代码

    package com.example.team.util;
    
    import com.example.team.util.DataVo;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.xssf.streaming.SXSSFWorkbook;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class ExcelWriter {
        private static List<String> CELL_HEADS; //列头
    
        static {
            // 类装载时就载入指定好的列头信息,如有需要,可以考虑做成动态生成的列头
            // 这里是我个人使用的类的名称,可以进行修改
            CELL_HEADS = new ArrayList<>();
            CELL_HEADS.add("用户名");
            CELL_HEADS.add("待办集");
            CELL_HEADS.add("待办");
            CELL_HEADS.add("待办完成情况");
            CELL_HEADS.add("待办集完成情况");
        }
    
        /**
         * 生成Excel并写入数据信息
         *
         * @param dataList 数据列表
         * @return 写入数据后的工作簿对象
         */
        public static HSSFWorkbook exportData(List<DataVo> dataList) {
            // 生成xlsx的Excel
            HSSFWorkbook workbook = new HSSFWorkbook();
    
            // 如需生成xls的Excel,请使用下面的工作簿对象,注意后续输出时文件后缀名也需更改为xls
            //Workbook workbook = new HSSFWorkbook();
    
            // 生成Sheet表,写入第一行的列头
            Sheet sheet = buildDataSheet(workbook);
            //构建每行的数据内容
            int rowNum = 1;
            for (Iterator<DataVo> it = dataList.iterator(); it.hasNext(); ) {
                DataVo data = it.next();
                if (data == null) {
                    continue;
                }
                //输出行数据
                Row row = sheet.createRow(rowNum++);
                convertDataToRow(data, row);
            }
            return workbook;
        }
    
        /**
         * 生成sheet表,并写入第一行数据(列头)
         *
         * @param workbook 工作簿对象
         * @return 已经写入列头的Sheet
         */
        private static Sheet buildDataSheet(Workbook workbook) {
            Sheet sheet = workbook.createSheet();
            // 设置列头宽度
            for (int i = 0; i < CELL_HEADS.size(); i++) {
                sheet.setColumnWidth(i, 4000);
            }
            // 设置默认行高
            sheet.setDefaultRowHeight((short) 400);
            // 构建头单元格样式
            CellStyle cellStyle = buildHeadCellStyle(sheet.getWorkbook());
            // 写入第一行各列的数据
            Row head = sheet.createRow(0);
            for (int i = 0; i < CELL_HEADS.size(); i++) {
                Cell cell = head.createCell(i);
                cell.setCellValue(CELL_HEADS.get(i));
                cell.setCellStyle(cellStyle);
            }
            return sheet;
        }
    
        /**
         * 设置第一行列头的样式
         *
         * @param workbook 工作簿对象
         * @return 单元格样式对象
         */
        private static CellStyle buildHeadCellStyle(Workbook workbook) {
            CellStyle style = workbook.createCellStyle();
            //对齐方式设置
            style.setAlignment(HorizontalAlignment.CENTER);
            //边框颜色和宽度设置
            style.setBorderBottom(BorderStyle.THIN);
            style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); // 下边框
            style.setBorderLeft(BorderStyle.THIN);
            style.setLeftBorderColor(IndexedColors.BLACK.getIndex()); // 左边框
            style.setBorderRight(BorderStyle.THIN);
            style.setRightBorderColor(IndexedColors.BLACK.getIndex()); // 右边框
            style.setBorderTop(BorderStyle.THIN);
            style.setTopBorderColor(IndexedColors.BLACK.getIndex()); // 上边框
            //设置背景颜色
            style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
            style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            //粗体字设置
            Font font = workbook.createFont();
            font.setBold(true);
            style.setFont(font);
            return style;
        }
    
        /**
         * 将数据转换成行
         *
         * @param data 源数据
         * @param row  行对象
         * @return
         */
        private static void convertDataToRow(DataVo data, Row row) {
            int cellNum = 0;
            Cell cell;
            // 用户名
            cell = row.createCell(cellNum++);
            if (null != data.getUserName()) {
                cell.setCellValue(data.getUserName());
            } else {
                cell.setCellValue("");
            }
            // 待办集名
            cell = row.createCell(cellNum++);
            if (null != data.getSName()) {
                cell.setCellValue(data.getSName());
            } else {
                cell.setCellValue("");
            }
            // 待办名
            cell = row.createCell(cellNum++);
            cell.setCellValue(null == data.getName() ? "" : data.getName());
            // 待办情况记录(0未完成,1完成)
            cell = row.createCell(cellNum++);
            if (null != data.getRecord()) {
                cell.setCellValue(data.getRecord());
            } else {
                cell.setCellValue("");
            }
            // 待办集情况记录(0未完成,1完成)
            cell = row.createCell(cellNum++);
            if (null != data.getSetRecord()) {
                cell.setCellValue(data.getSetRecord());
            } else {
                cell.setCellValue("");
            }
        }
    }
    

    dataVo类

    package com.example.team.util;
    
    /**
     * 读取Excel时,封装读取的每一行的数据
     */
    public class DataVo {
        /**
         * 用户名
         */
        private String userName;
    
        /**
         * 待办名
         */
        private String name;
    
        /**
         * 待办集名
         */
        private String sName;
    
        /**
         * 待办情况记录
         */
        private String record;
    
        /**
         * 待办情况记录
         */
        private String setRecord;
    
        /**
         * 待办完成度
         */
        private String completion;
    
        public String getUserName() { return userName; }
    
        public void setUserName(String userName) { this.userName = userName; }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSName() {
            return sName;
        }
    
        public void setSName(String sName) {
            this.sName = sName;
        }
    
        public String getRecord() {
            return record;
        }
    
        public void setRecord(String record) {
            this.record = record;
        }
    
        public String getSetRecord() {
            return setRecord;
        }
    
        public void setSetRecord(String setRecord) {
            this.setRecord = setRecord;
        }
    
        public String getCompletion(){
            return completion;
        }
    
        public void setCompletion(String completion){
            this.completion = completion;
        }
    
    }
    
    

    3、技术使用中遇到的问题和解决过程。

    1.在技术使用过程中,因为我下载的是较新版本的Apache POI的jar包,导致我从网上找到的工具类和版本不匹配,这导致我需要按这我的版本去修改这个工具类,这样才可以使用。
    2.在第一次写好后,使用时发现,excel导出只能导出到本地的文件夹里,不可以进行传输,后面有上网去查找资料,将其改成了HSSFWorkbook的,传递的是数据流,这样就可以将后端的excel打包传到异地的前端。

    4、进行总结。

    之前没有进行过后端的Excel生成,起初的时候感觉挺难的,但是当我看了网上的其他人写的解析以后,对于Java后端导出Excel有了概念,并且借助于网上热心网友提供的工具类,让我可以更好的借鉴和应用。现在,我将这些东西进行一个总结,在这谢谢那些大佬们的帮助。

    5、列出参考文献、参考博客

    我的博客中内容较少,如要更详细的,可以看以下的博客
    Java导出Excel(Poi详解)——养只狗名叫猫
    JAVA实现创建Excel表并导出——D_shine
    JAVA实现文件导出Excel——迷你熊爱你

  • 相关阅读:
    HTML5拖拽
    HTML5地理定位
    HTML5文件读取
    HTML5全屏
    HTML5网络状态
    可爱的小黄人
    HTML5新增特性
    前端表单标签
    前端(表格)
    前端列表
  • 原文地址:https://www.cnblogs.com/wgfp/p/13183826.html
Copyright © 2020-2023  润新知