【EasyExcel 教程】详解写入Excel -- 写入

2023-11-09

 
愿你如阳光,明媚不忧伤。

 


4. 详解写入Excel

4.1 简单写入Excel

  • EasyExcelData.java
    创建与Excel标题相对应的实体类,和读取稍有不同,写入需要加上注解,设定写入的标题。
    @ExcelIgnore 可以忽略单个字段。
public class EasyExcelData {
    @ExcelProperty("字符串标题")
    private String stringData;
    @ExcelProperty("日期标题")
    private Date dateData;
    @ExcelProperty("数字标题")
    private Double doubleData;
    // 忽略这个字段
    @ExcelIgnore
    private String ignore;

    // 省略get和set
}
  • EasyExcelDataController.java
    写入Excel,这里提供两种方式写入
@RestController
@RequestMapping("/easyExcel")
public class EasyExcelDataController extends BaseController {
    @Resource
    EasyExcelDataListener easyExcelDataListener;
    // 指定需要读的excel文件
    String fileName = "C:/Users/ISCCF_A/Desktop/EasyExcelData.xlsx";

	// 省略读取部分
	
    @RequestMapping("/write")
    public JsonResult simpleWrite(int mode) {
        log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
        // 写入Excel的数据
        List<EasyExcelData> list = EasyExcelUtil.testWriteData();
        if (mode == 1) {
            // 写法1(默认第一个Sheet):
            // 这里需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
            // 如果这里想使用03 则 传入excelType参数即可
            EasyExcel.write(fileName, EasyExcelData.class).sheet("写入方法一").doWrite(list);
        } else {
            ExcelWriter excelWriter = null;
            try {
                // 写法2(默认第一个Sheet):
                // 这里需要指定写用哪个class去写
                excelWriter = EasyExcel.write(fileName, EasyExcelData.class).build();
                WriteSheet writeSheet = EasyExcel.writerSheet("写入方法二").build();
                excelWriter.write(list, writeSheet);
            } finally {
                if (excelWriter != null) {
                    // 千万别忘记finish关闭流
                    excelWriter.finish();
                }
            }
        }
        log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
        return new JsonResult(list, "Excel写入数据成功!");
    }
}
  • EasyExcelUtil.java
    生产写入测试数据
public class EasyExcelUtil {

    public static List<EasyExcelData> testWriteData() {
        List<EasyExcelData> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            EasyExcelData data = new EasyExcelData();
            data.setStringData("字符串" + i);
            data.setDateData(new Date());
            data.setDoubleData(0.56);
            list.add(data);
        }
        return list;
    }

}

浏览器访问 http://localhost:8080/easyExcel/write?mode=1

在这里插入图片描述

  • EasyExcelData.xlsx

在这里插入图片描述

4.2 根据参数导出指定列(排除或指定)

  • EasyExcelDataWriteController.java
@RestController
@RequestMapping("/easyExcelWrite")
public class EasyExcelDataWriteController extends BaseController {
    // 指定需要写的excel文件
    String fileName = "C:/Users/ISCCF_A/Desktop/EasyExcelData.xlsx";
    // 写入Excel的数据
    List<EasyExcelData> list = EasyExcelUtil.testWriteData();

    @RequestMapping("/excludeOrIncludeWrite")
    public void excludeOrIncludeWrite(int mode) {
        log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
        if (mode == 1) {
            // 忽略传入字段,假设我们要忽略 date
            Set<String> excludeColumnFiledNames = new HashSet<String>();
            excludeColumnFiledNames.add("dateData");
            // 这里需要指定写用哪个class去写,然后写到第一个sheet,名字为模板,文件流会自动关闭
            EasyExcel.write(fileName, EasyExcelData.class).excludeColumnFiledNames(excludeColumnFiledNames).sheet("模板")
                    .doWrite(list);
        } else {
            // 指定传入字段,假设我们只想导出 date
            Set<String> includeColumnFiledNames = new HashSet<String>();
            includeColumnFiledNames.add("dateData");
            EasyExcel.write(fileName, EasyExcelData.class).includeColumnFiledNames(includeColumnFiledNames).sheet("模板")
                    .doWrite(list);
        }
        log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
    }
}

浏览器访问 http://localhost:8080/easyExcelWrite/excludeOrIncludeWrite?mode=1

在这里插入图片描述

浏览器访问 http://localhost:8080/easyExcelWrite/excludeOrIncludeWrite?mode=10

在这里插入图片描述

4.3 指定写入的列

  • EasyExcelDataIndex.java
    创建指定列的实体类
