zoukankan      html  css  js  c++  java
  • Java导出Excel

    POI简介

    前言:文章尾部有4.1.0版本,含有读取、生成和兼容Excel的工具类,3.6和3.17版本了解即可

    POI简介:Jakarta POI 是一套用于访问微软格式文档的Java API。Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF,在各种组件中目前只有用于操作Excel的HSSF相对成熟。

    官方主页http://poi.apache.org/index.html

    API文档http://poi.apache.org/apidocs/index.html

    引入pom

            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.6</version>
            </dependency>
    或者
            <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.17</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.17</version>
            </dependency>

     Jakarta POI HSSF API组件:

    HSSF(用于操作Excel的组件)提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel对象,样式和格式,有以下几种常用的对象:

    常用组件:

    HSSFWorkbook     excel的文档对象

    HSSFSheet            excel的表单

    HSSFRow               excel的行

    HSSFCell                excel的格子单元

    HSSFFont               excel字体

    样式:

    HSSFCellStyle         cell样式

    基本操作步骤:

    首先,我们应该要知道的是,一个Excel文件对应一个workbook,一个workbook中有多个sheet组成,一个sheet是由多个行(row)和列(cell)组成。那么我们用poi要导出一个Excel表格

    的正确顺序应该是:

    1、用HSSFWorkbook打开或者创建“Excel文件对象”

    2、用HSSFWorkbook对象返回或者创建Sheet对象

    3、用Sheet对象返回行对象,用行对象得到Cell对象

    4、对Cell对象读写。

    5、将生成的HSSFWorkbook放入HttpServletResponse中响应到前端页面

    3.6版本的Excel工具类:

    package com.example.demo.utils;
     
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
     
    /**
     * @author 谢辉
     * @Classname ExcelUtil
     * @Description TODO
     * @Date 2020/12/9 18:29
     */
    public class ExcelUtil {
     
        /**
         * 导出Excel
         *
         * @param sheetName sheet名称
         * @param title     标题
         * @param values    内容
         * @param wb        HSSFWorkbook对象
         * @return
         */
        public static HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb) {
     
            // 第一步,创建一个HSSFWorkbook,对应一个Excel文件
            if (wb == null) {
                wb = new HSSFWorkbook();
            }
     
            // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
            HSSFSheet sheet = wb.createSheet(sheetName);
     
            // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
            HSSFRow row = sheet.createRow(0);
     
            // 第四步,创建单元格,并设置值表头 设置表头居中
            HSSFCellStyle style = wb.createCellStyle();
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
     
            //声明列对象
            HSSFCell cell = null;
     
            //创建标题
            for (int i = 0; i < title.length; i++) {
                cell = row.createCell(i);
                cell.setCellValue(title[i]);
                cell.setCellStyle(style);
            }
     
            //创建内容
            for (int i = 0; i < values.length; i++) {
                row = sheet.createRow(i + 1);
                for (int j = 0; j < values[i].length; j++) {
                    //将内容按顺序赋给对应的列对象
                    row.createCell(j).setCellValue(values[i][j]);
                }
            }
            return wb;
        }
    }

    3.17版本的Excel工具类:

    package com.resafety.util;
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.LinkedHashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Set;
     
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
     
    /**
     * @author 谢辉
     * @Classname XiehExcelUtil
     * @Description TODO
     * @Date 2020/12/9 18:34
     */
    public class ExcelUtilX {
     
        /**
         * 导出Excel
         *
         * @param sheetName sheet名称
         * @param title     标题
         * @param data      内容
         * @param wb        Workbook对象: 如果是.xls文件的请传入HSSFWorkbook对象类型
         *                  如果是.xlsx文件的请传入XSSFWorkbook对象类型 默认使用HSSFWorkbook对象类型
         * @return
         */
        public static Workbook getHSSFWorkbook(String sheetName, String[] title, String[][] data, Workbook wb) {
     
            // 第一步,创建一个HSSFWorkbook,对应一个Excel文件
            if (wb == null) {
                // 默认使用兼容.xls文件的
                wb = new HSSFWorkbook();
            }
     
            // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
            Sheet sheet = wb.createSheet(sheetName);
     
            // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
            Row row = sheet.createRow(0);
     
            // 第四步,创建单元格,并设置值表头 设置表头居中
            CellStyle style = wb.createCellStyle();
            // 水平居中
            style.setAlignment(HorizontalAlignment.CENTER);
            // 垂直居中
            // style.setVerticalAlignment(VerticalAlignment.CENTER);
     
            // 声明列对象
            Cell cell = null;
     
            // 创建标题
            for (int i = 0; i < title.length; i++) {
                cell = row.createCell(i);
                cell.setCellValue(title[i]);
                cell.setCellStyle(style);
            }
     
            // 创建内容
            for (int i = 0; i < data.length; i++) {
                row = sheet.createRow(i + 1);
                for (int j = 0; j < data[i].length; j++) {
                    // 将内容按顺序赋给对应的列对象
                    row.createCell(j).setCellValue(data[i][j]);
                }
            }
            return wb;
        }
     
        /**
         * 导出Excel
         *
         * @param sheetName sheet名称
         * @param title     标题
         * @param data      内容
         * @param wb        Workbook对象: 如果是.xls文件的请传入HSSFWorkbook对象类型
         *                  如果是.xlsx文件的请传入XSSFWorkbook对象类型 默认使用HSSFWorkbook对象类型
         * @return
         */
        public static Workbook getHSSFWorkbook(String sheetName, List<ExcelUtilX.TitileBean> title,
                List<Map<String, Object>> data, Workbook wb) {
            // 第一步,创建一个HSSFWorkbook,对应一个Excel文件
            if (wb == null) {
                wb = new HSSFWorkbook();
            }
            if (title == null || title.size() <= 0) {
                throw new IllegalArgumentException("传入的title参数有问题");
            }
            if (data == null) {
                data = new ArrayList<Map<String, Object>>();
            }
            if (data.size() > 0) {
                Map<String, Object> map = data.get(0);
                if (map.size() != title.size()) {
                    throw new IllegalArgumentException("传入的title列数和实际数据列数不一致!");
                }
            }
            // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
            Sheet sheet = wb.createSheet(sheetName);
            // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
            Row row = sheet.createRow(0);
            // 第四步,创建单元格,并设置值表头 设置表头居中
            CellStyle style = wb.createCellStyle();
            // 水平居中
            style.setAlignment(HorizontalAlignment.CENTER);
            // 垂直居中
            // style.setVerticalAlignment(VerticalAlignment.CENTER);
     
            // 声明列对象
            Cell cell = null;
     
            int titleLength = title.size();
     
            // 创建标题
            for (int i = 0; i < titleLength; i++) {
                cell = row.createCell(i);
                cell.setCellValue(title.get(i).getName());
                cell.setCellStyle(style);
            }
     
            // 创建内容
            for (int i = 0; i < data.size(); i++) {
                row = sheet.createRow(i + 1);
                for (int j = 0; j < titleLength; j++) {
                    // 将内容按顺序赋给对应的列对象
                    Cell tempCell = row.createCell(j);
                    // 这里为了代码清晰,每一步都写出来
                    Map<String, Object> map = data.get(i);
                    Object objectValue = map.get(title.get(j).getId());
                    tempCell.setCellValue(objectValue.toString());
                    // tempCell.setCellStyle(style);
                }
            }
            return wb;
        }
     
        /**
         * 导出Excel
         *
         * @param sheetName sheet名称
         * @param data      内容
         * @param wb        Workbook对象: 如果是.xls文件的请传入HSSFWorkbook对象类型
         *                  如果是.xlsx文件的请传入XSSFWorkbook对象类型 默认使用HSSFWorkbook对象类型
         * @return
         */
        public static Workbook getHSSFWorkbook(String sheetName, List<LinkedHashMap<String, Object>> data, Workbook wb) {
            // 创建title
            List<String> title = new ArrayList<String>();
            // 第一步,创建一个HSSFWorkbook,对应一个Excel文件
            if (wb == null) {
                wb = new HSSFWorkbook();
            }
            if (data == null) {
                data = new ArrayList<LinkedHashMap<String, Object>>();
            }
            if (data.size() > 0) {
                // 因为LinkedHashMap保存了插入时的顺序
                LinkedHashMap<String, Object> linkedHashMap = data.get(0);
                Set<Entry<String, Object>> entrySet = linkedHashMap.entrySet();
                for (Entry<String, Object> entry : entrySet) {
                    // 保存title,使用key值作为title
                    title.add(entry.getKey());
                }
            }
            // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
            Sheet sheet = wb.createSheet(sheetName);
            // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
            Row row = sheet.createRow(0);
            // 第四步,创建单元格,并设置值表头 设置表头居中
            CellStyle style = wb.createCellStyle();
            // 水平居中
            style.setAlignment(HorizontalAlignment.CENTER);
            // 垂直居中
            // style.setVerticalAlignment(VerticalAlignment.CENTER);
     
            // 声明列对象
            Cell cell = null;
     
            int titleLength = title.size();
     
            // 创建标题
            for (int i = 0; i < titleLength; i++) {
                cell = row.createCell(i);
                cell.setCellValue(title.get(i));
                cell.setCellStyle(style);
            }
     
            // 创建内容
            for (int i = 0; i < data.size(); i++) {
                row = sheet.createRow(i + 1);
                for (int j = 0; j < titleLength; j++) {
                    // 将内容按顺序赋给对应的列对象
                    Cell tempCell = row.createCell(j);
                    // 这里为了代码清晰,每一步都写出来
                    Map<String, Object> map = data.get(i);
                    Object objectValue = map.get(title.get(j));
                    tempCell.setCellValue(objectValue.toString());
                    // tempCell.setCellStyle(style);
                }
            }
            return wb;
        }
     
        /**
         * 读取Excel数据,简单的行列数据(数据表格式),不适用复杂的数据
         *
         * @param excelPath 文件路径
         * @return 表格数据
         * @throws IOException
         */
        public static List<Map<String, Object>> readExcel(String excelPath) throws IOException {
            Workbook wb = null;
            InputStream is = new FileInputStream(excelPath);
            int indexPoint = excelPath.lastIndexOf(".");
            String suffixName = "";
            if (indexPoint != -1) {
                suffixName = excelPath.substring(indexPoint + 1);
                System.out.println("后缀名是:" + suffixName);
            }
            // 根据文件后缀(xls/xlsx)进行判断
            if ("xls".equalsIgnoreCase(suffixName)) {
                wb = new HSSFWorkbook(is);
            } else if ("xlsx".equalsIgnoreCase(suffixName)) {
                wb = new XSSFWorkbook(is);
            } else {
                throw new IllegalArgumentException("文件类型错误!");
            }
            List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
            List<String> keys = new ArrayList<String>();
            // 遍历sheet页
            for (int numSheet = 0, sheetLength = wb.getNumberOfSheets(); numSheet < sheetLength; numSheet++) {
                Sheet hssfSheet = wb.getSheetAt(numSheet);
                if (hssfSheet == null) {
                    continue;
                }
     
                // 开始遍历行
                if (hssfSheet.getLastRowNum() > 0) {
     
                    // 使用第一行作为key
                    Row row = hssfSheet.getRow(0);
                    for (int i = row.getFirstCellNum(), keyNum = row.getLastCellNum(); i < keyNum; i++) {
                        keys.add(row.getCell(i).getStringCellValue());
                    }
     
                    // 遍历数据行(除去第一行,下标从1开始)
                    for (int j = hssfSheet.getFirstRowNum() + 1, k = hssfSheet.getLastRowNum(); j <= k; j++) {
                        Map<String, Object> map = new LinkedHashMap<String, Object>();
                        // 遍历每个列
                        for (int index = hssfSheet.getRow(j).getFirstCellNum(), cellLength = hssfSheet.getRow(j)
                                .getLastCellNum(); index < cellLength; index++) {
     
                            map.put(keys.get(index), getValue(hssfSheet.getRow(j).getCell(index)));
     
                        }
                        // 存放数据
                        data.add(map);
                    }
     
                } // 行结束
     
            } // sheet页for结束
            return data;
        }
     
        private static String getValue(Cell hssfCell) {
            if (hssfCell.getCellTypeEnum() == CellType.BOOLEAN) {
                // 返回布尔类型的值
                return String.valueOf(hssfCell.getBooleanCellValue());
            } else if (hssfCell.getCellTypeEnum() == CellType.NUMERIC) {
     
                // 返回数值类型的值
                // return String.valueOf(hssfCell.getNumericCellValue());
                return numOfImport(hssfCell);
            } else if (hssfCell.getCellTypeEnum() == CellType.BLANK) {
                // 返回空值
                return "";
            } else {
                // 返回字符串类型的值
                return String.valueOf(hssfCell.getStringCellValue());
            }
        }
     
        /**
         * 数字转换字符串
         *
         * @param cell
         * @return
         */
        private static String numOfImport(Cell cell) {
            String value = cell.toString();
            if (cell.getCellTypeEnum() == CellType.STRING) {// 字符串类型
                return value;
            } else {
                String[] str = value.split("\.");
                if (str.length > 1) {
                    String str1 = str[1];
                    int m = Integer.parseInt(str1);
                    if (m == 0) {
                        return str[0];
                    } else {
                        return value;
                    }
                } else {
                    return value;
                }
            }
     
        }
     
        public static class TitileBean {
            private String id;
            private String name;
     
            public String getId() {
                return id;
            }
     
            public void setId(String id) {
                this.id = id;
            }
     
            public String getName() {
                return name;
            }
     
            public void setName(String name) {
                this.name = name;
            }
     
            @Override
            public String toString() {
                return "TitileBean [id=" + id + ", name=" + name + "]";
            }
        }
     
    }

    关于poi3.17居中的问题

    用到poi居中的3.6版本写法都是这样的:

    HSSFCellStyle cellStyle = wb.createCellStyle();
     
    cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中 

    然后设置到cell中就不多说啦

    这样是不行的

    poi3.17正确的写法:

    //水平居中
    cellStyle.setAlignment(HorizontalAlignment.CENTER);
    //垂直居中
    cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);

    后面略..

    4.1.0版本Excel工具类升级版(增加xls、xlsx格式兼容和读取Excel功能)推荐使用此版本

    pom文件:

            <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>4.1.0</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>4.1.0</version>
            </dependency>

    工具类:

    package com.example.demo.utils;
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.LinkedHashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Set;
     
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
     
    /**
     * @author 谢辉
     * @Classname XiehExcelUtil
     * @Description TODO
     * @Date 2020/12/9 18:34
     */
    public class ExcelUtilX {
     
        /**
         * 导出Excel
         *
         * @param sheetName sheet名称
         * @param title     标题
         * @param data      内容
         * @param wb        Workbook对象:
         *                  如果是.xls文件的请传入HSSFWorkbook对象类型
         *                  如果是.xlsx文件的请传入XSSFWorkbook对象类型
         *                  默认使用HSSFWorkbook对象类型
         * @return
         */
        public static Workbook getHSSFWorkbook(String sheetName, String[] title, String[][] data, Workbook wb) {
     
            // 第一步,创建一个HSSFWorkbook,对应一个Excel文件
            if (wb == null) {
                // 默认使用兼容.xls文件的
                wb = new HSSFWorkbook();
            }
     
            // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
            Sheet sheet = wb.createSheet(sheetName);
     
            // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
            Row row = sheet.createRow(0);
     
            // 第四步,创建单元格,并设置值表头 设置表头居中
            CellStyle style = wb.createCellStyle();
            // 水平居中
            style.setAlignment(HorizontalAlignment.CENTER);
            // 垂直居中
            // style.setVerticalAlignment(VerticalAlignment.CENTER);
     
            // 声明列对象
            Cell cell = null;
     
            // 创建标题
            for (int i = 0; i < title.length; i++) {
                cell = row.createCell(i);
                cell.setCellValue(title[i]);
                cell.setCellStyle(style);
            }
     
            // 创建内容
            for (int i = 0; i < data.length; i++) {
                row = sheet.createRow(i + 1);
                for (int j = 0; j < data[i].length; j++) {
                    // 将内容按顺序赋给对应的列对象
                    row.createCell(j).setCellValue(data[i][j]);
                }
            }
            return wb;
        }
     
        /**
         * 导出Excel
         *
         * @param sheetName sheet名称
         * @param title     标题
         * @param data      内容
         * @param wb        Workbook对象:
         *                  如果是.xls文件的请传入HSSFWorkbook对象类型
         *                  如果是.xlsx文件的请传入XSSFWorkbook对象类型
         *                  默认使用HSSFWorkbook对象类型
         * @return
         */
        public static Workbook getHSSFWorkbook(String sheetName, List<ExcelUtilX.TitileBean> title,
                                               List<Map<String, Object>> data, Workbook wb) {
            // 第一步,创建一个HSSFWorkbook,对应一个Excel文件
            if (wb == null) {
                wb = new HSSFWorkbook();
            }
            if (title == null || title.size() <= 0) {
                throw new IllegalArgumentException("传入的title参数有问题");
            }
            if (data == null) {
                data = new ArrayList<Map<String, Object>>();
            }
            if (data.size() > 0) {
                Map<String, Object> map = data.get(0);
                if (map.size() != title.size()) {
                    throw new IllegalArgumentException("传入的title列数和实际数据列数不一致!");
                }
            }
            // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
            Sheet sheet = wb.createSheet(sheetName);
            // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
            Row row = sheet.createRow(0);
            // 第四步,创建单元格,并设置值表头 设置表头居中
            CellStyle style = wb.createCellStyle();
            // 水平居中
            style.setAlignment(HorizontalAlignment.CENTER);
            // 垂直居中
            // style.setVerticalAlignment(VerticalAlignment.CENTER);
     
            // 声明列对象
            Cell cell = null;
     
            int titleLength = title.size();
     
            // 创建标题
            for (int i = 0; i < titleLength; i++) {
                cell = row.createCell(i);
                cell.setCellValue(title.get(i).getName());
                cell.setCellStyle(style);
            }
     
            // 创建内容
            for (int i = 0; i < data.size(); i++) {
                row = sheet.createRow(i + 1);
                for (int j = 0; j < titleLength; j++) {
                    // 将内容按顺序赋给对应的列对象
                    Cell tempCell = row.createCell(j);
                    // 这里为了代码清晰,每一步都写出来
                    Map<String, Object> map = data.get(i);
                    Object objectValue = map.get(title.get(j).getId());
                    tempCell.setCellValue(objectValue.toString());
                    // tempCell.setCellStyle(style);
                }
            }
            return wb;
        }
     
        /**
         * 导出Excel
         *
         * @param sheetName sheet名称
         * @param data      内容
         * @param wb        Workbook对象:
         *                  如果是.xls文件的请传入HSSFWorkbook对象类型
         *                  如果是.xlsx文件的请传入XSSFWorkbook对象类型
         *                  默认使用HSSFWorkbook对象类型
         * @return
         */
        public static Workbook getHSSFWorkbook(String sheetName, List<LinkedHashMap<String, Object>> data,
                                               Workbook wb) {
            // 创建title
            List<String> title = new ArrayList<String>();
            // 第一步,创建一个HSSFWorkbook,对应一个Excel文件
            if (wb == null) {
                wb = new HSSFWorkbook();
            }
            if (data == null) {
                data = new ArrayList<LinkedHashMap<String, Object>>();
            }
            if (data.size() > 0) {
                // 因为LinkedHashMap保存了插入时的顺序
                LinkedHashMap<String, Object> linkedHashMap = data.get(0);
                Set<Entry<String, Object>> entrySet = linkedHashMap.entrySet();
                for (Entry<String, Object> entry : entrySet) {
                    // 保存title,使用key值作为title
                    title.add(entry.getKey());
                }
            }
            // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
            Sheet sheet = wb.createSheet(sheetName);
            // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
            Row row = sheet.createRow(0);
            // 第四步,创建单元格,并设置值表头 设置表头居中
            CellStyle style = wb.createCellStyle();
            // 水平居中
            style.setAlignment(HorizontalAlignment.CENTER);
            // 垂直居中
            // style.setVerticalAlignment(VerticalAlignment.CENTER);
     
            // 声明列对象
            Cell cell = null;
     
            int titleLength = title.size();
     
            // 创建标题
            for (int i = 0; i < titleLength; i++) {
                cell = row.createCell(i);
                cell.setCellValue(title.get(i));
                cell.setCellStyle(style);
            }
     
            // 创建内容
            for (int i = 0; i < data.size(); i++) {
                row = sheet.createRow(i + 1);
                for (int j = 0; j < titleLength; j++) {
                    // 将内容按顺序赋给对应的列对象
                    Cell tempCell = row.createCell(j);
                    // 这里为了代码清晰,每一步都写出来
                    Map<String, Object> map = data.get(i);
                    Object objectValue = map.get(title.get(j));
                    tempCell.setCellValue(objectValue.toString());
                    // tempCell.setCellStyle(style);
                }
            }
            return wb;
        }
     
        /**
         * 读取Excel数据,简单的行列数据(数据表格式),不适用复杂的数据
         *
         * @param excelPath 文件路径
         * @return 表格数据
         * @throws IOException
         */
        public static List<Map<String, Object>> readExcel(String excelPath) throws IOException {
            Workbook wb = null;
            InputStream is = new FileInputStream(excelPath);
            int indexPoint = excelPath.lastIndexOf(".");
            String suffixName = "";
            if (indexPoint != -1) {
                suffixName = excelPath.substring(indexPoint + 1);
                System.out.println("后缀名是:" + suffixName);
            }
            //根据文件后缀(xls/xlsx)进行判断
            if ("xls".equalsIgnoreCase(suffixName)) {
                wb = new HSSFWorkbook(is);
            } else if ("xlsx".equalsIgnoreCase(suffixName)) {
                wb = new XSSFWorkbook(is);
            } else {
                throw new IllegalArgumentException("文件类型错误!");
            }
            List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
            List<String> keys = new ArrayList<String>();
            // 遍历sheet页
            for (int numSheet = 0, sheetLength = wb.getNumberOfSheets(); numSheet < sheetLength; numSheet++) {
                Sheet hssfSheet = wb.getSheetAt(numSheet);
                if (hssfSheet == null) {
                    continue;
                }
     
                // 开始遍历行
                if (hssfSheet.getLastRowNum() > 0) {
     
                    // 使用第一行作为key
                    Row row = hssfSheet.getRow(0);
                    for (int i = row.getFirstCellNum(), keyNum = row.getLastCellNum(); i < keyNum; i++) {
                        keys.add(row.getCell(i).getStringCellValue());
                    }
     
                    // 遍历数据行(除去第一行,下标从1开始)
                    for (int j = hssfSheet.getFirstRowNum() + 1, k = hssfSheet.getLastRowNum(); j <= k; j++) {
                        Map<String, Object> map = new LinkedHashMap<String, Object>();
                        // 遍历每个列
                        for (int index = hssfSheet.getRow(j)
                                .getFirstCellNum(), cellLength = hssfSheet.getRow(j)
                                     .getLastCellNum(); index < cellLength; index++) {
     
                            map.put(keys.get(index), getValue(hssfSheet.getRow(j).getCell(index)));
     
                        }
                        // 存放数据
                        data.add(map);
                    }
     
                } // 行结束
     
            } // sheet页for结束
            return data;
        }
     
        private static String getValue(Cell hssfCell) {
            if (hssfCell.getCellType() == CellType.BOOLEAN) {
                // 返回布尔类型的值
                return String.valueOf(hssfCell.getBooleanCellValue());
            } else if (hssfCell.getCellType() == CellType.NUMERIC) {
     
                // 返回数值类型的值
                //return String.valueOf(hssfCell.getNumericCellValue());
                return numOfImport(hssfCell);
            } else if (hssfCell.getCellType() == CellType.BLANK) {
                // 返回空值
                return "";
            } else {
                // 返回字符串类型的值
                return String.valueOf(hssfCell.getStringCellValue());
            }
        }
     
        /**
         * 数字转换字符串
         *
         * @param cell
         * @return
         */
        private static String numOfImport(Cell cell) {
            String value = cell.toString();
            if (cell.getCellType() == CellType.STRING) {//字符串类型
                return value;
            } else {
                String[] str = value.split("\.");
                if (str.length > 1) {
                    String str1 = str[1];
                    int m = Integer.parseInt(str1);
                    if (m == 0) {
                        return str[0];
                    } else {
                        return value;
                    }
                } else {
                    return value;
                }
            }
     
     
        }
     
        public static class TitileBean {
            private String id;
            private String name;
     
            public String getId() {
                return id;
            }
     
            public void setId(String id) {
                this.id = id;
            }
     
            public String getName() {
                return name;
            }
     
            public void setName(String name) {
                this.name = name;
            }
     
            @Override
            public String toString() {
                return "TitileBean [id=" + id + ", name=" + name + "]";
            }
        }
     
    }

    测试代码:

    controller:

    package com.example.demo.controller;
     
     
    import com.example.demo.utils.ExcelUtil;
    import com.example.demo.utils.ExcelUtilX;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
     
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.util.*;
     
    /**
     * @author 谢辉
     * @Classname XiehController
     * @Description TODO
     * @Date 2020/12/9 18:00
     */
    @Controller
    @RequestMapping(value = "/xieh")
    public class XiehController {
     
        @RequestMapping(value = "/export")
        @ResponseBody
        public void export(HttpServletRequest request, HttpServletResponse response) throws Exception {
            List<ExcelUtilX.TitileBean> title = new ArrayList<>();
            ExcelUtilX.TitileBean titileBean1 = new ExcelUtilX.TitileBean();
            ExcelUtilX.TitileBean titileBean2 = new ExcelUtilX.TitileBean();
            titileBean1.setId("name");
            titileBean1.setName("名字");
            titileBean2.setId("age");
            titileBean2.setName("年龄");
            title.add(titileBean1);
            title.add(titileBean2);
     
            List<Map<String, Object>> data = new ArrayList<>();
            Map<String, Object> map = new HashMap<>();
            map.put("name", "谢辉");
            map.put("age", 23);
            data.add(map);
     
            //excel文件名
            String fileName = "学生信息表.xls";
            //sheet名
            String sheetName = "学生信息表";
     
            //创建HSSFWorkbook
            Workbook wb = ExcelUtilX.getHSSFWorkbook(sheetName, title, data, null);
     
            //响应到客户端
            try {
                this.setResponseHeader(response, fileName);
                OutputStream os = response.getOutputStream();
                wb.write(os);
                os.flush();
                os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
        @RequestMapping(value = "/export2")
        @ResponseBody
        public void export2(HttpServletRequest request, HttpServletResponse response) throws Exception {
            List<LinkedHashMap<String, Object>> data = new ArrayList<>();
            LinkedHashMap<String, Object> map = new LinkedHashMap<>();
            map.put("name", "谢辉");
            map.put("age", 23);
            data.add(map);
     
            //excel文件名
            String fileName = "学生信息表2.xlsx";
            //sheet名
            String sheetName = "学生信息表";
     
            //创建HSSFWorkbook
            Workbook wb = ExcelUtilX.getHSSFWorkbook(sheetName, data, new XSSFWorkbook());
     
            //响应到客户端
            try {
                this.setResponseHeader(response, fileName);
                OutputStream os = response.getOutputStream();
                wb.write(os);
                os.flush();
                os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
        @RequestMapping(value = "/export3")
        @ResponseBody
        public void export3(HttpServletRequest request, HttpServletResponse response) throws Exception {
            //获取数据
            // List<PageData> list = reportService.bookList(page);
            List<Map<String, String>> list = new ArrayList<>();
            Map<String, String> map1 = new LinkedHashMap<String, String>();
            map1.put("stuName", "谢辉");
            map1.put("stuSex", "男");
            map1.put("stuAge", "23");
            map1.put("stuSchoolName", "小学");
            map1.put("stuClassName", "2");
            list.add(map1);
     
            //excel标题
            String[] title = {"名称", "性别", "年龄", "学校", "班级"};
            // 内容
            String[][] content = new String[list.size()][title.length];
            //excel文件名
            String fileName = "学生信息表3.xlsx";
            //sheet名
            String sheetName = "学生信息表";
            for (int i = 0; i < list.size(); i++) {
                Map<String, String> obj = list.get(i);
                content[i][0] = obj.get("stuName");
                content[i][1] = obj.get("stuSex");
                content[i][2] = obj.get("stuAge");
                content[i][3] = obj.get("stuSchoolName");
                content[i][4] = obj.get("stuClassName");
            }
     
            //创建HSSFWorkbook
            //HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null);
            Workbook wb = ExcelUtilX.getHSSFWorkbook(sheetName, title, content, new XSSFWorkbook());
     
            //响应到客户端
            try {
                this.setResponseHeader(response, fileName);
                OutputStream os = response.getOutputStream();
                wb.write(os);
                os.flush();
                os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
     
        //发送响应流方法
        private void setResponseHeader(HttpServletResponse response, String fileName) {
            try {
                try {
                    fileName = new String(fileName.getBytes(), "ISO8859-1");
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                response.setContentType("application/octet-stream;charset=ISO8859-1");
                response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
                response.addHeader("Pargam", "no-cache");
                response.addHeader("Cache-Control", "no-cache");
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

    test:

    package com.example.demo;
     
    import com.example.demo.utils.ExcelUtilX;
    import org.junit.jupiter.api.Test;
    import org.springframework.boot.test.context.SpringBootTest;
     
    import java.io.IOException;
    import java.util.List;
    import java.util.Map;
     
    @SpringBootTest
    class DemoApplicationTests {
     
        @Test
        void contextLoads() throws IOException {
            String p1 = "D:\学生信息表2.xlsx";
            List<Map<String, Object>> maps1 = ExcelUtilX.readExcel(p1);
            String p2 = "D:\学生信息表3.xlsx";
            List<Map<String, Object>> maps2 = ExcelUtilX.readExcel(p2);
            String p3 = "D:\学生信息表.xls";
            List<Map<String, Object>> maps3 = ExcelUtilX.readExcel(p3);
            System.out.println(maps1.toString());
            System.out.println(maps2.toString());
            System.out.println(maps3.toString());
        }
     
    }

    前端使用:

        $(".Excel").click(function() {
            window.location.href = basePath + "/xieh/export";
        });

    结语:

    Excel工具类供参考,可以自己拓展~~~~

    码云地址:https://gitee.com/xieh-gitee/SpringBootExcleQRcode

  • 相关阅读:
    docker学习笔记1-- 用Toolbox安装Docker--介绍Docker Machine
    IDEA中文出现乱码解决
    hadoop本地运行与集群运行
    关于IDEA导出项目jar包/runnable jar
    IDEA 添加jar包的三种方式(重点:new uer Libraries)
    windows下客户端开发hdf--环境搭建
    junit在idea中的使用(1)--理论篇
    word的"bug"
    第4章 控制执行流程
    第3章 操作符
  • 原文地址:https://www.cnblogs.com/xiejn/p/14111219.html
Copyright © 2011-2022 走看看