java操作excel之poi和easyexcel

先说apache poi

只说怎么使用,其他相关分档可以查阅资料–引入jar包

   <!--连接xhsell服务器-->
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.54</version>
        </dependency>

        <!-- 操作excel-->
        <!--xls(03)-->
<!--        <dependency>-->
<!--            <groupId>org.apache.poi</groupId>-->
<!--            <artifactId>poi</artifactId>-->
<!--            <version>4.1.2</version>-->
<!--        </dependency>-->
<!--        &lt;!&ndash;xlsx(07)&ndash;&gt;-->
<!--        <dependency>-->
<!--            <groupId>org.apache.poi</groupId>-->
<!--            <artifactId>poi-ooxml</artifactId>-->
<!--            <version>4.1.2</version>-->
<!--        </dependency>-->

        <!--阿里巴巴 easyexcel   阿里巴巴的包括上面两个版本的依赖  防止依赖冲突 引入阿里巴巴的 上面就注释调 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.0-beta2</version>
        </dependency>

        <!-- 日期格式化工具  -->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.10.1</version>
        </dependency>

        <!--HttpServlet servlet-->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>9.0.64</version>
        </dependency>

        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
            <scope>compile</scope>
        </dependency>

        <!-- JSON -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>


    </dependencies>

hssfworkbook 03 (xls) 03版本数据最多65536行
sxssfworkbook 07升级版 效率高
xssfworkbook 07 (xlsx);

直接看代码V03版本 --写-- hssfworkbook

public class Demo01ExcelWritePoiV03 {
    public static void main(String[] args) throws IOException {
        //创建的excel文件位置;  //Random随机数
        String fileName="2测试excel"+new Date().getSeconds()+".xls";
        String path="E:\\javaTestdirectory\\"+fileName;

        //1.创建工作簿;
        Workbook workbook = new HSSFWorkbook();
        //2.创建一个工作表;
        Sheet sheet=workbook.createSheet("我是sheet1表");
        //3.创建行
        Row row=sheet.createRow(0); //创建第一行;
        //4.创建列(创建一个单元格)
        Cell cell=row.createCell(0);//此时已经创建好第一行第一列的那个 就是最左上角那个;
        cell.setCellValue("我是第一行,第一列的值"); //往单元格赋值

        Cell cell1=row.createCell(1);
        cell1.setCellValue("我是第一行,第二列的值");


        //创建第二行
        Row row1=sheet.createRow(1);
        row1.createCell(0).setCellValue("我是第二行,第一列的值");
        row1.createCell(1).setCellValue("我是第二行,第二列的值--时间"+new DateTime().toString("yyyy-MM-dd HH:mm:ss"));//这个time需要jar包;

        /**
         * 合并单元格;
         */
        //        sheet.addMergedRegion(new CellRangeAddress(起始行,终止行,起始列,终止列));
//        sheet.addMergedRegion(new CellRangeAddress(0,1,0,1));

        //生成表;(io流) 03版本是xls结尾的文件
        FileOutputStream fos = new FileOutputStream(path);
        workbook.write(fos);
        //关流;
        fos.close();
        System.out.println("文件生成完毕!");

    }
}

直接看代码V03版本 --读-- hssfworkbook

public class Demo03ExcelReadPoiV03 {
    public static void main(String[] args) throws IOException {
        String path="E:\\javaTestdirectory\\测试[email protected]";

        //创建io流 读取文件
        FileInputStream fis = new FileInputStream(path);
        //1.创建一个工作簿;
        Workbook workbook = new HSSFWorkbook(fis);
        //根据索引获取sheet表  0表示第一个sheet表
        Sheet sheet = workbook.getSheetAt(0);
        //获取第几行
        Row row = sheet.getRow(0);
        //获取第几列;
        Cell cell = row.getCell(0);
        //获取值:-->注意读取的类型;
        String cellValue = cell.getStringCellValue();

        //关流
        fis.close();

        System.out.println("(0,0)--》"+cellValue);

    }
}

07版本跟03 差别不大 ,区别在于 new的对象不同 ,面向对象编程

07版本关流之前需要清空一下临时文件--具体原因--看存储过程;
  //new SXSSFWorkbook(1000); //07更快 1000表示先把超过这个数 就先把前面的数据写进去
            //((sxssfworkbook)workbook).dispose //清除临时文件 因为他会生成临时文件;

单元格的数据类型判断

  
        //获取这个值的类型
        /**
         *  _NONE(-1),
         *     NUMERIC(0),  数字(日期和普通数字)
         *     STRING(1),   字符串
         *     FORMULA(2),   计算公式;
         *     BLANK(3),   空
         *     BOOLEAN(4),  布尔
         *     ERROR(5);  错误
         */
        int cellType = cell.getCellType();
        System.out.println("--celltype-->"+cellType);


        switch (cellType){
            case HSSFCell.CELL_TYPE_STRING;
                System.out.println("string类型"):
                break;
            case HSSFCell.CELL_TYPE_NUMERIC:
                System.out.println("num类型");
                break;
            default:
                System.out.println("---走着-->");
                break;

        }

合并单元格

/**
         * 合并单元格;
         */
        //        sheet.addMergedRegion(new CellRangeAddress(起始行,终止行,起始列,终止列));
//        sheet.addMergedRegion(new CellRangeAddress(0,1,0,1));

