使用java生成Excel表格

依赖

<!-- excel表格 -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>

生成表格的工具类

生成的Excel表格保存到当前程序的 temp 文件夹

生产表格的实体类放到最下面了

package com.pro.common.utils;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.pro.common.vo.ReportedExcelDataVo;

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


/**
 * 签章的 Excel 表格生成工具类
 */
public class SealExcelUtil {

    private static Logger logger = LoggerFactory.getLogger(SealExcelUtil.class);


    /**
     * 创建 Excel 文件
     *
     * @param dataObject excel文件对象
     * @return
     */
    public static String createExcel(ReportedExcelDataVo dataObject) {
        Workbook wb = createWorkbookExcel(dataObject);

        // 生成文件
        OutputStream outputStream = null;
        try {
            // 保存到当前程序的 temp 文件夹
            File temp = new File("temp");
            if (!temp.exists()) {
                temp.mkdirs();
            }
            logger.warn(">>> Excel文件保存文件夹: [{}]", temp.getAbsolutePath());

            String fileName = String.format("%s%sorigin_%s.xlsx", temp.getAbsolutePath(), File.separator, UUID.randomUUID().toString().replace("-", ""));
            outputStream = new FileOutputStream(fileName);
            wb.write(outputStream);

            logger.warn(">>> Excel文件保存位置: [{}]", fileName);
            return fileName;
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("生成excel文件异常", e);
        } finally {
            try {
                if (outputStream != null) {
                    outputStream.flush();
                    outputStream.close();
                }
            } catch (Exception e) {

            }
            try {
                if (wb != null) {
                    wb.close();
                }
            } catch (Exception e) {

            }
        }

        return null;
    }

