POI导出Excel的两种方法

目前我只会这两种,以后掌握其他的方法再更新。

(关于页面如何调用后台)

1 var url = '你的后台路径';
2 $('<form method="post" action="' + url + '"></form>').appendTo('body').submit().remove();

第一种:用代码画出Excel,再导出。

优点:没啥优点;

缺点:

  1、代码量大,难于维护。稍微改动一个地方就要更改很多代码,所谓牵一发而动全身。

  2、样式难以控制,像哪里需要加粗、哪里需要背景色之类的,是比较难描述的。

操作步骤:

  1、POM中添加POI的依赖,如图:

    

   2、创建Workbook对象,为其开辟堆栈内存,代码:

Workbook workbook = new XSSFWorkbook();

  3、创建表单,表单可以创建多个,这里只创建一个表单,代码:

Sheet sheet = workbook.createSheet();

  4、给表单设置名字,以下代码中第一个参数是指第几个表单的意思,如果你创建了两个表单,现在要给第二个表单设置名字,那么第一个参数应该设置为1,因为索引都是从0开始计算的。我们现在给第一个表单设置名字,代码:

workbook.setSheetName(0, "给我一个名字吧");// 表单名

  5、创建行,我们这里以表头示例,因为所有行的创建方法都是一样的。参数代表创建第几行,我们这里创建第一行,参数给0,同样是因为索引都是从0开始计算。代码:

Row headRow = sheet.createRow(0);//创建第一行

  6、创建单元格,这里只创建一个单元格,因为所有单元格的创建方法都是一样的,只是给的参数不同而已。代码:

Cell headCell = headRow.createCell(0);//创建第一行的第一个单元格

  7、给单元格设置样式,代码:

CellStyle headCellStyle = workbook.createCellStyle();//创建单元格样式对象
Font font = workbook.createFont();
font.setBold(true);// 是否加粗
font.setFontHeightInPoints((short)14);// 字体大小
cellStyle.setFont(font);
cellStyle.setAlignment(HorizontalAlignment.CENTER);// 水平居中    
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
headCell.setCellStyle(headCellStyle );//把设置好的样式对象给单元格

  8、给单元格插入值,代码:

headCell.setCellValue("单元格的内容");

  9、设置列宽,代码:

sheet.setColumnWidth(1, headCell.getStringCellValue().getBytes().length * 256);// 设置列宽
sheet.createFreezePane(3, 4); // 冻结第四行第三列

  10、合并单元格,这里我要在第一行合并9个单元格,所以代码如下:

sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 8));// 合并表头 四个参数按顺序释义分别为:要合并的开始行索引、结束行索引、开始列索引、结束列索引

  11、设置行高,代码:

headRow.setHeightInPoints((2 * sheet.getDefaultRowHeightInPoints()));// 设置行高度

  12、以上11个步骤是最基本的excel表单创建、行创建、单元格创建、合并、插入值等方法,具体要画成什么模样,使用上面的方法随意发挥即可。接下来讲如何写入流并在浏览器中提示下载:

 1 try {
 2     Workbook workbook = new XSSFWorkbook();
 3     //省略Excel的绘制步骤 这些步骤就是以上11个步骤
 4     File file = new File(System.getProperty("java.io.tmpdir") + File.separator + "文件名" + ".xlsx");// 提示下载文件
 5     OutputStream out = new FileOutputStream(file);
 6     workbook.write(out);
 7     out.flush();
 8     out.close();
 9     HttpHeaders headers = new HttpHeaders(); 
10     headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
11     headers.setContentDispositionFormData("attachment",StringUtils.newStringIso8859_1(StringUtils.getBytesUtf8(file.getName())))); 
12     return new ResponseEntity<byte[]>(Files.toByteArray(file),headers, HttpStatus.CREATED);
13 } catch (FileNotFoundException e) {
14     e.printStackTrace();
15 } catch (IOException e) {
16      e.printStackTrace();
17 }   

  13、浏览器提示信息如下(这里用的谷歌浏览器导出):

   14、至此方法一分享完毕。

第二种:使用模板导出Excel。

优点:

  1、表单样式都是模板提供的,不需要自己去调整。就算要修改样式,使用微软工具或者WPS修改后再替换项目中的模板即可,不需要代码控制。

  2、不用手动画表格之类的,代码精简,可以把更多的精力用于数据填充上。

缺点:目前没发现。

操作步骤:

  1、POM中添加POI的依赖,如图:

    

   2、把需要导出的Excel文件模板放在web项目下,如图:

   3、获取模板文件,并根据业务需求重命名文件名,代码:

1 String path = ActionUtil.getRequest().getServletContext().getRealPath("/");// 拿到模板文件
2 String filePath = path + "excelTemplate\模板文件名.xlsx";
3 FileInputStream tps = new FileInputStream(new File(filePath));
4 File file = new File(System.getProperty("java.io.tmpdir") + File.separator + "重新设置的文件名"+ ".xlsx");// 提示下载文件
5 OutputStream out = new FileOutputStream(file);

  4、见代码:

XSSFWorkbook workbook = new XSSFWorkbook();// 新建一个Excel的工作空间
workbook = new XSSFWorkbook(tps);// 把模板复制到新建的Excel

  5、给表单填充数据,这里我们给第一个表单填充数据,代码:

1 Sheet sheet = workbook.getSheetAt(0);//拿到第一个表单
2 Row row_01 = sheet.getRow(1);//拿到第一行
3 row_01.getCell(1).setCellValue("我是有内容的单元格了");//给第一行第二个单元格插入值

  6、数据填充方法如同步骤5,根据需要给不同的行和单元格插入数据即可。接下来开始输出并生成Excel文件,代码:

1 workbook.write(out);
2 out.flush();
3 out.close();
4 HttpHeaders headers = new HttpHeaders();  
5 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
6 headers.setContentDispositionFormData("attachment",StringUtils.newStringIso8859_1(StringUtils.getBytesUtf8(file.getName())))); 
7 return new ResponseEntity<byte[]>(Files.toByteArray(file),headers, HttpStatus.CREATED);

  7、步骤6的代码需要处理异常,这个大家应该都知道怎么处理吧!不知道的话看方法一的步骤12。浏览器的下载提示和方法一的步骤13所示是一样的。至此方法二分享完毕。

怎么样?整体看下来是不是方法二更加简单呢?反正我个人是偏向于方法二的!关于POI的相关API网址我在这里分享给大家,毕竟短短一篇博客不可能涵盖所有的API方法的。

关于POI的更多探索,请参阅官网API:http://poi.apache.org/components/spreadsheet/quick-guide.html

原文地址:https://www.cnblogs.com/ywy8/p/11718467.html