作者

吴华辉

推荐理由

因为招投标需求对比单导出结构复杂,引入了myexcel工具实现自定义导出,文章介绍了单元格合并,颜色标记,数据遍历的语法供大家参考。

原因

一些复杂格式的excel不适用于通用的表格工具导出,根据其他项目组的推荐使用了myexcel工具包

使用

github地址:https://github.com/liaochong/myexcel

依赖添加


#Maven<dependency><groupId>com.github.liaochong</groupId><artifactId>myexcel</artifactId><version>3.9.6</version></dependency>#Gradlecompile group: 'com.github.liaochong', name: 'myexcel', version: '3.9.6'#Ivy<dependency org="com.github.liaochong" name="myexcel" rev="3.9.6"/>

模板导出

这里使用freemarker模板引擎(支持:beetl、groovy-templates、thymeleaf、velocity、enjoy)

1、依赖添加

<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version>
</dependency>

2、模板示例

该模板是招投标系统中对比单导出中的通用类模板


<#-- 通用类模板 --><#-- 通用类模板 --><html><body><table style="text-align: center;vertical-align: middle;border-style:thin;"><#-- 标题  --><#if titleName??><tr><th colspan="${biddingContrastBillSupplierVos?size * 4 + 7}">${titleName}</th></tr></#if><!-- 第一行 基础 --><tr><th rowspan="2">序号</th><!-- 纵向占两行 --><th rowspan="2">公司</th><th rowspan="2">物料名称</th><th rowspan="2">规格属性</th><th rowspan="2">要求品牌</th><th rowspan="2">单位</th><th rowspan="2">数量</th><#-- 循环遍历 --><#list biddingContrastBillSupplierVos as biddingContrastBillSupplierVo><td colspan="4">${(biddingContrastBillSupplierVo.supplierName)!''}</td><!-- 横向占三列 --></#list></tr><!-- 第二行 基础 --><#-- 循环遍历 --><tr><#list biddingContrastBillSupplierVos as biddingContrastBillSupplierVo><th rowspan="1">单价(元)</th><th rowspan="1">总价(元)</th><th rowspan="1">品牌</th><th rowspan="1">备注</th></#list></tr><!-- 第三行 明细 --><#-- 循环遍历 --><#list bidPricingVos as bidPricingVo><tr><td rowspan="1">${bidPricingVo_index + 1} </td><td rowspan="1">${(bidPricingVo.companyName)!''}</td><td rowspan="1">${(bidPricingVo.skuName)!''}</td><td rowspan="1">${(bidPricingVo.attributeName)!''}</td><td rowspan="1">${(bidPricingVo.brand)!''}</td><td rowspan="1">${(bidPricingVo.unitName)!''}</td><td rowspan="1" string>${(bidPricingVo.quantity)!''}</td><#-- 循环遍历 --><#list bidPricingVo.biddingContrastBillSupplierDetailVos as biddingContrastBillSupplierDetailVo><#if biddingContrastBillSupplierDetailVo.min==1><td rowspan="1" style="background-color:#FFFF00"string>${(biddingContrastBillSupplierDetailVo.price)!'/'}</td><#else><td rowspan="1" string>${(biddingContrastBillSupplierDetailVo.price)!'/'}</td></#if><td rowspan="1" string>${(biddingContrastBillSupplierDetailVo.priceTotal)!'/'}</td><td rowspan="1">${(biddingContrastBillSupplierDetailVo.brand)!'/'}</td><td rowspan="1">${(biddingContrastBillSupplierDetailVo.remark)!'/'}</td></#list></tr></#list><!-- 合计 --><tr><td colspan="7">合计</td><!-- 横向占6列 --><#list biddingContrastBillSupplierVos as biddingContrastBillSupplierVo><td colspan="4" string>${(biddingContrastBillSupplierVo.totalPrice)!'/'}</td><!-- 横向占3列 --></#list></tr><!-- 开票方式 --><tr><td colspan="7">开票方式</td><!-- 横向占6列 --><#list biddingContrastBillSupplierVos as biddingContrastBillSupplierVo><td colspan="4" string>${(biddingContrastBillSupplierVo.billingMethod)!'/'}</td><!-- 横向占3列 --></#list></tr><!-- 付款方式 --><tr><td colspan="7">付款方式</td><!-- 横向占6列 --><#list biddingContrastBillSupplierVos as biddingContrastBillSupplierVo><td colspan="4" string>${(biddingContrastBillSupplierVo.paymentMethod)!'/'}</td><!-- 横向占3列 --></#list></tr><!-- 交货时间 --><tr><td colspan="7">交货时间</td><!-- 横向占6列 --><#list biddingContrastBillSupplierVos as biddingContrastBillSupplierVo><td colspan="4" string>${(biddingContrastBillSupplierVo.deliveryTime)!'/'}</td><!-- 横向占3列 --></#list></tr><!-- 联系人 --><tr><td colspan="7">联系人</td><!-- 横向占6列 --><#list biddingContrastBillSupplierVos as biddingContrastBillSupplierVo><td colspan="4" string>${(biddingContrastBillSupplierVo.supplierContact)!'/'}</td><!-- 横向占3列 --></#list></tr><!-- 联系方式 --><tr><td colspan="7">联系方式</td><!-- 横向占6列 --><#list biddingContrastBillSupplierVos as biddingContrastBillSupplierVo><td colspan="4" string>${(biddingContrastBillSupplierVo.supplierPhone)!'/'}</td><!-- 横向占3列 --></#list></tr></table></body></html>