单元格样式

   private static void setHeaderStyle(XSSFCellStyle cellStyle, Workbook workbook, Cell cell) {
        // 首行样式
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        cellStyle.setWrapText(true);
        cellStyle.setBorderBottom(BorderStyle.THIN); // 下边框
        cellStyle.setBorderLeft(BorderStyle.THIN);// 左边框
        cellStyle.setBorderTop(BorderStyle.THIN);// 上边框
        cellStyle.setBorderRight(BorderStyle.THIN);// 右边框
        cellStyle.setFillForegroundColor(IndexedColors.ROYAL_BLUE.index);
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 填充模式

        Font font = workbook.createFont();
        font.setFontHeightInPoints((short) 11);
        font.setFontName("宋体");
        font.setColor(IndexedColors.WHITE.index);
        font.setBold(true);

        cellStyle.setFont(font);
        cell.setCellStyle(cellStyle);
    }

    private static void setDataStyle(XSSFCellStyle cellStyle, Workbook workbook, Cell cell) {
        // 数据样式
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        cellStyle.setWrapText(true);
        cellStyle.setBorderBottom(BorderStyle.THIN); // 下边框
        cellStyle.setBorderLeft(BorderStyle.THIN);// 左边框
        cellStyle.setBorderTop(BorderStyle.THIN);// 上边框
        cellStyle.setBorderRight(BorderStyle.THIN);// 右边框
        cellStyle.setFillForegroundColor(IndexedColors.WHITE.index);
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 填充模式

        Font font = workbook.createFont();
        font.setFontHeightInPoints((short) 10);
        font.setFontName("宋体");

        cellStyle.setFont(font);
        cell.setCellStyle(cellStyle);
    }


 private static String stripHtml(String content) {
        // 

替换为换行 content = content.replaceAll("

", "\n"); //

替换为换行
content = content.replaceAll("", "\n"); //

替换为换行 content = content.replaceAll("", "\n"); // 去掉其它的<>之间的东西 content = content.replaceAll("\\<.*?>", ""); return content; }

easyexcel --直接看代码 ,不解释了

1.实体类

package com.me.modules.excel.easyexcel;

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

import java.util.Date;

/**

 */

@Data
public class Student {

    @ExcelProperty("人员id")
    private int id;

    @ExcelProperty("人员姓名")
    private String name;

    @ExcelProperty("人员年龄")
    private String age;

    @ExcelProperty("人员电子邮件")
    private String email;

    @ExcelProperty("日期")
    private Date date;

    @ExcelProperty("人员性别")
    private boolean sex;

    /**
     * 忽略这个字段;
     */
    @ExcelIgnore
    private String ignore;
}

2.写

package com.me.modules.excel.easyexcel;

import com.alibaba.excel.EasyExcel;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
    使用easyexcel写入数据
 */
public class DemoEasyexcelWrite01 {
    public static void main(String[] args) {

        String path="E:\\javaTestdirectory\\easyexcle_"+System.currentTimeMillis()+".xlsx";
        /**
         * 模拟数据-创建对象数组;
         */
        Date date = new Date();

        List<Student> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Student student = new Student();
            student.setAge("2"+i);
            student.setDate(date);
            student.setId(i);
            student.setEmail("我是email_"+i);
            student.setSex(true);
            student.setIgnore("我是ingnore_"+i);
            student.setName("我是名字——"+i);
            list.add(student);
        }
//        System.out.println(list.toString());

        //写入文件
        /**
         * 方法1;
         * 这里需要指定写用哪个class去写,然后写到第一个sheet,名字为我是模板1,然后文件流会自动关闭
         * 如果这里i想用03版 则传入exceltype参数即可;
         */
        EasyExcel.write(path,Student.class).sheet("我是模板1").doWrite(list);


    }
}

3.读–创建监听;

package com.me.modules.excel.easyexcel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

/**

 */
public class DemoEasyexcelReadListener extends AnalysisEventListener<Student> {
    private static final Logger LOGGER= LoggerFactory.getLogger(DemoEasyexcelReadListener.class);

    private static  final int BATCH_COUNT=5;
    List<Student>list=new ArrayList<Student>();
    //读取数据会执行invoke方法; student类型;  AnalysisContext分析上问
    @Override
    public void invoke(Student data, AnalysisContext analysisContext) {
        System.out.println("数据--》"+ JSON.toJSONString(data));
        list.add(data);
        //达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易oom
        if (list.size()>=BATCH_COUNT){   //此时list里面有五个; //每五个会走进这个里面;
            //持久化逻辑
            saveData();
           //存储完成清理list;
            list.clear();
        }
    }

    private void saveData() {
        System.out.println("自定义操作--"+"一条条的读取数据");
    }

    /**
     * 所有数据解析完成了 都会来调用
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        //这里也要保存数据,确保最后遗留的数据也存储到数据库种;
        saveData();
        System.out.println("所有数据解析完成!");  //最后一条数据走这
    }
}

4.读

package com.me.modules.excel.easyexcel;

import com.alibaba.excel.EasyExcel;

/**
    读取数据;
 */
public class DemoEasyexcelReade01 {
    public static void main(String[] args) {
        String path="E:\\javaTestdirectory\\easyexcle_1669639882647.xlsx";
        /**
         * 读取文件
         * 有个重点: DemoEasyexcelReadListener不能被sptring管理,要每次读取excel都要new,然后里面用到soring可以构造方法传进
         *指定读用student的clss 读取第一个sheet 文件流自动关闭;
         */
        EasyExcel.read(path,Student.class,new DemoEasyexcelReadListener()).sheet().doRead();
    }
}

你可能感兴趣的:(java,excel,开发语言)