JAVA使用poi和easyexcel读写excel文件

Apache的poi处理Excel

maven依赖

<!--xls -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>

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

POI生成excel

private static void write() {
    
    
    //创建HSSFWorkbook
    HSSFWorkbook workbook = new HSSFWorkbook();
    //创建sheet
    HSSFSheet hssfSheet = workbook.createSheet("sheet_name");
    //创建下面的row和cell
    for(int i = 0 ; i < 10 ;i ++){
    
    
        HSSFRow row = hssfSheet.createRow(i);
        for(int j = 0;j < 5; j ++){
    
    
            row.createCell(j).setCellValue("cell["+i+"]" + "["+j+"]");
        }
    }
    try (OutputStream out = new FileOutputStream("D:\\easyexcel\\a.xls")){
    
    
        //写出文件,导出excel只需要在response中获取OutputStream,设置响应类型即可
        workbook.write(out);
    } catch (IOException e) {
    
    
        e.printStackTrace();
    }
    try {
    
    
        workbook.close();
    } catch (IOException e) {
    
    
        e.printStackTrace();
    }
}

POI读取Excel

​ poi读取excel要注意excel格式,最好提前都设置成文本,否则需要处理,详细操作看Cell实现类的toString()源码,这里是对源码里的代码改了一下。

private static void read() throws Exception{
    
    
    //String fileName = "D:\\easyexcel\\de.xls";
    String fileName = "D:\\easyexcel\\de1.xlsx";
    //xls
    //Workbook workbook = new HSSFWorkbook(new FileInputStream(fileName));
    //使用工厂创建Workbook
    //Workbook workbook = WorkbookFactory.create(new FileInputStream(fileName));
    //xlsx
    Workbook workbook = new XSSFWorkbook(fileName);
    Sheet sheet = workbook.getSheetAt(0);
    for(int i = 0 ;i <= sheet.getLastRowNum(); i ++){
    
    
        Row row = sheet.getRow(i);
        for(int j = 0; j < row.getLastCellNum();j ++){
    
    
            Cell cell = row.getCell(j);
            System.out.println(getVal(cell));
        }
    }
    workbook.close();
}

/**
 * 读取值。这里直接复制Cell实现类的toString()方法,改了日期格式、公式和科学计数法的处理
 * 最好导入的时候excel单元格格式设置成文本
 * @param cell
 * @return
 */
private static String getVal(Cell cell){
    
    
    if(cell == null){
    
     return null;}
    switch(cell.getCellType()) {
    
    
        case STRING:
            //字符串
            return cell.getStringCellValue();
        case BLANK:
            //空值
            return "";
        case FORMULA:
            //公式 改成CellType.STRING ,读取到公式的值,否则返回的是公式本身 例如 E5 + E6
            cell.setCellType(CellType.STRING);
            return cell.getStringCellValue();
            //return cell.getCellFormula();
        case NUMERIC:
            //默认时间格式会读成数值型,toString()源码这样处理 改了日期的格式
            if (DateUtil.isCellDateFormatted(cell)) {
    
    
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS", LocaleUtil.getUserLocale());
                sdf.setTimeZone(LocaleUtil.getUserTimeZone());
                //数值型 时间格式也是数值型需要转换
                return sdf.format(cell.getDateCellValue());
            }
            String numeric = String.valueOf(cell.getNumericCellValue());
            //处理科学计数法
            if(numeric.contains("E")){
    
    
                return new BigDecimal(numeric).toPlainString();
            }
            //数值型
            return String.valueOf(cell.getNumericCellValue());
        case BOOLEAN:
            // 布尔型
            return cell.getBooleanCellValue() ? "TRUE" : "FALSE";
        case ERROR:
            //错误
            return null;
        default:
            return "Unknown Cell Type: " + cell.getCellType();
    }
}

Easyexcel

Easyexcel:EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)
maven依赖

<!--Easyexcel-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.2.6</version>
</dependency>

<!-- 日志实现-->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

生成excel

private static void writedemo() {
    
    
    //excel表头,有深度的表头,表头可以不止占一行的表格,根据List数组大小
    List<List<String>> head = new ArrayList<>();
    head.add(Collections.singletonList("姓名"));
    head.add(Collections.singletonList("年龄"));
    head.add(Collections.singletonList("性别"));
    //数据
    List<List<String>> dataList = new ArrayList<>();
    dataList.add(Arrays.asList("小红","18","女"));
    dataList.add(Arrays.asList("小黑","19","男"));
    dataList.add(Arrays.asList("小紫","20","女"));
    //要创建的excel路径
    String fileName = "D:\\easyexcel\\writedemo.xlsx";
    //生成excel
    EasyExcelFactory.write(fileName).sheet("自定义sheet_name").head(head).doWrite(dataList);
}