public class EasyExcelDataIndex {
    // 这里需要注意在使用ExcelProperty注解的使用,如果想不空列则需要加入order字段,order会忽略空列,然后继续往后,
    // 而index,不会忽略空列,在第几列就是第几列。
    @ExcelProperty(value = "字符串标题", index = 0)
    private String stringData;
    @ExcelProperty(value = "日期标题", index = 1)
    private Date dateData;
    @ExcelProperty(value = "数字标题", index = 3)
    private Double doubleData;
    
    // 省略get和set
}
  • EasyExcelDataWriteController.java
@RestController
@RequestMapping("/easyExcelWrite")
public class EasyExcelDataWriteController extends BaseController {
    // 指定需要写的excel文件
    String fileName = "C:/Users/ISCCF_A/Desktop/EasyExcelData.xlsx";
    // 写入Excel的数据
    List<EasyExcelData> list = EasyExcelUtil.testWriteData();

     @RequestMapping("/indexWrite")
    public void indexWrite() {
        log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
        EasyExcel.write(fileName, EasyExcelDataIndex.class).sheet("IndexWrite").doWrite(list);
        log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
    }
}

浏览器访问 http://localhost:8080/easyExcelWrite/indexWrite

在这里插入图片描述

4.4 复杂头写入

  • EasyExcelDataComplexHead.java
    创建复杂头实体类
public class EasyExcelDataComplexHead {
    @ExcelProperty({"主标题", "字符串标题"})
    private String string;
    @ExcelProperty({"主标题", "日期标题"})
    private Date date;
    @ExcelProperty({"主标题", "数字标题"})
    private Double doubleData;
    
    // 省略get和set
}
  • EasyExcelDataWriteController.java
@RestController
@RequestMapping("/easyExcelWrite")
public class EasyExcelDataWriteController extends BaseController {
    // 指定需要写的excel文件
    String fileName = "C:/Users/ISCCF_A/Desktop/EasyExcelData.xlsx";
    // 写入Excel的数据
    List<EasyExcelData> list = EasyExcelUtil.testWriteData();

    @RequestMapping("/complexHeadWrite")
    public void complexHeadWrite() {
        log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
        EasyExcel.write(fileName, EasyExcelDataComplexHead.class).sheet("IndexWrite").doWrite(list);
        log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
    }
}

浏览器访问 http://localhost:8080/easyExcelWrite/complexHeadWrite

在这里插入图片描述

4.5 日期,数字或者自定义格式的转换

  • EasyExcelDataWriteConverter.java
    创建复杂头实体类
public class EasyExcelDataWriteConverter {
    @ExcelProperty(value = "字符串标题", converter = CustomStringStringConverter.class)
    private String string;
    @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
    @ExcelProperty("日期标题")
    private Date date;
    @NumberFormat("#.##%")
    @ExcelProperty(value = "数字标题")
    private Double doubleData;
    
    // 省略get和set
}
  • EasyExcelDataWriteController.java
    生产写入测试数据,只是改变了泛型,不再展示。
@RestController
@RequestMapping("/easyExcelWrite")
public class EasyExcelDataWriteController extends BaseController {
    // 指定需要写的excel文件
    String fileName = "C:/Users/ISCCF_A/Desktop/EasyExcelData.xlsx";
    // 写入Excel的数据
    List<EasyExcelData> list = EasyExcelUtil.testWriteData();
    // 写入Excel格式化的数据
    List<EasyExcelDataWriteConverter> listFormat = EasyExcelUtil.testWriteDataFormat();

    @RequestMapping("/converterWrite")
    public void converterWrite() {
        log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
        EasyExcel.write(fileName, EasyExcelDataWriteConverter.class).sheet("converterWrite").doWrite(listFormat);
        log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
    }
}

浏览器访问 http://localhost:8080/easyExcelWrite/converterWrite

在这里插入图片描述

4.6 图片导出(列宽,行高注解)

  • EasyExcelDataImage.java
    创建图片实体类
@ContentRowHeight(100)
@ColumnWidth(100 / 8)
public class EasyExcelDataImage {
    private File file;
    private InputStream inputStream;
    // 如果string类型 必须指定转换器,string默认转换成string
    @ExcelProperty(converter = StringImageConverter.class)
    private String string;
    private byte[] byteArray;
    // 根据url导出
    private URL url;
    
    // 省略get和set
}
  • EasyExcelDataWriteController.java
@RestController
@RequestMapping("/easyExcelWrite")
public class EasyExcelDataWriteController extends BaseController {
    // 指定需要写的excel文件
    String fileName = "C:/Users/ISCCF_A/Desktop/EasyExcelData.xlsx";

