1. 程式人生 > >使用 POI建立一個簡單的 Excel 檔案

使用 POI建立一個簡單的 Excel 檔案

初級程式設計師一枚,看到公司大佬寫的生成Excel檔案,做下記錄,同時也分享給大家參考

  ·······································實現原理是用workBook 然後還有OutputStream

首先是一個ExcelDataBean 這個實體類 用來 宣告 Excel的最大行數,最大列數 以及用來儲存  所傳入的 標題列 內容列 並且對它們做出校驗。

import java.util.ArrayList;
import java.util.List;

/**
 * 使用 Excel007Util 工具類建立 Excel 2007 檔案所需要的資料類.
* 包含多個包含標題資訊的頭列表 * 和多個內容行列表. * 超出 Excel 檔案行列限制時會丟擲異常, 不過沒測試過這麼大的資料. * * Created by gongsidalao on 17-5-10. */ public class ExcelDataBean { /** * 2007的是1048576行、16384列. */ public static final int MAX_ROW_SIZE = 1048576; public static final int MAX_COL_SIZE = 16384; private List<List<?>> headerList
; private List<List<?>> rowList; public List<List<?>> getHeaderList() { return headerList; } public List<List<?>> getRowList() { return rowList; } private ExcelDataBean(List<List<?>> headerList, List<List<?>> rowList) { this
.headerList = headerList; this.rowList = rowList; } public static class Builder { private List<List<?>> headerList; private List<List<?>> rowList; public Builder() { headerList = new ArrayList<>(); rowList = new ArrayList<>(); } public Builder addHeaderList(List<?> header) { if (header.size() > MAX_COL_SIZE) { throw new RuntimeException("資料列超出 Excel 允許的最大值!"); } if (headerList.size() + rowList.size() + 1 > MAX_ROW_SIZE) { throw new RuntimeException("資料行超出 Excel 允許的最大值!"); } this.headerList.add(header); return this; } public Builder addRowList(List<?> row) { if (row.size() > MAX_COL_SIZE) { throw new RuntimeException("資料列超出 Excel 允許的最大值!"); } if (headerList.size() + rowList.size() + 1 > MAX_ROW_SIZE) { throw new RuntimeException("資料行超出 Excel 允許的最大值!"); } this.rowList.add(row); return this; } public ExcelDataBean build() { return new ExcelDataBean(headerList, rowList); } } }

 然後下面就是一個工具類了 ,用於生成行row 生成單元格cell然後資料填充

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

import java.io.IOException;
import java.io.OutputStream;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.stream.IntStream;

/**
 * 使用 POI 建立一個簡單的 Excel 檔案
 * Created by gongsidalao on 17-5-10.
 */
public class Excel2007Util {


    /**
     *
     * @param excelDataBean
     * @param outputStream
     * @throws IOException
     */
    public static void createExcel(final ExcelDataBean excelDataBean,
                                   final OutputStream outputStream) throws IOException {

        //建立工作簿物件用於建立Sheet
        final Workbook workbook = new XSSFWorkbook();
        //建立一個Sheet(紙)物件也就是一個EXCEL
        final Sheet sheet = workbook.createSheet();
        //標題行資料List
        final List<List<?>> headerList = excelDataBean.getHeaderList();
        //根據標題列的大小建立幾個帶有標題行的Sheet
        IntStream.range(0, headerList.size())
                .forEach(i ->
                        createRow(i, 0, headerList, sheet ));
      //行偏移量用於建立資料行的時候 做行偏移處理 如果只有一個標題行的話可以寫死為1
        final int rowOffset = headerList.size();
        final List<List<?>> rowList = excelDataBean.getRowList();

        IntStream.range(0, rowList.size())
                .forEach(i ->
                        createRow(i, rowOffset, rowList, sheet ));


        workbook.write(outputStream);

    }
    //建立行
    private static void createRow(final int index, final int rowOffset,
                                  final List<List<?>> rowList,
                                  final Sheet sheet) {
        List<?> data = rowList.get(index);
        if (Objects.nonNull(data) && !data.isEmpty()) {
            final Row row = sheet.createRow(index + rowOffset);
            IntStream.range(0, data.size())
                    .forEach(j ->
                        createCell(j, data, row));
        }
    }
   //建立單元格 並且填充data
    private static void createCell(final int index, final List<?> data, final Row row) {

        final Object obj = data.get(index);
        final Cell cell = row.createCell(index);
        if (obj == null) {
            cell.setCellValue("");
        } else if (Double.class.isInstance(obj)) {
            cell.setCellValue((double) obj);
        } else if (Date.class.isInstance(obj)) {
            Date date = (Date) obj;
            cell.setCellValue(LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).toString());
        } else if (Calendar.class.isInstance(obj)) {
            cell.setCellValue((Calendar) obj);
        } else if (Boolean.class.isInstance(obj)) {
            cell.setCellValue((boolean) obj);
        } else {
            final CreationHelper createHelper = row.getSheet().getWorkbook().getCreationHelper();
            cell.setCellValue(createHelper.createRichTextString(obj.toString()));
        }
    }
}
  附上一個測試類以便測試

import org.junit.Test;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.*;

/**
 * Created by gongsidalao on 17-5-11.
 */
public class Excel2007UtilTest {


    @Test
    public void TestUtil() {

        List<String> header = Arrays.asList("姓名", "年齡", "生日", "記錄建立時間", "婚否", "備註");

        List<Object> list1 = new ArrayList<>();
        list1.add("AA");
        list1.add(18);
        list1.add(Calendar.getInstance());
        list1.add(new Date());
        list1.add(true);
        list1.add(null);

        List<Object> list2 = new ArrayList<>();
        list2.add("BB");
        list2.add(18);
        list2.add(Calendar.getInstance());
        list2.add(new Date());
        list2.add(true);
        list2.add(null);
        System.out.println(list1.get(0));
        String url = "L:/ceshi.xlsx";
        try (OutputStream outputStream = new FileOutputStream(url)) {
            ExcelDataBean excelDataBean = new ExcelDataBean.Builder()
                    .addHeaderList(header)
//                  .addHeaderList(header)
                    .addRowList(list1)
                    .addRowList(list2)
                    .build();

            Excel2007Util.createExcel(excelDataBean, outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
  有什麼不足的還望大家指出來,高手輕噴,做個日常記錄以便學習.