NPOI之XSSFWorkbook文件生成下载

NPOI之XSSFWorkbook文件生成下载

一个控制台的业务需要将部分数据生成表格能够导出,这里我们选择了XSSFWorkbook,因为够用了

用JavaPOI导出Excel时,我们会考虑到Excel版本及数据量的问题。针对不同的Excel版本,要采用不同的工具类。

HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls;

XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx;

对于不同版本的EXCEL文档要使用不同的工具类,如果使用错了,会提示如下错误信息。

org.apache.poi.openxml4j.exceptions.InvalidOperationException
org.apache.poi.poifs.filesystem.OfficeXmlFileException

从POI 3.8版本开始,提供了一种基于XSSF的低内存占用的API----SXSSF

当数据量超出65536条后,在使用HSSFWorkbook或XSSFWorkbook,程序会报OutOfMemoryError:Javaheap space;内存溢出错误。这时应该用SXSSFworkbook。

由于我们这个不会超过几万条,所以用XSSFWorkbook是够的。
下面放XSSFWorkbook的api说明

点击这几获取XSSFWorkbook的API说明

下面介绍用法,首先pom文件导入jar包,我这里用的是4.1.1

 <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.1</version>
 </dependency>
代码及注释:
//初始化XSSFWorkbook 
XSSFWorkbook book = new XSSFWorkbook();
//创建名为测试123的sheet--对应图一
Sheet sheet = book.createSheet("测试123");
//设置列宽0代表第一列:如图二
sheet.setColumnWidth(0, 3300);
sheet.setColumnWidth(1, 4500);
sheet.setColumnWidth(2, 13200);
//文字格式
Font font = book.createFont();
font.setFontName("宋体");
//设置加粗
font.setBold(true);
//设置文字大小
font.setFontHeightInPoints((short) 24);
//设置字体颜色
font.setColor(Font.COLOR_RED);
//合并单元格依次是从第1行到第一行(从0开始为1),第一列到第三列
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2));
//创建文本格式
XSSFCellStyle textStyle = book.createCellStyle();
//格式化日期
XSSFDataFormat format = book.createDataFormat();
textStyle.setDataFormat(format.getFormat("@"));
//水平居中
textStyle.setAlignment(HorizontalAlignment.CENTER);
//垂直居中
textStyle.setVerticalAlignment(VerticalAlignment.CENTER);
//自动换行
textStyle.setWrapText(true);
//第一行
Row row0 = sheet.createRow(0);
//第一行的第一格
Cell cell0 = row0.createCell(0);
//文字内容
RichTextString text0 = new XSSFRichTextString("广告发布确认书");
//加载字体
text0.applyFont(font); 
// 设置单元格的值
cell0.setCellValue(text0); 
//加载格子格式
cell0.setCellStyle(textStyle);
//再加行格式
row0.setRowStyle(textStyle);
//设置行高
row0.setHeightInPoints(50);//行高
//第二行
Row row1 = sheet.createRow(1);
row1.setHeightInPoints((float) 17.6);//行高
Cell cell1 = row1.createCell(0);
RichTextString text1 = new XSSFRichTextString("序号");
text1.applyFont(font); // 0, 1 表示应用字体的范围
cell1.setCellValue(text1); // 设置单元格的值
cell1.setCellStyle(textStyle);
Cell cell12 = row1.createCell(1);
RichTextString text12 = new XSSFRichTextString("类别");
text12.applyFont(font); // 0, 1 表示应用字体的范围
cell12.setCellValue(text12); // 设置单元格的值
cell12.setCellStyle(textStyle);
Cell cell13 = row1.createCell(2);
RichTextString text13 = new XSSFRichTextString("详情");
text13.applyFont(font); // 0, 1 表示应用字体的范围
cell13.setCellValue(text13); // 设置单元格的值
cell13.setCellStyle(textStyle);
row1.setRowStyle(textStyle);

图一:创建sheet

扫描二维码关注公众号,回复: 11594977 查看本文章

![sheet(https://img-blog.csdnimg.cn/20200818095421306.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYXJsZXNfbHh4,size_16,color_FFFFFF,t_70#pic_center)

图二:设置列宽

列

图三:第一行

字体

图四:效果

在这里插入图片描述

完整的接口如下:

    @CrossOrigin
    @GetMapping(value = "/exportTemplate")
    @ResponseBody
    public void exportTemplate(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String fileName = "广告发布确认书.xlsx";
   
        //初始化返回
        response.reset();
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/msexcel");
        response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes("utf-8"), "ISO-8859-1"));
        response.addHeader("Access-Control-Allow-Origin", "*");
        //这里把上面生成文件加上
        OutputStream out = null;
        try {
             //写出
             out = response.getOutputStream();
             book.write(out);
        } catch (Exception e) {
             logger.error("写入模板异常:", e);
        } finally {
             out.close();
        }
     }

最后一定要关闭所有流

book.close();
out.close();

我这里是通过get把参数实现,直接通过浏览器拼装数据就可以拿到文件

猜你喜欢

转载自blog.csdn.net/Charles_lxx/article/details/108070161