    @RequestMapping("/imageWrite")
    public void imageWrite() throws IOException {
        log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
        // 如果使用流 记得关闭
        InputStream inputStream = null;
        try {
            List<EasyExcelDataImage> list = new ArrayList<EasyExcelDataImage>();
            EasyExcelDataImage imageData = new EasyExcelDataImage();
            list.add(imageData);
            String imagePath = "F:\\IDEAWorkSpace\\ITGodRoad\\src\\main\\resources\\static\\image\\Mayday.jpg";
            // 放入五种类型的图片 根据实际使用只要选一种即可
            imageData.setByteArray(FileUtils.readFileToByteArray(new File(imagePath)));
            imageData.setFile(new File(imagePath));
            imageData.setString(imagePath);
            inputStream = FileUtils.openInputStream(new File(imagePath));
            imageData.setInputStream(inputStream);
            imageData.setUrl(new URL(
                    "https://raw.githubusercontent.com/alibaba/easyexcel/master/src/test/resources/converter/img.jpg"));
            EasyExcel.write(fileName, EasyExcelDataImage.class).sheet().doWrite(list);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
        }
        log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
    }
}

浏览器访问 http://localhost:8080/easyExcelWrite/imageWrite

在这里插入图片描述

4.7 注解形式自定义样式

  • package com.alibaba.excel.annotation.write.style;
    设定样式的注解都在这个包下,有兴趣可以自己点开查看

在这里插入图片描述

  • EasyExcelDataStyle.java
    创建自定义样式实体类
// 头背景设置成钻石填充,红色 IndexedColors.RED.getIndex()
@HeadStyle(fillPatternType = FillPatternType.DIAMONDS, fillForegroundColor = 10)
// 头字体设置成20
@HeadFontStyle(fontHeightInPoints = 20)
// 内容的背景设置成绿色 IndexedColors.GREEN.getIndex()
@ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 17)
// 内容字体设置成16
@ContentFontStyle(fontHeightInPoints = 16)
@ColumnWidth(40)
public class EasyExcelDataStyle {
    // 字符串的头背景设置成粉红 IndexedColors.PINK.getIndex()
    @HeadStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 14)
    // 字符串的头字体设置成20
    @HeadFontStyle(fontHeightInPoints = 30)
    // 字符串的内容的背景设置成天蓝 IndexedColors.SKY_BLUE.getIndex()
    @ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 40)
    // 字符串的内容字体设置成20
    @ContentFontStyle(fontHeightInPoints = 30)
    @ExcelProperty("字符串标题")
    private String string;
    @ExcelProperty("日期标题")
    private Date date;
    @ExcelProperty("数字标题")
    private Double doubleData;
    
    // 省略get和set
}
  • EasyExcelDataWriteController.java
@RestController
@RequestMapping("/easyExcelWrite")
public class EasyExcelDataWriteController extends BaseController {
    // 指定需要写的excel文件
    String fileName = "C:/Users/ISCCF_A/Desktop/EasyExcelData.xlsx";
    // 写入Excel格式化的数据
    List<EasyExcelDataWriteConverter> listFormat = EasyExcelUtil.testWriteDataFormat();

    @RequestMapping("/annotationStyleWrite")
    public void annotationStyleWrite() {
        log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
        EasyExcel.write(fileName, EasyExcelDataStyle.class).sheet("annotationStyleWrite").doWrite(listFormat);
        log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
    }
}

浏览器访问 http://localhost:8080/easyExcelWrite/annotationStyleWrite

在这里插入图片描述

4.8 合并单元格(注解方式)

  • EasyExcelDataImage.java
    创建合并单元格实体类
public class EasyExcelDataMerge {
    // 将第6-7行的2-3列合并成一个单元格
    // @OnceAbsoluteMerge(firstRowIndex = 5, lastRowIndex = 6, firstColumnIndex = 1, lastColumnIndex = 2)
    // 这一列 每隔2行 合并单元格
    @ContentLoopMerge(eachRow = 2)
    @ExcelProperty("字符串标题")
    private String string;
    @ExcelProperty("日期标题")
    private Date date;
    @ExcelProperty("数字标题")
    private Double doubleData;
    
    // 省略get和set
}
  • EasyExcelDataWriteController.java
@RestController
@RequestMapping("/easyExcelWrite")
public class EasyExcelDataWriteController extends BaseController {
    // 指定需要写的excel文件
    String fileName = "C:/Users/ISCCF_A/Desktop/EasyExcelData.xlsx";
    // 写入Excel格式化的数据
    List<EasyExcelDataWriteConverter> listFormat = EasyExcelUtil.testWriteDataFormat();
    