    /**
     * 创建上报 Excel 表格
     *
     * @param dataObject
     */
    public static Workbook createWorkbookExcel(ReportedExcelDataVo dataObject) {
        Workbook wb = new HSSFWorkbook();
        int rowSize = 0;
        // 分隔行数
        int separatorRows = 1;

        // 创建工作表1
        Sheet sheet = wb.createSheet();

        // 合并单元格, CellRangeAddress 四个参数为:起始行,结束行,起始列,结束列
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 5)); // 合并第一行的1到6列
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 1)); // 合并第二行的1、2列
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 0, 1)); // 合并第三行的1、2列

        // 设置某一列的宽度(列, 宽度), 列宽的字符是 1/256, 所以 *256
        sheet.setColumnWidth(0, 20 * 256);
        sheet.setColumnWidth(1, 30 * 256);


        // 创建右上角第一行(右上角标签行)
        Row topRow = sheet.createRow(rowSize);
        // 设置行高, 行高像素点是1/20, 所以 *20
        topRow.setHeight((short) (40 * 20));
        Cell topRightCell = topRow.createCell(0);
        topRightCell.setCellValue(dataObject.getFillBatchNum());
        // 创建样式
        CellStyle topRightCellStyle = wb.createCellStyle();
        topRightCellStyle.setVerticalAlignment(VerticalAlignment.TOP); // 垂直对齐方式
        topRightCellStyle.setAlignment(HorizontalAlignment.RIGHT); // 水平对齐方式
        // 填充样式
        topRightCell.setCellStyle(topRightCellStyle);


        // 创建第1行(标题行)
        rowSize += 1;
        Row row1 = sheet.createRow(rowSize);
        // 设置当前行的高度, 行高像素点是1/20, 所以 *20
        row1.setHeight((short) (40 * 20)); // 行高 *20
        // 给列赋值
        Cell cell = row1.createCell(0);
        cell.setCellValue(dataObject.getTitle());
        // 创建样式
        CellStyle cellStyle = wb.createCellStyle();
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直对齐方式
        cellStyle.setAlignment(HorizontalAlignment.CENTER); // 水平对齐方式
        // 创建字体
        Font font = wb.createFont();
        font.setFontHeight((short) (15 * 20)); // 字体大小 *20
        font.setBold(true); // 字体加粗
        cellStyle.setFont(font);
        // 填充样式
        cell.setCellStyle(cellStyle);

        // 创建第2行(副标题行)
        rowSize += 1;
        Row row2 = sheet.createRow(rowSize);
        // 设置当前行的高度, 行高像素点是1/20, 所以 *20
        row2.setHeight((short) (40 * 20)); // 行高 *20
        // 设置样式
        CellStyle cellStyle2 = wb.createCellStyle();
        // 设置对齐方式
        cellStyle2.setVerticalAlignment(VerticalAlignment.TOP); // 垂直对齐方式
        cellStyle2.setAlignment(HorizontalAlignment.CENTER); // 水平对齐方式
        // 创建字体
        Font subjectTitleFont = wb.createFont();
        subjectTitleFont.setFontHeight((short) (12 * 20));
        cellStyle2.setFont(subjectTitleFont);
        // 给列赋值
        Cell cell1 = row2.createCell(0);
        cell1.setCellValue("电子签章文件");
        cell1.setCellStyle(cellStyle2);


        /**------------------------ 普通内容 ------------------------**/
        // 设置当前行的高度, 行高像素点是1/20, 所以行高 = 行高 * 20
        short contentRowHeight = 26 * 20;
        // 创建第3行
        rowSize += separatorRows;
        Row row3 = sheet.createRow(rowSize);
        row3.setHeight(contentRowHeight);
        row3.createCell(0).setCellValue("填报单位:");
        row3.createCell(1).setCellValue(dataObject.getFillUnit());

        // 创建第4行
        rowSize += separatorRows;
        Row row4 = sheet.createRow(rowSize);
        row4.setHeight(contentRowHeight);
        row4.createCell(0).setCellValue("填报人:");
        row4.createCell(1).setCellValue(dataObject.getFillUserName());

        // 创建第5行
        rowSize += separatorRows;
        Row row5 = sheet.createRow(rowSize);
        row5.setHeight(contentRowHeight);
        row5.createCell(0).setCellValue("申请时间:");
        row5.createCell(1).setCellValue(DateFormatUtils.formatDateTime(dataObject.getSealTime()));

        // 创建第6行
        rowSize += separatorRows + 3;
        Row row6 = sheet.createRow(rowSize);
        row6.setHeight(contentRowHeight);
        row6.createCell(0).setCellValue("签章:");

        CellStyle contentStyle = wb.createCellStyle();
        contentStyle.setWrapText(true); // 自动换行
        contentStyle.setVerticalAlignment(VerticalAlignment.TOP); // 垂直对齐方式
        contentStyle.setAlignment(HorizontalAlignment.LEFT); // 水平对齐方式


        // 创建工作表2
        createReportedContentSheet(wb, dataObject);

        return wb;
    }

    /**
     * 生成上报工作表
     *
     * @param wb
     * @param dataObject
     */
    private static void createReportedContentSheet(Workbook wb, ReportedExcelDataVo dataObject) {
        int rowSize = 0;
        // 分隔行数
        int separatorRows = 2;

        // 创建工作表1
        Sheet sheet = wb.createSheet();

        // 合并单元格, CellRangeAddress 四个参数为:起始行,结束行,起始列,结束列
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 5)); // 合并第一行的1到6列
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 1)); // 合并第二行的1、2列

        // 设置某一列的宽度(列, 宽度), 列宽的字符是 1/256, 所以 *256
        sheet.setColumnWidth(0, 20 * 256);
        sheet.setColumnWidth(1, 30 * 256);


        // 创建右上角第一行(右上角标签行)
        Row topRow = sheet.createRow(rowSize);
        // 设置行高, 行高像素点是1/20, 所以 *20
        topRow.setHeight((short) (40 * 20));
        Cell topRightCell = topRow.createCell(0);
        topRightCell.setCellValue("附录内容");
        // 创建样式
        CellStyle topRightCellStyle = wb.createCellStyle();
        topRightCellStyle.setVerticalAlignment(VerticalAlignment.TOP); // 垂直对齐方式
        topRightCellStyle.setAlignment(HorizontalAlignment.RIGHT); // 水平对齐方式
        // 填充样式
        topRightCell.setCellStyle(topRightCellStyle);


        // 创建第1行(标题行)
        rowSize += 1;
        Row row1 = sheet.createRow(rowSize);
        // 设置当前行的高度, 行高像素点是1/20, 所以 *20
        row1.setHeight((short) (40 * 20)); // 行高 *20
        // 给列赋值
        Cell cell = row1.createCell(0);
        cell.setCellValue(dataObject.getTitle());
        // 创建样式
        CellStyle cellStyle = wb.createCellStyle();
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直对齐方式
        cellStyle.setAlignment(HorizontalAlignment.CENTER); // 水平对齐方式
        // 创建字体
        Font font = wb.createFont();
        font.setFontHeight((short) (15 * 20)); // 字体大小 *20
        font.setBold(true); // 字体加粗
        cellStyle.setFont(font);
        // 填充样式
        cell.setCellStyle(cellStyle);


        /**------------------------ 普通内容 ------------------------**/
        // 创建主题标题样式
        CellStyle subjectTitleStyle = wb.createCellStyle();
        Font subjectTitleFont = wb.createFont();
        subjectTitleFont.setFontHeight((short) (12 * 20));
        subjectTitleStyle.setFont(subjectTitleFont);

        // 设置当前行的高度, 行高像素点是1/20, 所以行高 = 行高 * 20
        short rowHeight = 18 * 20;

        // 填充主题数据
        List<ReportedExcelDataVo.ReportedSubjectDataVo> subjectList = dataObject.getSubjectData();
        for (ReportedExcelDataVo.ReportedSubjectDataVo subjectData : subjectList) {
            // 创建标题行
            rowSize += separatorRows;
            Row titleRow = sheet.createRow(rowSize);
            // 给列填充内容
            Cell titleCell = titleRow.createCell(0);
            titleCell.setCellValue(subjectData.getSubjectName());
            titleCell.setCellStyle(subjectTitleStyle);
            titleRow.setHeight(rowHeight); // 设置行高

            for (Map<String, Map<String, String>> stringMapMap : subjectData.getSubjectDataItem()) {
                for (Map.Entry<String, Map<String, String>> stringMapEntry : stringMapMap.entrySet()) {
                    Map<String, String> body = stringMapEntry.getValue();
                    // 创建内容行
                    rowSize += 1;
                    Row contentRow = sheet.createRow(rowSize);
                    contentRow.createCell(0).setCellValue(String.format("%s:", body.get("key")));
                    contentRow.createCell(1).setCellValue(body.get("value"));
                    // 设置当前行的高度, 行高像素点是1/20, 所以 *20
                    contentRow.setHeight(rowHeight); // 行高 *20
                }
                // 每个主题行下面的主题列表结束之后隔开一行
                rowSize += 1;
            }
        }
    }

    public static Map<String, String> createMap(String key, String value) {
        Map<String, String> map = new HashMap<>(2);
        map.put("key", key);
        map.put("value", value);
        return map;
    }

    public static void main(String[] args) {
        ReportedExcelDataVo dataObject = new ReportedExcelDataVo();
        dataObject.setFillBatchNum("TBPC_2022010414ecf241eb494c21a03dc0cecc52a629");
        dataObject.setTitle("xxx评估表");
        dataObject.setFillUnit("广东省xxx办事处");
        dataObject.setFillUserName("张珊珊");
        dataObject.setSealTime(new Date());

        ReportedExcelDataVo.ReportedSubjectDataVo infoList1 = new ReportedExcelDataVo.ReportedSubjectDataVo();
        infoList1.setSubjectName("基本信息");
        ArrayList<Map<String, Map<String, String>>> list = new ArrayList<>();
        Map<String, Map<String, String>> map = new LinkedHashMap<>();
        map.put("name", createMap("填报单位", "广东省xxx办事处"));
        map.put("age", createMap("填报人", "张珊珊"));
        map.put("sex", createMap("填报日期", "2022-05-12"));
        list.add(map);
        infoList1.setSubjectDataItem(list);

        ReportedExcelDataVo.ReportedSubjectDataVo infoList2 = new ReportedExcelDataVo.ReportedSubjectDataVo();
        infoList2.setSubjectName("详细记录");
        ArrayList<Map<String, Map<String, String>>> list2 = new ArrayList<>();
        Map<String, Map<String, String>> map2 = new LinkedHashMap<>();
        map2.put("name", createMap("实施清单", "上访案件"));
        map2.put("age", createMap("当月数量", "18"));
        map2.put("sex", createMap("当月解决", "25"));
        Map<String, Map<String, String>> map3 = new LinkedHashMap<>();
        map3.put("name", createMap("实施清单", "消防巡检"));
        map3.put("age", createMap("当月数量", "100"));
        map3.put("sex", createMap("当月解决", "25"));
        list2.add(map2);
        list2.add(map3);
        infoList2.setSubjectDataItem(list2);

        dataObject.setSubjectData(Arrays.asList(infoList1, infoList2));

        createExcel(dataObject);
    }
}