3、Workbook生成

由于产品要求对最低的价格进行颜色标记,则没有使用默认的样式。

 public void export(Long fileId, HttpServletResponse response) {//查询数据BiddingContrastBillVo biddingContrastBillVo = biddingContrastBillService.export(fileId);if (biddingContrastBillVo == null) {throw new BidException("对比单信息不存在!");}Map<String, Object> dataMap = new HashMap<>(16);// 标题 产品暂时没有要求dataMap.put("titleName", biddingContrastBillVo.getFileName().split("\\.")[0]);dataMap.put("bidPricingVos", biddingContrastBillVo.getBidPricingVos());dataMap.put("biddingContrastBillSupplierVos", biddingContrastBillVo.getBiddingContrastBillSupplierVos());// 模板BidBillTemplateTypeEnum templateTypeEnum = BidBillTemplateTypeEnum.findByCode(biddingContrastBillVo.getTemplateType());if (templateTypeEnum == null || StringUtil.isBlank(templateTypeEnum.getExportPath())) {throw new BidException("导出模板不存在!");}try (ExcelBuilder excelBuilder = new FreemarkerExcelBuilder()) {Workbook workbook = excelBuilder.classpathTemplate(templateTypeEnum.getExportPath())//                    .useDefaultStyle().build(dataMap);AttachmentExportUtil.export(workbook, biddingContrastBillVo.getFileName(), response);} catch (IOException e) {e.printStackTrace();}}

注意的地方

1、如果使用默认样式,则无法会覆盖模板中定义的样式

2、如果使用自定义样式,并设置一些属性则可能升级poi版本

myexcel初步使用相关推荐

  1. TensorRT 7.2.1开发初步

    TensorRT 7.2.1开发初步 TensorRT 7.2.1开发人员指南演示了如何使用C ++和Python API来实现最常见的深度学习层.它显示了如何采用深度学习框架构建现有模型,并使用该模 ...

  2. SOC,System on-a-Chip技术初步

    SOC,System on-a-Chip技术初步 S O C(拼作S-O-C)是一种集成电路,它包含了电子系统在单个芯片上所需的所有电路和组件.它可以与传统的计算机系统形成对比,后者由许多不同的组件组 ...

  3. 《OpenCV3编程入门》学习笔记3 HighGUI图形用户界面初步

    第3章 HighGUI图形用户界面初步 3.1 图像的载入.显示和输出到文件 1.OpenCV命名空间2种访问方法 (1)代码开头加:usingnamespace cv; (2)每个类或函数前加:cv ...

  4. 初步判断内存泄漏方法

    有时候,内存泄漏不明显,或者怀疑系统有内存泄漏,我们可以通过下面介绍的方法初步确认系统是否存在内存泄漏. 首先在Java命令行中增加-verbose:gc参数, 然后重新启动java进程. 当系统运行 ...

  5. android蓝牙4.0(BLE)开发之ibeacon初步

    一个april beacon里携带的信息如下 ? 1 <code class=" hljs ">0201061AFF4C0002159069BDB88C11416BAC ...

  6. 游戏AI之初步介绍(0)

    目录 游戏AI是什么? 游戏AI和理论AI 智能的假象 (更新)游戏AI和机器学习 介绍一些游戏AI 4X游戏AI <求生之路>系列 角色扮演/沙盒游戏中的NPC 游戏AI 需要学些什么? ...

  7. 【转】ibatis的简介与初步搭建应用

    [转]ibatis的简介与初步搭建应用 一.ibatis的简介 ibatis是什么东西就不介绍了,自己去找谷老师. 这里讲下自己的使用体会.之前自己学过Hibernate,是看尚学堂的视频教学的,看完 ...

  8. 初步了解:使用JavaScript进行表达式(De Do Do Do,De Da Da Da)

    by Donavon West 由Donavon West 初步了解:使用JavaScript进行表达式(De Do Do Do,De Da Da Da) (A first look: do expr ...

  9. 存储过程和存储函数初步

    2019独角兽企业重金招聘Python工程师标准>>> 存储过程和函数初步 简单的来说,存储过程就是一条或者多条 SQL 语句的集合,可视为批处理文件,但是其作用不仅限于批处理. # ...

  10. 【spring框架】spring整合hibernate初步

    spring与hibernate做整合的时候,首先我们要获得sessionFactory. 我们一般只需要操作一个sessionFactory,也就是一个"单例",这一点很适合交给 ...

最新文章

  1. 大数据测试之初识Hadoop2
  2. Boost:正则表达式的实例
  3. ASP.NET Core Filter与IOC的羁绊
  4. 牛客网 【每日一题】4月23日题目精讲 边的染色
  5. android怎样禁用整个布局点击,Android - 自动禁用布局里的所有子控件
  6. HDU 4946 Area of Mushroom 凸包 第八次多校
  7. [转载]java对cookie的操作
  8. DPDK学习0 -- 学习步骤
  9. ①管理员身份运行cmd;②cmd命令切换到指定文件夹目录;③cmd命令窗口中复制粘贴
  10. 同步助手 android 微信 表情包,微信表情轻松导,同步助手带你装逼带你飞
  11. IN和AdaIN原理与代码实现
  12. 【RL】同策略(on-policy)与异策略(off-policy)
  13. 操作系统 (二): 进程与线程
  14. 修改方维分享系统注册页面的标题
  15. java 实现银联B2B、B2C、无卡支付
  16. CC00015.kylin——|HadoopOLAP_Kylin.V15|——|Kylin.v15|Cube优化|Cuboid剪枝优化|
  17. 朗润国际期货:元旦各地金融市场休市情况
  18. JAVA中间转发层开发
  19. hp打印机装不上服务器系统安装,惠普1210打印机驱动为什么一直安装不上?
  20. 重庆海天软件工程学院的WINFORM实训项目-抽奖系统

热门文章

  1. 机器人学资料站-202108
  2. 亮瞎眼的十六进制颜色代码表
  3. 数组根据条件筛选出满足条件的数据(数组里面是对象)
  4. micro usb接口正负极_关于手机MicroUSB接口数据线,这里有最详细解说
  5. 移动4g手机信号测试软件,中移动4G网络测试:网速快但信号不稳
  6. 程序员跳槽时,如何优雅地谈薪水?
  7. Beer Bill(签到题)
  8. python中的myql的execute()
  9. 给ESXi虚拟机硬盘瘦身
  10. 南部翔宇实验小学第六届校园文化艺术节闭幕式暨“六一”庆祝活动