最近维护到了导出的功能,由于这个板块整个导出功能都没有开发,所以我算是从头写了这个功能,期间还踩了大坑,写个博客防止自己忘记
Java导出Excel主要有两种方法jxl和poi,由于jxl太老了,这里只介绍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,也没问题,而我那么写就会报空指针异常,没想明白。。。