zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    LINUX系列:Shell命令
    java程序猿必须掌握的4种线程池
    JAVA编程:Lock线程锁
    Spring框架之IOC的基本配置
    浅谈Java中的内部类
    [XDFZDay2]NOIP模拟
    [XDFZ集训Day1]NOI2020模拟1
    CSP2019游记
    11.11-11.12 CSP模拟总结
    [BJOI2019]排兵布阵
  • 原文地址:https://www.cnblogs.com/ywy8/p/11718467.html
Copyright © 2011-2022 走看看