• Hutool操作excel


    来源 : https://blog.csdn.net/m0_52309432/article/details/125300603

    /**
    * 方法描述: 设置基础字体样式字体 这里保留最基础的样式使用
    *
    * @param workbook 工作簿
    * @param bold 是否粗体
    * @param fontName 字体名称
    * @param fontSize 字体大小
    * @return org.apache.poi.ss.usermodel.Font
    * @author wqf
    * @date 2021/5/19 15:58
    */
    public static Font setBaseFont(Workbook workbook, boolean bold, boolean italic, String fontName, int fontSize) {
    Font font = workbook.createFont();
    //设置字体名称 宋体 / 微软雅黑 /等
    font.setFontName(fontName);
    //设置是否斜体
    font.setItalic(italic);
    //设置字体高度
    //font.setFontHeight((short) fontHeight);
    //设置字体大小 以磅为单位
    font.setFontHeightInPoints((short) fontSize);
    //设置是否加粗
    font.setBold(bold);
    //默认字体颜色
    // font.setColor(Font.COLOR_NORMAL);
    //红色
    //font.setColor(Font.COLOR_RED);
    //设置下划线样式
    //font.setUnderline(Font.ANSI_CHARSET);
    //设定文字删除线
    //font.setStrikeout(true);
    return font;
    }
    全局样式设置

    private static StyleSet GlobalStyleSet(ExcelWriter writer, Workbook workbook,Font font) {
    //全局样式设置
    StyleSet styleSet = writer.getStyleSet();
    CellStyle cellStyle = styleSet.getCellStyle();
    //设置全局文本居中
    styleSet.setAlign(HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
    //设置全局字体样式
    styleSet.setFont(font);
    //设置背景颜色 第二个参数表示是否将样式应用到头部
    styleSet.setBackgroundColor(IndexedColors.WHITE, true);
    //设置自动换行 当文本长于单元格宽度是否换行
    styleSet.setWrapText();
    // 设置全局边框样式
    styleSet.setBorder(BorderStyle.THIN, IndexedColors.BLACK);
    return styleSet;
    }
    头部标题样式

    //设置全局样式
    StyleSet styleSet = GlobalStyleSet(writer, workbook);
    //设置头部标题样式
    CellStyle headCellStyle = styleSet.getHeadCellStyle();
    //水平居中
    headCellStyle.setAlignment(HorizontalAlignment.CENTER);
    //垂直居中
    headCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
    //设置字体样式
    headCellStyle.setFont(setBaseFont(workbook, true, false, "宋体", 12));
    writer.setStyleSet(styleSet);
    数字保留小数
    例:保留两位小数

    CellStyle cellStyleForNumber = styleSet.getCellStyleForNumber();
    cellStyleForNumber.setDataFormat((short)2);
    5.时间格式化
    例如格式为:YYYY/MM/dd 格式


    CellStyle cellStyleForDate = styleSet.getCellStyleForDate();
    //14 代表的时间格式是 yyyy/MM/dd
    cellStyleForDate.setDataFormat((short)14);
    时间格式占时只看到这一种格式常见些,像yyyy-MM-dd 格式都没找到,就只有在写入数据写先处理下时间格式了。

    行(Row)样式

    //获取输出构造器 设置工作簿名称
    ExcelWriter writer = ExcelUtil.getWriterWithSheet(sheetName);
    Workbook workbook = writer.getWorkbook();
    Sheet sheet = writer.getSheet();
    Row row = sheet.getRow(rowIndex);
    if(sheet.getRow(rowIndex )==null){
    //rowIndex 表示的是第几行,例:创建第二行,rowIndex=1
    sheet.createRow(rowIndex );
    }
    //创建样式
    CellStyle cellStyle = workbook.createCellStyle();
    cellStyle .setVerticalAlignment(VerticalAlignment.CENTER);
    cellStyle .setAlignment(HorizontalAlignment.LEFT);
    cellStyle .setFont(setBaseFont(workbook, true, false, "宋体", 12));
    cellStyle .setBorderBottom(BorderStyle.THIN);
    cellStyle .setBorderLeft(BorderStyle.THIN);
    cellStyle .setBorderRight(BorderStyle.THIN);
    cellStyle .setBorderTop(BorderStyle.THIN);
    //应用样式到某一行(
    row .setRowStyle(cellStyle );
    //应用样式到某一行 (或者这样写) rowIndex 表示的是第几行
    //writer.setRowStyle(rowIndex ,cellStyle );
    单元格(Cell)样式

    Row row = sheet.getRow(rowIndex);
    if(sheet.getRow(rowIndex )==null){
    //rowIndex 表示的是第几行,例:创建第二行,rowIndex=1
    sheet.createRow(rowIndex );
    }
    //创建本行的第几个单元格 cellIndex=0 表示第一个
    if(row.get(cellIndex)==null){
    row .createCell(cellIndex);
    }

    //创建样式
    CellStyle cellStyle = workbook.createCellStyle();
    cellStyle .setVerticalAlignment(VerticalAlignment.CENTER);
    cellStyle .setAlignment(HorizontalAlignment.LEFT);
    cellStyle .setFont(setBaseFont(workbook, true, false, "宋体", 12));
    cellStyle .setBorderBottom(BorderStyle.THIN);
    cellStyle .setBorderLeft(BorderStyle.THIN);
    cellStyle .setBorderRight(BorderStyle.THIN);
    cellStyle .setBorderTop(BorderStyle.THIN);
    //应用样式到某一行(
    row .setRowStyle(cellStyle );
    //应用样式到某一行 (或者这样写) rowIndex 表示的是第几行
    //writer.setRowStyle(rowIndex ,cellStyle );
    合并单元格
    //处理标题行 合并某行的单元格,并写入对象到单元格,如果写到单元格中的内容非null,行号自动+1,否则当前行号不变

    //主要有两种方式
    1. writer.merge(cellIndex, content, true);
    表示当前行 合并从第一个单元到cellIndex+1个单元,并填充内容content,第三个参数表示是否将头部标题样式应用到这里。
    或者
    2.writer.merge(startRowIndex,endRowIndex, startCellIndex, endCellIndex, content, false);
    表示和并第startRowIndex+1行到endRowIndex+1行 ,并合并从第endCellIndex+1个单元到endCellIndex+1个单元格,并填充content内容,最后一个字段表示是否将头部标题样式应用到这里。
    列表别名

    //LinkedHashMap 中的数据是根据put先后顺序来的,HashMap数据时无序的。
    //使用方法 writer.setHeaderAlias(headerAlias); 时如果使用HashMap 可能展示的数
    //据顺序会错乱
    Map<String, String> headerAlias = new LinkedHashMap<>();
    headerAlias.put(字段名1, 列名1);
    headerAlias.put(字段名2, 列名2);
    headerAlias.put(字段名3, 列名3);
    headerAlias.put(字段名4, 列名4);
    headerAlias.put(字段名5, 列名5);
    writer.setHeaderAlias(headerAlias);
    //或者一项一项设置列的别名 列别名顺序会跟代码中addHeaderAlias顺序一致
    writer.addHeaderAlias(字段名1,列名1);
    writer.addHeaderAlias(字段名2,列名2);
    列宽问题
    8.1 自动列宽 百度查到一个方法有用 ,但实际好像还是会有点问题,大家可以先试试
    博客链接 :https://blog.csdn.net/kongbai953/article/details/110382544

    /**
    * 自适应宽度(中文支持)
    * @param sheet
    * @param size 因为for循环从0开始,size值为 列数-1
    */
    public static void setSizeColumn(Sheet sheet, int size) {
    for (int columnNum = 0; columnNum <= size; columnNum++) {
    int columnWidth = sheet.getColumnWidth(columnNum) / 256;
    for (int rowNum = 0; rowNum <= sheet.getLastRowNum(); rowNum++) {
    Row currentRow;
    //当前行未被使用过
    if (sheet.getRow(rowNum) == null) {
    currentRow = sheet.createRow(rowNum);
    } else {
    currentRow = sheet.getRow(rowNum);
    }

    if (currentRow.getCell(columnNum) != null) {
    Cell currentCell = currentRow.getCell(columnNum);
    if (currentCell.getCellType() == XSSFCell.CELL_TYPE_STRING) {
    int length = currentCell.getStringCellValue().getBytes().length;
    if (columnWidth < length) {
    columnWidth = length;
    }
    }
    }
    }
    sheet.setColumnWidth(columnNum, columnWidth * 256);
    }
    }
    8.2 手动列宽设置


    //表示 第一列的列宽是15
    writer.setColumnWidth(0, 15);
    另外常用方法
    //跳过当前行 即当前行不写内容


    writer.passCurrentRow();
    //定位到最后一行,常用于在末尾追加数据


    writer.setCurrentRowToEnd();
    10 . 下载excel代码 在数据都填充完成后,调用该方法即可


    /**
    * 方法描述: 下载excel文件
    *
    * @param response 响应
    * @param fileName 文件名称
    * @param writer writer
    * @return void
    * @author wqf
    * @date 2021/5/24 16:20
    */
    private static void downloadExcel(HttpServletResponse response, String fileName, ExcelWriter writer) {
    response.setContentType("application/vnd.ms-excel;charset=utf-8");
    // test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
    ServletOutputStream out = null;
    try {
    // 设置请求头属性
    response.setHeader("Content-Disposition", "attachment;filename=" + new String((fileName + ".xlsx").getBytes(), StandardCharsets.ISO_8859_1));
    out = response.getOutputStream();
    // 写出到文件
    writer.flush(out, true);
    // 关闭writer,释放内存
    writer.close();
    // 此处记得关闭输出Servlet流
    IoUtil.close(out);
    } catch (IOException e) {
    log.error(e.getMessage());
    e.printStackTrace();
    }
    }
    excel 添加下拉框

    CellRangeAddressList addressList = new CellRangeAddressList(2, 2, 5, 5);
    DataValidationHelper helper = sheet.getDataValidationHelper();
    // 设置下拉框数据
    String[] str = new String[]{"男", "女","阴阳人"};
    DataValidationConstraint constraint = helper.createExplicitListConstraint(str);
    DataValidation dataValidation = helper.createValidation(constraint, addressList);
    writer.addValidationData(dataValidation);
    12.背景色填充


    //示例:将单元格背景填充为黄色
    short index = IndexedColors.YELLOW.index;
    cellStyle.setFillForegroundColor(index);
    cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
    总结 : 整合了一个工具类,仅作参考


    /**
    * @Author: wqf
    * @Date: 2021/05/28
    * @Description: hutool 工具导出excel(非填充模板,手工画)
    */
    @Slf4j
    public class HutoolExcelUtil {
    /**
    * YYYY/MM/dd 时间格式
    */
    private static final short LOCAL_DATE_FORMAT_SLASH = 14;

    /**
    * 方法描述: 创建excel
    *
    * @param isXlsx excel文件类型 true-xlsx/false-xls
    * @return cn.hutool.poi.excel.ExcelWriter
    * @author wqf
    * @date 2021/6/1 9:47
    */
    public static ExcelWriter createExcel(boolean isXlsx) {
    return ExcelUtil.getWriter(isXlsx);
    }

    /**
    * 方法描述: 全局基础样式设置
    * 默认 全局水平居中+垂直居中
    * 默认 自动换行
    * 默认单元格边框颜色为黑色,细线条
    * 默认背景颜色为白色
    *
    * @param writer writer
    * @param font 字体样式
    * @return cn.hutool.poi.excel.StyleSet
    * @author wqf
    * @date 2021/5/28 10:43
    */
    public static StyleSet setBaseGlobalStyle(ExcelWriter writer, Font font) {
    //全局样式设置
    StyleSet styleSet = writer.getStyleSet();
    //设置全局文本居中
    styleSet.setAlign(HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
    //设置全局字体样式
    styleSet.setFont(font, true);
    //设置背景颜色 第二个参数表示是否将样式应用到头部
    styleSet.setBackgroundColor(IndexedColors.WHITE, true);
    //设置自动换行 当文本长于单元格宽度是否换行
    //styleSet.setWrapText();
    // 设置全局边框样式
    styleSet.setBorder(BorderStyle.THIN, IndexedColors.BLACK);
    return styleSet;
    }

    /**
    * 方法描述: 设置标题的基础样式
    *
    * @param styleSet StyleSet
    * @param font 字体样式
    * @param horizontalAlignment 水平排列方式
    * @param verticalAlignment 垂直排列方式
    * @return org.apache.poi.ss.usermodel.CellStyle
    * @author wqf
    * @date 2021/5/28 10:16
    */
    public static CellStyle createHeadCellStyle(StyleSet styleSet, Font font,
    HorizontalAlignment horizontalAlignment,
    VerticalAlignment verticalAlignment) {
    CellStyle headCellStyle = styleSet.getHeadCellStyle();
    headCellStyle.setAlignment(horizontalAlignment);
    headCellStyle.setVerticalAlignment(verticalAlignment);
    headCellStyle.setFont(font);
    return headCellStyle;
    }

    /**
    * 方法描述: 设置基础字体样式字体 这里保留最基础的样式使用
    *
    * @param bold 是否粗体
    * @param fontName 字体名称
    * @param fontSize 字体大小
    * @return org.apache.poi.ss.usermodel.Font
    * @author wqf
    * @date 2021/5/19 15:58
    */
    public static Font createFont(ExcelWriter writer, boolean bold, boolean italic, String fontName, int fontSize) {
    Font font = writer.getWorkbook().createFont();
    //设置字体名称 宋体 / 微软雅黑 /等
    font.setFontName(fontName);
    //设置是否斜体
    font.setItalic(italic);
    //设置字体大小 以磅为单位
    font.setFontHeightInPoints((short) fontSize);
    //设置是否加粗
    font.setBold(bold);
    return font;
    }

    /**
    * 方法描述: 设置行或单元格基本样式
    *
    * @param writer writer
    * @param font 字体样式
    * @param verticalAlignment 垂直居中
    * @param horizontalAlignment 水平居中
    * @return void
    * @author wqf
    * @date 2021/5/28 10:28
    */
    public static CellStyle createCellStyle(ExcelWriter writer, Font font, boolean wrapText,
    VerticalAlignment verticalAlignment,
    HorizontalAlignment horizontalAlignment) {
    CellStyle cellStyle = writer.getWorkbook().createCellStyle();
    cellStyle.setVerticalAlignment(verticalAlignment);
    cellStyle.setAlignment(horizontalAlignment);
    cellStyle.setWrapText(wrapText);
    cellStyle.setFont(font);
    return cellStyle;

  • 相关阅读:
    [日常] 使用TCPDUMP和Ethereal抓包分析HTTP请求中的异常情况
    [视频教程] 基于redis的消息队列实现与思考
    [日常] 项目中业务绑定手机验证手机号的实现
    [视频教程] 使用docker的方式安装redis
    [前端] js中call方法的理解和思考
    [日常] Redis中set集合的使用思考
    [日常] 跨语言的POST请求问题的解决
    [PHP] 基于redis的分布式锁防止高并发重复请求
    [日常] 安装windows+deepin双系统
    [视频教程]利用SSH隧道进行远程腾讯云服务器项目xdebug调试
  • 原文地址:https://www.cnblogs.com/hmpcly/p/16400747.html
Copyright © 2020-2023  润新知