SpringBoot realiza operação de relatório de POI

Introdução aos relatórios POI

No sistema de gerenciamento mymes, operações como gerenciamento de pessoal e pedidos requerem a importação e exportação de relatórios e outras lógicas. Os requisitos são complicados, na verdade é o funcionamento básico da tabela do banco de dados. Este artigo apresenta a exportação do Excel, e a importação dos dados na próxima vez

Visão geral dos relatórios de POI

Demanda digital

No desenvolvimento de aplicativos corporativos, o relatório do Excel é um dos requisitos de relatório mais comuns. Geralmente, existem duas maneiras de desenvolver relatórios do Excel:

  • Para facilitar a operação, carregue os dados em lotes com base em relatórios do Excel
  • Gerar relatório do Excel por meio de código Java

Duas formas de Excel

Atualmente, existem duas versões do Excel, Excel2003 e Excel2007 e superior, a diferença entre os dois:

SpringBoot realiza operação de relatório de POI

Ferramentas de operação comuns do Excel:

Existem dois modos de operação EXCEL comuns em Java: jxl e poi.

  • JXL só pode operar no EXCEL, a estrutura é mais antiga, só suporta a versão Excel95-2000, agora e pare a atualização e manutenção
  • POI é um projeto apache, que pode operar em Microsoft Word, EXCEL, PPT, incluindo office2003 e 2007, poi foi atualizado, todos os quais são mais convencionais

    Operação de entrada de POI

Construção de ambiente POI


 <!--POI Excel-->
       <dependency>
           <groupId>org.apache.poi</groupId>
           <artifactId>poi</artifactId>
           <version>4.0.1</version>
       </dependency>
       <dependency>
           <groupId>org.apache.poi</groupId>
           <artifactId>poi-ooxml</artifactId>
           <version>4.0.1</version>
       </dependency>
       <dependency>
           <groupId>org.apache.poi</groupId>
           <artifactId>poi-ooxml-schemas</artifactId>
           <version>4.0.1</version>
       </dependency>

Descrição da estrutura POI

  • HSSF fornece arquivos no formato xls para leitura e gravação em Excel
  • XSSF fornece documentos no formato XLSX para ler e escrever Excel
  • HWPF fornece documentos em formato doc para leitura e escrita em Word
  • HSLF fornece documentos em formato PPT para leitura e escrita em Word
  • HDGF fornece para ler documentos em formato Visio
  • HSMF fornece leitura de documentos no formato do Outlook
  • HPBF fornece para ler documentos em formato de editor

    Introdução API

  • WorkBook: objeto de documento EXCEL, dividido em diferentes tipos do Excel: HSSFWorkbook (2003) e XSSFWorkbook (2007)
  • Folha: Folha de Excel
  • Linha: Excel 行
  • Célula: grade de células do Excel
  • Fonte: fonte Excel
  • CellStyle: estilo de célula

    Operação basica

Criar Excel

public class PoiTest01 {
    //测试创建excel文件
    public static void main(String[] args) throws Exception {
        //1.创建workbook工作簿
        Workbook wb = new XSSFWorkbook();
        //2.创建表单Sheet
        Sheet sheet = wb.createSheet("test");
        //3.文件流
        FileOutputStream fos = new FileOutputStream("E:\\test.xlsx");
        //4.写入文件
        wb.write(fos);
        fos.close();
   }
}

Criar célula

   //测试创建单元格
    public static void main(String[] args) throws Exception {
        //1.创建workbook工作簿
        Workbook wb = new XSSFWorkbook();
        //2.创建表单Sheet
        Sheet sheet = wb.createSheet("test");
        //3.创建行对象,从0开始
        Row row = sheet.createRow(3);
        //4.创建单元格,从0开始
        Cell cell = row.createCell(0);
        //5.单元格写入数据
        cell.setCellValue("传智播客");
        //6.文件流
        FileOutputStream fos = new FileOutputStream("E:\\test.xlsx");
        //7.写入文件
        wb.write(fos);
        fos.close();
   }

Formatação

   //创建单元格样式对象
        CellStyle cellStyle = wb.createCellStyle();
        //设置边框
        cellStyle.setBorderBottom(BorderStyle.DASH_DOT);//下边框
        cellStyle.setBorderTop(BorderStyle.HAIR);//上边框
        //设置字体
        Font font = wb.createFont();//创建字体对象
        font.setFontName("华文行楷");//设置字体
        font.setFontHeightInPoints((short)28);//设置字号
        cellStyle.setFont(font);
        //设置宽高
        sheet.setColumnWidth(0, 31 * 256);//设置第一列的宽度是31个字符宽度
        row.setHeightInPoints(50);//设置行的高度是50个点
        //设置居中显示
        cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        //设置单元格样式
        cell.setCellStyle(cellStyle);
        //合并单元格
        CellRangeAddress  region =new CellRangeAddress(0, 3, 0, 2);
        sheet.addMergedRegion(region);

