• java导出excel


    最近维护到了导出的功能,由于这个板块整个导出功能都没有开发,所以我算是从头写了这个功能,期间还踩了大坑,写个博客防止自己忘记
    Java导出Excel主要有两种方法jxl和poi,由于jxl太老了,这里只介绍poi的操作方法

    poi简介

    poi是由Apache基金会支持的,使用Java操作微软Office几件套的方法,包括了word,excel,ppt还有visio。
    微软的几件套本质上可以看成一个压缩文件,以excel为例,用打开压缩文件的方式打开一个excel表格就能看见这样的信息

    里面的工作簿,主题,还有样式都是文件,所以很容易可以将一个xlsx表格理解成一个对象,这和Java的万物皆对象思想不谋而合,操作起来十分的方便。

    操作方法

    这里主要介绍导出操作
    我们都知道一个excel工作簿默认有三个表格sheet,每个表格有若干行row(2003版本最多65536,07版会多很多),每个行有若干个单元格cell,单元格里面可以填值value。
    所以按照这个思路,就可以新建表格,再将数据填入相应的单元格中就可以了,使用Java操作也就是把点鼠标和敲键盘变成了敲代码

    新建工作簿

      Workbook workbook = new HSSFWorkbook();  // 03版本
      Workbook workbook = new XSSFWorkbook();  // 07版本
    

    如果需要导入模板,则可以先根据后缀判断使用哪一种

      Workbook workbook = null;
      if (fileName.toLowerCase().endsWith("xls") {
    	  workbook = new HSSFWorkbook(in);
    } else if (fileName.toLowerCase().endsWith("xlsx")) {
    	  workbook = new XSSFWorkbook(in);
      }
    

    获取表格对象

    工作簿新建好了之后,需要选择我们要操作的表格
    Sheet sheet = workbook.getSheetAt(0)
    这里表示获取了第一个表格

    获取行对象

    和获取表格类似,这里需要加一个判断,如果行是空的话,就新建一个行

      Row row = sheet.getRow(i)  // 一般套在for循环里,传入的参数是行数
      if (row == null) {
        row = sheet.createRow(i)  // 表示新建的行是第几行
      }
    

    获取单元格,填入数据

      row.createCell(i).setCellValue("value");
    

    完整代码

    后续还需要写入输出流,选择文件存放位置,就不多论述,主要记录核心思想

    Workbook workbook = null;
    if (fileName.toLowerCase().endsWith("xls") {
      workbook = new HSSFWorkbook();
    } else if (fileName.toLowerCase().endsWith("xlsx") {
      workbook = new XSSFWorkbook();
    }
    
    Sheet sheet = workbook.getSheetAt(0);
    
    for(int i = 0; i < item.length; i ++) {
      Row row = sheet.getRow(i + 1);    // 模板第一行有字,这里从第二行开始
      if (row == null) {
        row = sheet.createRow(i + 1);
      }
      for(int j = 0; j < 10; j ++) {  // 这里的列数有自己需要写入的数据决定
        row.createCell(j).setCellValue("value"+j);
      }
    }
    
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    workbook.write(os)
    

    踩的大坑是在写入单元格数据时需要create一个cell,但是看别人直接用的时getCell,也没问题,而我那么写就会报空指针异常,没想明白。。。

  • 相关阅读:
    Maven报错,没有有效的生命周期
    6张图解释IO流
    传统Java JDBC
    快速杀死占用8080端口进程的批处理(kill-8080.bat)
    ubuntu环境配置终极解答
    Linux系统下Java开发环境的配置(未完...)
    Linux常用命令及操作(第二弹)
    Linux下安装Mysql
    Linux常用命令及操作
    int转LPCTSTR
  • 原文地址:https://www.cnblogs.com/zhiless/p/15529639.html
Copyright © 2020-2023  润新知