Excel導入導出工具——POI XSSF的使用


工具簡介

POI是Apache提供的一款用於處理Microsoft Office的插件,它可以讀寫Excel、Word、PowerPoint、Visio等格式的文件。

其中XSSF是poi對Excel2007(.xlsx)文件操作的Java實現,例如,我們可以使用它來實現產品中常見的導入導出功能。

XSSF的常用類:

  |-XSSFWorkbook:Excel文檔對象

  |-XSSFSheet:Excel的表單

  |-XSSFRow:Excel的行

  |-XSSFCell:Excel的單元格

  |-XSSFCellStyle:Excel單元格的實現

  |-XSSFCellHeader:Excel的表單頭部

  |-XSSFCellFooter:Excel的表單尾部

 

使用工具導出的步驟

0. 導入jar包或添加依賴,主要是apache的poi和poi-ooxml;

1. 新建Excel文檔實例,並且在文檔實例中新建表單;

2. 添加標題,即在Excel表單中新建標題行,然后遍歷標題數據,對每一個數據都新建單元格,然后設置單元格的值,必要時設置樣式;

3. 添加內容,即遍歷內容數據,對每一條數據都新建行(主要不要覆蓋標題行),然后遍行數據,對每一個數據都新建單元格,設置單元格的值和樣式;

4. 返回Excel文檔實例,其他組件(例如controller)使用這個文檔進行輸出流操作,實現文件導出。

 

導出示例Demo

pom文件

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

 

自定義工具類

package cn.monolog.diana.excel.util;

import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.xssf.usermodel.*;

/**
 * 自定義工具類,用於讀寫Excel2007文件
 * created on 2019-05-21
 */
public class ExcelUtil {

    /**
     * 獲取文檔
     * @param sheetname 表單名
     * @param title 標題欄
     * @param content 內容
     * @return
     */
    public static XSSFWorkbook getWorkbook (String sheetname, String[] title, String[][] content) {
        //新建文檔實例
        XSSFWorkbook workbook = new XSSFWorkbook();

        //在文檔中添加表單
        XSSFSheet sheet = workbook.createSheet(sheetname);

        //創建單元格格式,並設置居中
        XSSFCellStyle style = workbook.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);

        //創建第一行,用於填充標題
        XSSFRow titleRow = sheet.createRow(0);
        //填充標題
        for (int i=0 ; i<title.length ; i++) {
            //創建單元格
            XSSFCell cell = titleRow.createCell(i);
            //設置單元格內容
            cell.setCellValue(title[i]);
            //設置單元格樣式
            cell.setCellStyle(style);
        }
        
        //填充內容
        for (int i=0 ; i<content.length ; i++) {
            //創建行
            XSSFRow row = sheet.createRow(i+1);
            //遍歷某一行
            for (int j=0 ; j<content[i].length ; j++) {
                //創建單元格
                XSSFCell cell = row.createCell(j);
                //設置單元格內容
                cell.setCellValue(content[i][j]);
                //設置單元格樣式
                cell.setCellStyle(style);
            }
        }

        //返回文檔實例
        return workbook;
    }
}

 

controller組件

package cn.monolog.diana.excel.controller;

import cn.monolog.diana.excel.util.ExcelUtil;
import cn.monolog.diana.excel.model.Person;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 用於模擬導入導出組件
 * created on 2019-05-21
 */
@Controller
@RequestMapping("/excel")
public class ExcelController {

    /**
     * 導出
     * @param response
     */
    @RequestMapping(value = "/export")
    @ResponseBody
    public void export(HttpServletResponse response) throws ParseException {
        //獲取要導出的數據列表,在生產環境中要從數據庫中查詢,這里為了簡化,自己創建
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Person p1 = new Person(182, "張叄", "建築", 25, simpleDateFormat.parse("2014-10-01"));
        Person p2 = new Person(205, "李肆", "結構", 30, simpleDateFormat.parse("2015-10-01"));
        Person p3 = new Person(311, "王伍", "給排水", 28, simpleDateFormat.parse("2016-10-01"));
        Person p4 = new Person(377, "趙陸", "電氣", 31, simpleDateFormat.parse("2017-10-01"));
        Person p5 = new Person(505, "蔣柒", "暖通", 26, simpleDateFormat.parse("2018-10-01"));
        List<Person> personList = new ArrayList<>();
        personList.add(p1);
        personList.add(p2);
        personList.add(p3);
        personList.add(p4);
        personList.add(p5);

        //設置文件名、表單名、標題欄
        String fileName = "員工信息表" + simpleDateFormat.format(new Date()) + ".xlsx";
        String sheetname = "員工信息表";
        String[] title = {"編號", "姓名", "專業", "年齡", "入職日期"};

        //聲明表單內容
        String[][] content = new String[personList.size()][title.length];
        //遍歷要導出的數據列表,構造表單內容
        for (int i=0 ; i<personList.size() ; i++) {
            //獲取表單第i行
            String[] row = content[i];
            //獲取對應的數據實例
            Person person = personList.get(i);
            //填充內容
            row[0] = String.valueOf(person.getId());
            row[1] = person.getName();
            row[2] = person.getMajor();
            row[3] = String.valueOf(person.getAge());
            row[4] = simpleDateFormat.format(person.getEnrollmentTime());
        }

        //獲取文檔
        XSSFWorkbook workbook = ExcelUtil.getWorkbook(sheetname, title, content);

        //聲明輸出流
        OutputStream outputStream = null;
        //響應到客戶端
        try {
            //設置響應頭
            response.setContentType("application/octet-stream;charset=UTF-8");
            response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8") );
            response.addHeader("Pargam", "no-cache");
            response.addHeader("Cache-Control", "no-cache");

            //獲取輸出流
            outputStream = response.getOutputStream();

            //用文檔寫輸出流
            workbook.write(outputStream);

            //刷新輸出流
            outputStream.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //關閉輸出流
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM