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,也没问题,而我那么写就会报空指针异常,没想明白。。。

posted @ 2021-11-09 16:53  zhiless  阅读(3317)  评论(2编辑  收藏  举报