Java输出Excel文件

 最近需要将数据导出到Excel文件,因此记录一下操作过程

创建流程

1、实例化HSSFWorkbook
2、实例化HSSFSheet
3、创建HSSFRow
4、创建HSSFCell

示例代码

package com.example.utils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.example.cimdata.CimdataApplication;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

@Slf4j
public class ExcelUtil {

    public static void write(List<JSONObject> list) {
        String[] title = {"编号", "名称", "数据对象", "数据大类", "浏览次数", "使用次数",
                "数据来源", "数据标签", "数据类型", "数据格式", "采集时间", "更新频率",
                "数据提供方", "数据维护方", "摘要", "发布日期", "更新日期", "接口地址"};
        // 创建excel工作簿
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 创建工作表sheet
        HSSFSheet sheet = workbook.createSheet();
        // 创建第一行
        HSSFRow rowHeader = sheet.createRow(0);
        sheet.setDefaultColumnWidth(20);
        HSSFCell cell = null;
        // 插入第一行数据的表头
        for (int i = 0; i < title.length; i++) {
            cell = rowHeader.createCell(i);
            cell.setCellValue(title[i]);
            setHeaderStyle(workbook, cell);
        }
        int[] widths = {1500, 4000, 4000, 4000, 2300, 2300,
                4000, 3000, 3000, 3000, 3000, 2500,
                4000, 4000, 4000, 3000, 3000, 8000};
        for (int i = 0; i < widths.length; i++) {
            sheet.setColumnWidth(i, widths[i]);
        }
        // 写入数据
        int k = 1;
        for (JSONObject json : list) {
            HSSFRow row = sheet.createRow(k++);
            createCell(workbook, row, 0, json.getInteger("id"));
            createCell(workbook, row, 1, json.getString("name"));
            createCell(workbook, row, 2, json.getJSONObject("dataObj").getString("name"));
            createCell(workbook, row, 3, json.getString("dataCatalog"));
            createCell(workbook, row, 4, json.getInteger("scanCnt"));
            createCell(workbook, row, 5, json.getInteger("downloadCnt"));
            createCell(workbook, row, 6, json.getString("source"));
            createCell(workbook, row, 7, getLabels(json.getJSONArray("labels")));
            createCell(workbook, row, 8, json.getString("dataType"));
            createCell(workbook, row, 9, json.getString("dataFormat"));
            createCell(workbook, row, 10, json.getString("timeRange"));
            createCell(workbook, row, 11, json.getString("updateRate"));
            createCell(workbook, row, 12, json.getString("dataProvider"));
            createCell(workbook, row, 13, json.getString("dataMaintain"));
            createCell(workbook, row, 14, json.getString("summary"));
            createCell(workbook, row, 15, getDate(json, "publishDate"));
            createCell(workbook, row, 16, getDate(json, "lastUpdateDate"));
            createCell(workbook, row, 17, json.getJSONObject("gisApi").getString("apiUrl"));
        }
        // 创建excel文件
        String path = String.format("%sfiles/", PathUtil.getAppPath(CimdataApplication.class));
        File file = new File(path + "test.xls");
        try {
            // 将excel写入
            FileOutputStream stream = FileUtils.openOutputStream(file);
            workbook.write(stream);
            stream.close();
        } catch (IOException e) {
            log.error(e.toString());
        }
    }

    private static String getDate(JSONObject json, String name) {
        Date dt = json.getDate(name);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format(dt);
    }

    private static String getLabels(JSONArray array) {
        if (array == null || array.size() == 0) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        for (Object obj : array) {
            JSONObject json = (JSONObject) obj;
            if (sb.length() > 0) {
                sb.append(",");
            }
            sb.append(json.getString("name"));
        }
        return sb.toString();
    }

    private static void createCell(HSSFWorkbook workbook, HSSFRow row, int index, Object value) {
        HSSFCell cell = row.createCell(index);
        if (value instanceof Integer) {
            cell.setCellValue((Integer) value);
        } else {
            cell.setCellValue((String) value);
        }
        if (index == 0 || index == 4 || index == 5 || index == 7 || index == 8 || index == 9 || index == 10 || index == 11 || index == 15 || index == 16) {
            setCellCenter(workbook, cell);
        } else {
            setCellLeft(workbook, cell);
        }
    }

    private static void setHeaderStyle(HSSFWorkbook workbook, HSSFCell cell) {
        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        setBorder(cellStyle);
        Font font = workbook.createFont();
        font.setBold(true);
        cellStyle.setFont(font);
        cell.setCellStyle(cellStyle);
    }

    private static void setCellLeft(HSSFWorkbook workbook, HSSFCell cell) {
        // 创建单元格样式并设置居中对齐
        CellStyle cellStyle = workbook.createCellStyle();
        setBorder(cellStyle);
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        // 将样式应用于单元格
        cell.setCellStyle(cellStyle);
    }

    private static void setCellCenter(HSSFWorkbook workbook, HSSFCell cell) {
        // 创建单元格样式并设置居中对齐
        CellStyle cellStyle = workbook.createCellStyle();
        setBorder(cellStyle);
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        // 将样式应用于单元格
        cell.setCellStyle(cellStyle);
    }

    private static void setBorder(CellStyle cellStyle) {
        // 设置边框
        cellStyle.setBorderTop(BorderStyle.THIN);
        cellStyle.setBorderBottom(BorderStyle.THIN);
        cellStyle.setBorderLeft(BorderStyle.THIN);
        cellStyle.setBorderRight(BorderStyle.THIN);
    }
}

设置列头样式

    private static void setHeaderStyle(HSSFWorkbook workbook, HSSFCell cell) {
        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        setBorder(cellStyle);
        Font font = workbook.createFont();
        font.setBold(true);
        cellStyle.setFont(font);
        cell.setCellStyle(cellStyle);
    }

设置单元格样式

    private static void setCellLeft(HSSFWorkbook workbook, HSSFCell cell) {
        // 创建单元格样式并设置居中对齐
        CellStyle cellStyle = workbook.createCellStyle();
        setBorder(cellStyle);
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        // 将样式应用于单元格
        cell.setCellStyle(cellStyle);
    }

    private static void setCellCenter(HSSFWorkbook workbook, HSSFCell cell) {
        // 创建单元格样式并设置居中对齐
        CellStyle cellStyle = workbook.createCellStyle();
        setBorder(cellStyle);
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        // 将样式应用于单元格
        cell.setCellStyle(cellStyle);
    }

    private static void setBorder(CellStyle cellStyle) {
        // 设置边框
        cellStyle.setBorderTop(BorderStyle.THIN);
        cellStyle.setBorderBottom(BorderStyle.THIN);
        cellStyle.setBorderLeft(BorderStyle.THIN);
        cellStyle.setBorderRight(BorderStyle.THIN);
    }

设置字体样式

Font font = workbook.createFont();
font.setBold(true);
cellStyle.setFont(font);

  • 16
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

angushine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值