实体类

package com.pro.common.vo;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * 生成Excel对象
 */
public class ReportedExcelDataVo implements Serializable {

    /**
     * 填报批次号 (系统赋值)
     */
    private String fillBatchNum;

    /**
     * 表格标题
     */
    private String title;

    /**
     * 填报单位
     */
    private String fillUnit;

    /**
     * 填报人
     */
    private String fillUserName;

    /**
     * 签章时间
     */
    private Date sealTime;

    /**
     * 填报主题数据
     */
    private List<ReportedSubjectDataVo> subjectData;


    /**
     * 主题数据对象
     */
    public static class ReportedSubjectDataVo implements Serializable {

        /**
         * 主题名称
         */
        private String subjectName;

        /**
         * 主题数据项
         * [
         *  { "数据项key1": { key: "数据项名称", value: "数据项值" } },
         *  { "数据项key2": { key: "数据项名称", value: "数据项值" } }
         * ]
         */
        private List<Map<String, Map<String, String>>> subjectDataItem;


        // 此处省略get、set
    }

	// 此处省略get、set
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成 Java 自定义 Excel 表格导出代码可以使用以下代码片段作为参考: ```java public class ExcelUtil { /** * 导出 Excel 表格 * * @param filename 文件名 * @param headers 表头 * @param data 表格数据 * @param out 输出流 * @throws IOException */ public static void exportExcel(String filename, String[] headers, List<Map<String, Object>> data, OutputStream out) throws IOException { XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet(filename); // 设置表头样式 XSSFCellStyle headerStyle = workbook.createCellStyle(); headerStyle.setAlignment(HorizontalAlignment.CENTER); headerStyle.setFillForegroundColor(IndexedColors.LIGHT_TURQUOISE.getIndex()); headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); headerStyle.setBorderTop(BorderStyle.THIN); headerStyle.setBorderBottom(BorderStyle.THIN); headerStyle.setBorderLeft(BorderStyle.THIN); headerStyle.setBorderRight(BorderStyle.THIN); // 创建表头行 XSSFRow headerRow = sheet.createRow(0); for (int i = 0; i < headers.length; i++) { XSSFCell cell = headerRow.createCell(i); cell.setCellValue(headers[i]); cell.setCellStyle(headerStyle); } // 设置表格数据样式 XSSFCellStyle dataStyle = workbook.createCellStyle(); dataStyle.setBorderTop(BorderStyle.THIN); dataStyle.setBorderBottom(BorderStyle.THIN); dataStyle.setBorderLeft(BorderStyle.THIN); dataStyle.setBorderRight(BorderStyle.THIN); // 填充表格数据 for (int i = 0; i < data.size(); i++) { XSSFRow dataRow = sheet.createRow(i + 1); Map<String, Object> rowData = data.get(i); for (int j = 0; j < headers.length; j++) { XSSFCell cell = dataRow.createCell(j); Object value = rowData.get(headers[j]); if (value != null) { if (value instanceof String) { cell.setCellValue((String) value); } else if (value instanceof Integer) { cell.setCellValue((Integer) value); } else if (value instanceof Double) { cell.setCellValue((Double) value); } else if (value instanceof Date) { cell.setCellValue((Date) value); XSSFCellStyle dateStyle = workbook.createCellStyle(); dateStyle.setDataFormat(workbook.getCreationHelper().createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss")); cell.setCellStyle(dateStyle); } } cell.setCellStyle(dataStyle); } } // 自适应列宽 for (int i = 0; i < headers.length; i++) { sheet.autoSizeColumn(i); } // 输出 Excel 文件 workbook.write(out); workbook.close(); } } ``` 在这里,我们使用Apache POI 库来生成 Excel 表格。在 `exportExcel` 方法中,我们首先创建了一个 `XSSFWorkbook` 对象来表示 Excel 文件。然后,我们创建了一个 `XSSFSheet` 对象来表示表格,并设置了表头样式和表头行。接着,我们填充了表格数据,并根据数据类型设置了单元格样式。最后,我们自适应列宽,并将 Excel 文件输出到指定的输出流中。 要使用该工具类导出 Excel 表格,只需要调用 `exportExcel` 方法即可,如下所示: ```java List<Map<String, Object>> data = new ArrayList<>(); Map<String, Object> row1 = new LinkedHashMap<>(); row1.put("id", 1); row1.put("name", "张三"); row1.put("age", 20); row1.put("create_time", new Date()); data.add(row1); Map<String, Object> row2 = new LinkedHashMap<>(); row2.put("id", 2); row2.put("name", "李四"); row2.put("age", 22); row2.put("create_time", new Date()); data.add(row2); String[] headers = {"id", "name", "age", "create_time"}; String filename = "test.xlsx"; OutputStream out = new FileOutputStream(filename); ExcelUtil.exportExcel(filename, headers, data, out); out.close(); ``` 在这个例子中,我们首先创建了一个包含两行数据的表格数据 `data`,然后创建了一个包含表头信息的字符串数组 `headers`,并指定了导出的 Excel 文件名 `filename` 和输出流 `out`。最后,我们调用 `exportExcel` 方法导出 Excel 表格,并关闭输出流。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值