Inserir imagem

  //绘制图形
    public static void main(String[] args) throws Exception {
        //1.创建workbook工作簿
        Workbook wb = new XSSFWorkbook();
        //2.创建表单Sheet
        Sheet sheet = wb.createSheet("test");
        //读取图片流
        FileInputStream stream=new FileInputStream("e:\\logo.jpg");
        byte[] bytes= IOUtils.toByteArray(stream);
        //读取图片到二进制数组
        stream.read(bytes);
        //向Excel添加一张图片,并返回该图片在Excel中的图片集合中的下标
        int pictureIdx = wb.addPicture(bytes,Workbook.PICTURE_TYPE_JPEG);
        //绘图工具类
        CreationHelper helper = wb.getCreationHelper();
           //创建一个绘图对象
        Drawing<?> patriarch = sheet.createDrawingPatriarch();
        //创建锚点,设置图片坐标
        ClientAnchor anchor = helper.createClientAnchor();
        anchor.setCol1(0);//从0开始
        anchor.setRow1(0);//从0开始
        //创建图片
        Picture picture = patriarch.createPicture(anchor, pictureIdx);
        picture.resize();
        //6.文件流
        FileOutputStream fos = new FileOutputStream("E:\\test.xlsx");
        //7.写入文件
        wb.write(fos);
        fos.close();
   }

Exportação de relatório POI

Não importa qual seja o requisito, apenas a exportação do relatório requer as seguintes etapas:

  • Construir dados de tabela do Excel
  • Criar pasta de trabalho
  • Criar objeto de folha
  • Criar objeto Row
  • Criar objeto de célula
  • Preenchimento de dados, configuração de estilos e
    download. Pegue os dados do usuário como exemplo. Quem não passou meu artigo pode seguir a conta oficial e ler o artigo anterior

    Classe geral de operação de criação de arquivo FileUtil

package com.cn.greemes.common.util;

import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.poi.excel.BigExcelWriter;
import cn.hutool.poi.excel.ExcelUtil;
import org.apache.poi.xssf.streaming.SXSSFSheet;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * 文件操作
 */
public class FileUtil {

    public static final String SYS_TEM_DIR =System.getProperty("java.io.tmpdir")+ File.separator;

    public static void downloadExcel(List<Map<String, Object>> list, HttpServletResponse response) throws IOException {
        String tempPath = SYS_TEM_DIR + IdUtil.fastSimpleUUID() + ".xlsx";
        File file = new File(tempPath);
        BigExcelWriter writer = ExcelUtil.getBigWriter(file);
        // 一次性写出内容,使用默认样式,强制输出标题
        writer.write(list, true);
        SXSSFSheet sheet = (SXSSFSheet)writer.getSheet();
        //上面需要强转SXSSFSheet  不然没有trackAllColumnsForAutoSizing方法
        sheet.trackAllColumnsForAutoSizing();
        //列宽自适应
        writer.autoSizeColumnAll();
        //response为HttpServletResponse对象
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
        //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
        response.setHeader("Content-Disposition", "attachment;filename=file.xlsx");
        ServletOutputStream out = response.getOutputStream();
        // 终止后删除临时文件
        file.deleteOnExit();
        writer.flush(out, true);
        //此处记得关闭输出Servlet流
        IoUtil.close(out);
    }
}

Configure no controlador

 @ApiOperation("导出用户数据")
   @RequestMapping(value = "/export", method = RequestMethod.GET)
   @ResponseBody
   public void export(HttpServletResponse response, @RequestParam(value = "keyword", required = false) String keyword,
                      @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
                      @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum) throws UnsupportedEncodingException, IOException {
       Page<MesAdmin> adminList = adminService.list(keyword, pageSize, pageNum);

       List<Map<String,Object>> list = new ArrayList();

       for(int i=0;i<149;i++) {
           for (MesAdmin umsAdmin : adminList.getRecords()) {
               Map<String, Object> map = new LinkedHashMap<>(6);
               map.put("姓名", umsAdmin.getUsername());
               map.put("邮箱", umsAdmin.getEmail());
               map.put("昵称", umsAdmin.getNickName());
               map.put("备注信息", umsAdmin.getNote());
               map.put("创建时间", umsAdmin.getCreateTime());
               map.put("最后登录时间", umsAdmin.getLoginTime());
               list.add(map);
           }
       }

       fileUtil.downloadExcel(list,response);
   }

Conclusão:

Desta vez irei apresentar a exportação do Excel, e da próxima vez irei introduzir a importação do Excel. Este é um resumo do meu trabalho. Se houver algo errado, por favor sejam mais diretos e progridam juntos, obrigado!

Endereço do Github:

endereço do github: https://github.com/bangbangzhou/greemes/tree/master

o público

SpringBoot realiza operação de relatório de POI

Acho que você gosta

Origin blog.51cto.com/15077535/2593726
Recomendado
Clasificación