生成excel多个sheet页

private static void writeSheets() {
    
    
    //文件路径
    String fileName = "D:\\easyexcel\\writeString2.xlsx";
    //获取ExcelWriterBuilder
    ExcelWriterBuilder writerBuilder = EasyExcelFactory.write(fileName);
    //构建ExcelWriter
    ExcelWriter writer = writerBuilder.build();
    //创建sheet信息
    WriteSheet writeSheet = new WriteSheet();
    //sheet页头
    writeSheet.setHead(Arrays.asList(Arrays.asList("姓名"),Arrays.asList("性别"),Arrays.asList("爱好")));
    //sheet序号
    //writeSheet.setSheetNo(0);
    //sheet页名称
    writeSheet.setSheetName("sheet1");
    writer.write(Arrays.asList(Arrays.asList("二哈","男","睡觉")),writeSheet);
    //构建第二个sheet页
    WriteSheet writeSheet1 = new WriteSheet();
    //writeSheet1.setSheetNo(1);
    writeSheet1.setHead(Arrays.asList(Arrays.asList("1"),Arrays.asList("2"),Arrays.asList("3")));
    writeSheet1.setSheetName("sheet2");
    writer.write(Arrays.asList(Arrays.asList("4","5","6")),writeSheet1);
    writer.finish();
}

根据JAVA对象生成excel

  1. 创建java对象

    @Data
    public class User {
          
          
    
        //value是头部名称,index是下标,以0开始
        @ExcelProperty(value = "姓名",index = 0)
        private String name;
    
        @ExcelProperty(value = "部门",index = 1)
        private String dept;
    
        @ExcelProperty(value = "性别",index = 2)
        private String sex;
    
        public User(String name,String dept,String sex){
          
          
            this.name = name;
            this.dept = dept;
            this.sex = sex;
        }
    
        public User(){
          
          }
    }
    
  2. 生成excel代码

    private static void write() {
          
          
        //文件路径
        String fileName = "D:\\easyexcel\\demo.xlsx";
        //创建对象List数组
        List<User> list = new ArrayList<>();
        for(int i = 0; i < 10 ;i ++){
          
          
            list.add(new User("name"+i,"dept" + i,"sex" + i));
        }
        ExcelWriterBuilder writerBuilder = EasyExcelFactory.write(fileName,User.class);
        writerBuilder.sheet("sheet_name1").doWrite(list);
    }
    

读取excel

  1. 创建监听类,继承AnalysisEventListener

    public class EasyexcelListener extends AnalysisEventListener<User> {
          
          
    
        /**
         * 一行一行读取excel
         * @param user
         * @param analysisContext
         */
        @Override
        public void invoke(User user, AnalysisContext analysisContext) {
          
          
            System.out.println(user.toString());
        }
    
        /**
         * excel头读取
         * @param headMap
         * @param context
         */
        @Override
        public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
          
          
            System.out.println(headMap.toString());
            super.invokeHeadMap(headMap, context);
        }
    
        @Override
        public void doAfterAllAnalysed(AnalysisContext analysisContext) {
          
          
        }
    }
    
  2. 读取excel

    private static void read() {
          
          
        String fileName = "D:\\easyexcel\\demo.xlsx";
        //创建ExcelReaderBuilder,传入文件路径(也可以输入流),对象类类型(之前创建的User对象),新建的监听类
        ExcelReaderBuilder readerBuilder = EasyExcelFactory.read(fileName,User.class,new EasyexcelListener());
        //sheet(0) 读取的sheet页
        readerBuilder.sheet(0).doRead();
    }
    

文件下载

@RequestMapping(value = "/test")
@RestController
public class TestController {
    
    

    @GetMapping(value = "/downLoad")
    public void downLoad(HttpServletResponse response) throws Exception{
    
    
        //导出数据
        List<List<String>> lists = new ArrayList<>();
        for(int i = 0;i < 10;i++){
    
    
            lists.add(Arrays.asList("name" + i,"性别" + i,"年龄" + i));
        }
        //响应设置
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Disposition", "attachment; filename=" + System.currentTimeMillis() + ".xlsx");
        //在response获取ServletOutputStream
        ExcelWriterBuilder writerBuilder = EasyExcelFactory.write(response.getOutputStream());
        ExcelWriterSheetBuilder sheetBuilder = writerBuilder.sheet("sheet_name");
        sheetBuilder.doWrite(lists);
    }
}

猜你喜欢

转载自blog.csdn.net/zhaoqingquanajax/article/details/114849282