SpringBoot整合POI实现对Excel的读写操作

了解

Excel2003和Excel2007的区别如下:

(1)Excel2003的保存格式为duxxx.xls,其后缀名为.xls;Excel2007的保存格式为xxx.xlsx,其后缀名名为.xlsx。
(2)Excel2003表格共有65536行,256列;Excel2007表格共有1048576行,16384列。

(1).pom.xml中导入依赖

		<!-- 使用poi操作Excel所需要的的依赖 -->
        <dependency> <!-- 03(xls) 最多65536-->
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency> <!-- 07(xlsx) -->
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency> 
        	<!-- 日期格式化工具new DateTime().toString("yyyy-MM-dd HH:mm:ss") -->
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.10.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.0.1</version>
        </dependency>

(2).准备实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student implements Serializable {
    
    
    private int id;
    private String name;
    private int age;
    private String gender;

    public List<String> convertObj2List() {
    
    
        List<String> ret = new ArrayList<>();
        ret.add(this.id + "");
        ret.add(this.name);
        ret.add(this.age + "");
        ret.add(this.gender);
        return ret;
    }
}

(3).创建Excel工作簿

public class WriteExcelUtils {
    
    

    private final static String EXCEL2003 = "xls";
    private final static String EXCEL2007 = "xlsx";

    /**
     *
     * @param sheetName sheet工作表名称
     * @param headList Excel第一行表头信息
     * @param dataList Excel具体数据信息
     * @param path 生成的Excel的保存路径
     * @return
     */
    public static boolean createWorkBook(String sheetName, List<String> headList, List<List<String>> dataList, String path) {
    
    

        // 创建03/07版本的工作簿
        Workbook wb = null;
        if(path.endsWith(EXCEL2003)) wb = new HSSFWorkbook(); // 03版xls
        if(path.endsWith(EXCEL2007)) {
    
    
            wb = new XSSFWorkbook();// 07版xlsx
            // new SXSSFWorkbook() => 07版xlsx升级版XSSFWorkbook,加快速度
        }

        //创建工作表
        Sheet sheet = wb.createSheet(sheetName != null ? sheetName : "new sheet");
        //设置字体
        Font headFont = wb.createFont();
        headFont.setFontHeightInPoints((short) 14);
        headFont.setFontName("Courier New");
        headFont.setItalic(false);
        headFont.setStrikeout(false);
        //设置头部单元格样式
        CellStyle headStyle = wb.createCellStyle();
        //设置单元格下线条及颜色
        headStyle.setBorderBottom(BorderStyle.THIN);
        headStyle.setBottomBorderColor(IndexedColors.BLUE.getIndex());
        //设置单元格左线条及颜色
        headStyle.setBorderLeft(BorderStyle.THIN);
        headStyle.setLeftBorderColor(IndexedColors.BLUE.getIndex());
        //设置单元格又线条及颜色
        headStyle.setBorderRight(BorderStyle.THIN);
        headStyle.setRightBorderColor(IndexedColors.BLUE.getIndex());
        //设置单元格线条及颜色
        headStyle.setBorderTop(BorderStyle.THIN);
        headStyle.setTopBorderColor(IndexedColors.BLUE.getIndex());
        //设置水平对齐方式
        headStyle.setAlignment(HorizontalAlignment.CENTER);
        //设置垂直对齐方式
        headStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        headStyle.setFont(headFont);  //设置字体

        Row headRow = sheet.createRow(0);
        CreationHelper createHelper = wb.getCreationHelper();
        for (int i = 0; i < headList.size(); i++) {
    
      //遍历表头数据
            Cell cell = headRow.createCell(i);  //创建单元格
            cell.setCellValue(createHelper.createRichTextString(headList.get(i)));  //设置值
            cell.setCellStyle(headStyle);  //设置样式
        }

        int rowIndex = 1;  //当前行索引
        //创建Rows
        //设置数据单元格格式
        CellStyle dataStyle = wb.createCellStyle();
        dataStyle.setBorderBottom(BorderStyle.THIN);  //设置单元格线条
        dataStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());   //设置单元格颜色
        dataStyle.setBorderLeft(BorderStyle.THIN);
        dataStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
        dataStyle.setBorderRight(BorderStyle.THIN);
        dataStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
        dataStyle.setBorderTop(BorderStyle.THIN);
        dataStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
        dataStyle.setAlignment(HorizontalAlignment.LEFT);    //设置水平对齐方式
        dataStyle.setVerticalAlignment(VerticalAlignment.CENTER);  //设置垂直对齐方式