    @RequestMapping("/mergeWrite")
    public void mergeWrite() {
        log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
        EasyExcel.write(fileName, EasyExcelDataMerge.class).sheet("mergeWrite").doWrite(listFormat);
        log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
    }
}

浏览器访问 http://localhost:8080/easyExcelWrite/mergeWrite

在这里插入图片描述

4.9 动态头,实时生成头写入

  • EasyExcelUtil.java
    创建动态头数据
public class EasyExcelUtil {
    public static List<List<String>> testWriteDynamicHeadData() {
        List<List<String>> list = new ArrayList<List<String>>();
        List<String> head0 = new ArrayList<String>();
        head0.add("字符串" + System.currentTimeMillis());
        List<String> head1 = new ArrayList<String>();
        head1.add("数字" + System.currentTimeMillis());
        List<String> head2 = new ArrayList<String>();
        head2.add("日期" + System.currentTimeMillis());
        list.add(head0);
        list.add(head1);
        list.add(head2);
        return list;
    }
}
  • EasyExcelDataWriteController.java
@RestController
@RequestMapping("/easyExcelWrite")
public class EasyExcelDataWriteController extends BaseController {
    // 指定需要写的excel文件
    String fileName = "C:/Users/ISCCF_A/Desktop/EasyExcelData.xlsx";
    // 写入Excel的数据
    List<EasyExcelData> list = EasyExcelUtil.testWriteData();
    // 写入Excel的动态头数据
    List<List<String>> dynamicHeadList = EasyExcelUtil.testWriteDynamicHeadData();
    
    @RequestMapping("/dynamicHeadWrite")
    public void dynamicHeadWrite() {
        log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
        EasyExcel.write(fileName)
                // 这里放入动态头数据
                .head(dynamicHeadList).sheet("dynamicHeadWrite").doWrite(list);
        log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
    }
}

浏览器访问 http://localhost:8080/easyExcelWrite/dynamicHeadWrite

在这里插入图片描述

4.10 web中的写

  • EasyExcelDataWriteController.java
@RestController
@RequestMapping("/easyExcelWrite")
public class EasyExcelDataWriteController extends BaseController {
    // 写入Excel的数据
    List<EasyExcelData> list = EasyExcelUtil.testWriteData();
    
    @RequestMapping("/multipartFileWrite")
    public void multipartFileWrite(HttpServletResponse response) throws IOException {
        log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码
        String fileName = URLEncoder.encode("ITGodRoad", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), EasyExcelData.class).sheet("multipartFileWrite").doWrite(list);
        log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
    }
}

浏览器访问 http://localhost:8080/easyExcelWrite/multipartFileWrite

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【EasyExcel 教程】详解写入Excel -- 写入 的相关文章

