springboot使用poi导出数据生成excel(.xlsx)文件

前言:在实际开发中经常需要将数据库的数据导出成excel文件,poi方式则是其中一种较为常用的导出框架。简单读取excel文件在之前的一篇有说明

本项目实现需求:user发出一个导出student信息的请求,直接下载包含所有student信息的excel文件到本机。只贴出关键代码,未贴出的很简单,自行脑补

整体流程(服务器端):接收请求------>取出数据库数据------>将数据存成excel临时文件------>通过响应头让浏览器下载此临时文件------>删除临时文件

项目结构:

1.导入依赖

<!--poi-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.0</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.0</version>
</dependency>

2.controller

package com.zjk.excel.controller;

import com.zjk.excel.service.UserServiceI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

/**
 * @Auther: zjk
 * @Date: 2019/9/16
 * @Description:
 */
@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    UserServiceI userServiceI;

    @RequestMapping("/export")
    public void exportStu(HttpServletResponse response){
        //设置默认的下载文件名
        String name = "学生信息表.xlsx";
        try {
            //避免文件名中文乱码,将UTF8打散重组成ISO-8859-1编码方式
            name = new String (name.getBytes("UTF8"),"ISO-8859-1");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        //设置响应头的类型
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        //让浏览器下载文件,name是上述默认文件下载名
        response.addHeader("Content-Disposition","attachment;filename=\"" + name + "\"");
        InputStream inputStream=null;
        OutputStream outputStream=null;
        //在service层中已经将数据存成了excel临时文件,并返回了临时文件的路径
        String downloadPath = userServiceI.exportStu();
        //根据临时文件的路径创建File对象,FileInputStream读取时需要使用
        File file = new File(downloadPath);
        try {
            //通过FileInputStream读临时文件,ServletOutputStream将临时文件写给浏览器
            inputStream = new FileInputStream(file);
            outputStream = response.getOutputStream();
            int len = -1;
            byte[] b = new byte[1024];
            while((len = inputStream.read(b)) != -1){
                outputStream.write(b);
            }
            //刷新
            outputStream.flush();
         } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭输入输出流
            try {
                if(inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        //最后才能,删除临时文件,如果流在使用临时文件,file.delete()是删除不了的
        file.delete();
    }
}

3.service

package com.zjk.excel.service.impl;

import com.zjk.excel.dao.StudentDao;
import com.zjk.excel.dao.UserDao;
import com.zjk.excel.entity.Student;
import com.zjk.excel.service.UserServiceI;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.*;
import java.util.List;
import java.util.UUID;

/**
 * @Auther: zjk
 * @Date: 2019/9/16
 * @Description:
 */
@Service
public class UserService implements UserServiceI {
  //创建临时文件存放的路径
    private String temp="d:\\temp\\excel\\";

    @Autowired
    UserDao userDao;

    @Autowired
    StudentDao studentDao;

    @Override
    public String exportStu() {

        List<Student> list = studentDao.queryAllStu();
        //创建工作簿
        XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
        //创建工作表
        XSSFSheet sheet = xssfWorkbook.createSheet();
        xssfWorkbook.setSheetName(0,"学生信息表");
        //创建表头
        XSSFRow head = sheet.createRow(0);
        String[] heads = {"编号","姓名","年龄","性别","手机号"};
        for(int i = 0;i < 5;i++){
            XSSFCell cell = head.createCell(i);
            cell.setCellValue(heads[i]);
        }
        for (int i = 1;i <= 4;i++) {
            Student student = list.get(i - 1);
            //创建行,从第二行开始,所以for循环的i从1开始取
            XSSFRow row = sheet.createRow(i);
            //创建单元格,并填充数据
            XSSFCell cell = row.createCell(0);
            cell.setCellValue(student.getS_id());
            cell = row.createCell(1);
            cell.setCellValue(student.getS_name());
            cell = row.createCell(2);
            cell.setCellValue(student.getS_age());
            cell = row.createCell(3);
            cell.setCellValue("男".equals(student.getS_gender().trim())?"男":"女");
            cell = row.createCell(4);
            cell.setCellValue(student.getS_tel());
        }
        //创建临时文件的目录
        File file = new File(temp);
        if(!file.exists()){
            file.mkdirs();
        }
        //临时文件路径/文件名
        String downloadPath = file + "\\"  +System.currentTimeMillis() + UUID.randomUUID();
        OutputStream outputStream = null;
        try {       //使用FileOutputStream将内存中的数据写到本地,生成临时文件
            outputStream = new FileOutputStream(downloadPath);
            xssfWorkbook.write(outputStream);
            outputStream.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return downloadPath;
    }
}

4.效果

WPS打开后:可以说是非常的丑陋了,接下来优化一下

在service中增加如下代码:总体而言还是很麻烦的,创建CellStyle,还要在你想改变样式的cell进行cell.setCellStyle(style1)才可以

*博主用的版本比较新,所以很多地方较旧版本有区别

        //创建styleHead
        CellStyle styleHead = xssfWorkbook.createCellStyle();
        styleHead.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex());//背景色
        styleHead.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        styleHead.setAlignment(HorizontalAlignment.CENTER);//水平居中
        XSSFFont font = xssfWorkbook.createFont();
        font.setBold(true);//加粗
        font.setFontHeight((short)240);//字体大小
        styleHead.setFont(font);
        //创建style1
        CellStyle style1 = xssfWorkbook.createCellStyle();
        style1.setFillForegroundColor(IndexedColors.LEMON_CHIFFON.getIndex());//背景色
        style1.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        style1.setAlignment(HorizontalAlignment.CENTER);//水平居中
        //创建style2
        CellStyle style2 = xssfWorkbook.createCellStyle();
        style2.setFillForegroundColor(IndexedColors.LIGHT_TURQUOISE.getIndex());//背景色
        style2.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        style2.setAlignment(HorizontalAlignment.CENTER);//水平居中         sheet.setColumnWidth(4,3500);//给第5列设置宽度(tel栏)

优化后:

总结一下:

poi的简单使用还是不难的,说白了就数据库一个表对应一个sheet,表的一行对应一个row,表某一行的一个数据对应一个cell,嗯,就是这么简单。

  说到调样式就非常头疼了,而且新版本的较之前改动比较大,百度出来的东西很多都没法用,勉强捣鼓了一些出来。

  最后给自己打打气-——世上无难事,只要肯登攀!

最后推荐一个中文poi文档:

https://www.cnblogs.com/fqfanqi/p/6172223.html

原文地址:https://www.cnblogs.com/zjk-main/p/11529894.html

时间: 2024-11-09 09:31:12

springboot使用poi导出数据生成excel(.xlsx)文件的相关文章

spring boot 使用POI导出数据到Excel表格

摘自:https://www.cnblogs.com/hopeofthevillage/p/12099807.html spring boot 使用POI导出数据到Excel表格 2019-12-26 00:17  全me村的希望  阅读(42)  评论(0)  编辑收藏 在spring boot 的项目经常碰到将数据导出到Excel表格的需求,而POI技术则对于java操作Excel表格提供了API,POI中对于多种类型的文档都提供了操作的接口,但是其对于Excel表格的操作无疑是最强大的.

java利用poi导出数据到excel

背景: 上一篇写到利用jtds连接数据库获取相应的数据,本篇写如何用poi将数据到处到excel中,此程序为Application 正文: 第三方poi jar包:poi驱动包下载 代码片段: /** * 将数据导出到excel中 * @param data 将要被导入到excel中的数据 * @throws IOException */ public void crateTempFile(ArrayList<LinkedHashMap<String, String>> data)

导出数据生成Excel(MVC)

/// <summary> /// 生成Excel /// </summary> /// <returns></returns> public FileResult ExportProductInfo() { List<Aniuge_spu> spuList = ProductBusiness.GetInstance().GetProdutInfo(); StringBuilder sb = new StringBuilder(); sb.App

Java导出数据生成Excel表格

事先准备: 工具类: package com.wazn.learn.util.export; import java.sql.Connection; import java.sql.DriverManager; public class DbUtil { private String dbUrl="jdbc:mysql://localhost:3306/basepro"; private String dbUserName="user"; private Strin

Python导出数据生成excel报表

#_*_coding:utf-8_*_ import MySQLdb import xlwt from datetime import datetime def get_data(sql): # 创建数据库连接. conn = MySQLdb.connect(host='127.0.0.1',user='root' ,passwd='123456',db='test',port=3306,charset='utf8') # 创建游标 cur = conn.cursor() # 执行查询, cur

Java导出数据为EXCEL的两种方式JXL和POI

JXL和POI导出数据方式的比较 POI支持excel2003和2007,而jxl只支持excel2003. 下面为测试代码: Java代码   public class TestCondition { /** * 生成的记录条数 */ public static final int RECORD_COUNT = 21000; /** * 模板文件 */ public static final String TEMPLATE_FILE = "E:/MyKernelPlatformWorkspac

Springboot利用poi导出excel下载

Springboot利用poi导出excel下载 因为项目中之前的做法是用反射获取属性,所以demo中也是用的反射,我看网上很多文章都是存入一个List中,不知道这两种哪种更何合适一点,或者有什么更好的方法也请大佬们赐教. pom <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.13</version&g

ASP导出数据到excel遇到的一些问题

一直用动易平台的ASP做新闻发布网站,直到现在才接触导出数据到Excel的问题,目的在于公司要统计各部门的投稿量,要做这么个东西,实现起来是挺简单的,但是第一次做,还是费了一些功夫的,特此记录一下 主要代码如下: 写查询字符串 rsAll为查询字符串 rsAll.open sqlAll,conn,1,3 Set xlApplication =server.CreateObject( "Excel.Application") '调用excel对象 xlApplication.Visibl

MVC导出数据到EXCEL新方法:将视图或分部视图转换为HTML后再直接返回FileResult

MVC导出数据到EXCEL新方法:将视图或分部视图转换为HTML后再直接返回FileResult 导出EXCEL方法总结:MVC导出数据到EXCEL的方法有很多种,常见的是: 1.采用EXCEL COM组件来动态生成XLS文件并保存到服务器上,然后转到该文件存放路径即可:优点:可设置丰富的EXCEL格式,缺点:需要依赖EXCEL组件,且EXCEL进程在服务器中无法及时关闭,以及服务器上会存留大量的不必要的XLS文件: 2.设置输出头为:application/ms-excel,再输出拼接的HTM