        for (List<String> rowdata : dataList) {
    
     //遍历所有数据
            Row row = sheet.createRow(rowIndex++); //第一行为头
            for (int j = 0; j < rowdata.size(); j++) {
    
      //编译每一行
                Cell cell = row.createCell(j);
                cell.setCellStyle(dataStyle);
                cell.setCellValue(createHelper.createRichTextString(rowdata.get(j)));
            }
        }

        /*设置列自动对齐*/
        for (int i = 0; i < headList.size(); i++) {
    
    
            sheet.autoSizeColumn(i);
        }

        try (OutputStream fileOut = new FileOutputStream(path)) {
    
      //获取文件流
            wb.write(fileOut);   //将workbook写入文件流
        } catch (FileNotFoundException e) {
    
    
            e.printStackTrace();
            return false;
        } catch (IOException e) {
    
    
            e.printStackTrace();
            return false;
        }
        return true;
    }

}

(4)读取Excel工作簿

public class ReadExcelUtils {
    
    

    /**
     * @param path 读取的Excel的路径
     * @param sheetName  sheet工作表名称
     * @throws IOException
     */
    public static void readExcel(String path, String sheetName) throws IOException {
    
    
        //创建输入流
        FileInputStream fileInputStream = new FileInputStream(path);
        //获得poi输入流
        POIFSFileSystem poifsFileSystem = new POIFSFileSystem(fileInputStream);
        //获得文档
        HSSFWorkbook Workbook = new HSSFWorkbook(poifsFileSystem);
        //根据name获取sheet表
        HSSFSheet sheet = Workbook.getSheet(sheetName);
        // Workbook.getNumberOfSheets() =>获取这个工作簿的所有sheet个数

        //获得行数,下标从0开始
        int lastRow = sheet.getLastRowNum();// 或者sheet.getPhysicalNumberOfRows()
        System.out.println("行数:" + (lastRow + 1));
        //获取第二行(第一行一般是标题)
        HSSFRow row = sheet.getRow(1);
        //获得列数,下标从1开始
        int lastCell = row.getLastCellNum();// 或者row.getPhysicalNumberOfCells()
        System.out.println("列数:" + lastCell);

        for (int i = 0; i <= lastRow; i++) {
    
     //遍历每一行
            row = sheet.getRow(i);
            if (row != null) {
    
    
                for (int j = 0; j < lastCell; j++) {
    
    
                    //遍历每一列的cell
                    HSSFCell cell = row.getCell(j);
                    if (cell != null) {
    
    
                        String value = "";
                        switch (cell.getCellType()) {
    
     //SwitchCase判断单元格的类型
                            case STRING: // 字符串类型
                                value = cell.getStringCellValue();
                                break;

                            case BOOLEAN: // Boolean类型
                                value = String.valueOf(cell.getBooleanCellValue());
                                break;

                            case NUMERIC: // 数值(日期,普通数字)
                                if (HSSFDateUtil.isCellDateFormatted(cell)) {
    
     // 日期
                                    value = new DateTime(cell.getDateCellValue()).toString("yyyy-MM-dd HH:mm:ss");
                                } else {
    
     // 普通数字
                                    cell.setCellType(STRING);// 防止数字过长转成String
                                    value = cell.toString();
                                }
                                break;

                            case FORMULA: // 计算公式
                                String cellFormula = cell.getCellFormula(); //获取计算公式
                                System.out.println(cellFormula);
                                // 根据计算公式计算
                                CellValue evaluate = Workbook.getCreationHelper().createFormulaEvaluator().evaluate(cell);
                                value = evaluate.formatAsString();
                                break;

                            case BLANK: // 空值
                                value = "";
                                break;

                            case ERROR: // 类型错误
                                value = "类型错误";
                                break;

                            default:
                                value = "未知类型";
                                break;
                        }

                        System.out.print(value + " ");
                    }
                }
                System.out.println();
            }
        }
        fileInputStream.close();
    }

}

(4).测试

public class TestExcel {
    
    
    public static void main(String[] args) throws Exception {
    
    
        //创建一个Excel
        List<Student> list = new ArrayList<>();
        list.add(new Student(1, "ali123", 34, "男"));
        list.add(new Student(2, "xiaoli123", 3, "男"));
        list.add(new Student(3, "zhangli123", 34, "男"));
        List<List<String>> ret = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
    
    
            List<String> obj2List = list.get(i).convertObj2List();
            ret.add(obj2List);
        }
        WriteExcelUtils.createWorkBook("test", Arrays.asList(new String[]{
    
    "编号","姓名","年龄","性别"}),ret,"D:/1.xls");
        //读取excel
        ReadExcelUtils.readExcel("D:/1.xls", "test");
    }
}

(5).测试结果

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

猜你喜欢

转载自blog.csdn.net/qq_39182939/article/details/113059728