随机推荐

  • python django设计流水号生成,带访问加锁,重试

    python django设计流水号生成 带访问加锁 重试 老规矩 技术发于业务 努力从于项目 1 设计一个流水号配置表如下 流水号配置表 class BaseSerialNum BaseModel serial type models C
  • IO性能相关

    1 IO性能解决方案整理 网卡性能优化方案 绑定中断 至特定CPU 减少接口属性设置 数据包打入CPU标签 提升缓存命中 磁盘随机读写优化方案 批量读写 寻道更快 转速更高的硬盘 内存作为缓存 SSD RAID 磁盘顺序读写优化方案 RAI
  • javascript 简单高效判断数据类型 系列函数 By shawl.qiu

    javascript 简单高效判断数据类型 系列函数 By shawl qiu 说明 前段时间把 ASP VBScript 掌握得差不多的时候 就转而学习 Javascript Jscript 主要是学 Jscript 啦 不过这两者基本上
  • spring事件广播机制

    打个比方 当我们和其他公司进行业务接口对接时 我们这边需要保存或者修改某些数据 但是保存和修改这些数据对整个流程没有太大的影响 这个时候我们应该怎么做呢 是的 我们要考虑异步去保存或者修改数据 但怎么去异步保存数据呢 这个时候我们就可以使用
  • 3.5 编写一个程序,从标准输入读入某职员的工作时间(以小时计)和每小时的工资 数,计算并输出他的工资。若职员月工作时间超过 40 小时,则超过部分按原工资的 1.5 倍 来计算。

    3 5 编写一个程序 从标准输入读入某职员的工作时间 以小时计 和每小时的工资 数 计算并输出他的工资 若职员月工作时间超过 40 小时 则超过部分按原工资的 1 5 倍 来计算 include
  • git push --force

    一 force命令 如果git要强制覆盖 那么可以使用 force命令 git push force origin 二 参考资料 1 阮一峰 Git远程操作详解
  • Java操作excel之POI和easyExcel 教程详解 狂神笔记

    文章目录 1 应用场景 2 Apache POI 简介 项目准备 代码演示 大文件写HSSF 03 大文件写XSSF 07 大文件写SXSSF 07升级版 POI Excel读 3 easyExcel 简介 项目准备 EasyExcel写入
  • 宝塔php7.0shell,BT_Panel 宝塔开心面板/V7.0.1开心版

    脚本简介 本次面板版本 7 0 1 本脚本支持一键安装开心版宝塔面板 以及 已经安装宝塔面板升级开心版 感谢大家使用 书记的脚本 本脚本未加密 有没有后门大家自己看就知道了 如果你使用了类似 书记的脚 出现问题 以及 脚本地址非本人的 或者
  • 金碟生产相关表

    生产订单表 SELECT FInterID from AIS20151222141907 dbo ICMO where left convert varchar FPlanCommitDate 120 10 gt 2020 08 01 an
  • Bridge桥接模式

    作用 将抽象部份与它的实现部份分离 使它们都可以独立地变化 将抽象 Abstraction 与实现 Implementation 分离 使得二者可以独立地变化 桥接模式号称设计模式中最难理解的模式之一 关键就是这个抽象和实现的分离非常让人奇
  • JVM基础知识

    目录 1 前言 2 JVM运行流程 3 JVM运行时数据区 4 JVM类加载 5 有关垃圾回收 1 前言 本文只是针对面试中比较常见的有关JVM的问题做出补充 俗称八股文 同时帮助大家对JVM建立一个感性的认识 所以并不会对JVM有过多的深
  • [原]Qt Designer中自定义控件的使用(提升法与插件法)

    准备乱写一点Qt自定义Widget在Designer中的使用 可是又不想重复提升法 promotion 及插件法基本用法 因为Manual中Using Custom Widgets with Qt Designer已经说的很清楚了 使用de
  • 解决:Jetson系列python3 import 报错 “Illegal instruction core dumped “

    解决 Jetson系列python3 import 报错 Illegal instruction cpre dumped 解决方法 解决方法 编辑环境变量 sudo gedit bashrc 在最后一行添加 export OPENBLAS
  • mongod: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file:

    mongod error while loading shared libraries libcrypto so 1 0 0 cannot open shared object file No such file or directory
  • 14个提高代码质量的好问题

    阅读本文大概需要 2 6 分钟 并不是代码写的越多 代码的质量就越高 思考才是 解决一个问题 打开电脑就手撕代码 最终的结果往往是各种代码问题 经过一系列迭代后 代码积重难返 最终的结果就是推到重来 前期的付出都白费 最典型的就是现在所谓的
  • 图像中不规则物体的长轴与短轴:OpenCV实现指南

    1 首先 读取图像并将其转换为灰度图像 2 进行图像预处理 包括使用高斯模糊和阈值化 以便更好地处理图像 3 通过使用OpenCV的cv2 findContours 函数 找到图像中的所有轮廓 4 遍历所有轮廓 如果轮廓点的数量大于等于5个
  • Ai绘画到底是创造艺术还是窃取艺术呢

    随着智能AI技术的发展 AI绘画已经成为一个非常热门的领域 AI绘画的应用范围非常广泛 它对于设计 摄影等领域产生了积极影响 但同时 由于AI绘画的版权究竟归属于谁 AI绘画也引起了版权的争议 那么 AI到底是创造艺术还是窃取艺术呢 本文将
  • 02线程池的结构体描述信息

    02线程池的结构体描述信息 01线程池原理剖析 02线程池的结构体描述信息 03线程池的各个函数解析 04线程池完整的头文件和实现文件 c 直接看代码 代码里有详细的注释 描述任务队列的结构体 typedef struct void fun
  • html+css实现一个响应式管理平台架构模板

    文本将会带你使用html css实现一个响应式的管理平台架构模板 目前来说市面上的管理平台架构模板大同小异 文本的知识点都会符合场景所需 目录 1 管理平台的架构内容 2 顶部的布局 3 下半部分布局 4 左侧菜单区域实现 5 右侧主体区域
  • 【EasyExcel 教程】详解写入Excel -- 写入

    愿你如阳光 明媚不忧伤 目録 4 详解写入Excel 4 1 简单写入Excel 4 2 根据参数导出指定列 排除或指定 4 3 指定写入的列 4 4 复杂头写入 4 5 日期 数字或者自定义格式的转换 4 6 图片导出 列宽 行高注解 4