导出 excel 多 sheet 且有跨列及背景色样式

本贴最后更新于 2032 天前,其中的信息可能已经时移世易

引入依赖包,代码可直接运行 main 方法看效果。希望能帮到你

import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; /** * 导出excel多sheet且有跨列及背景色样式 * * @author Stone */ public class ExportExcelUtil { /** * 导出多sheet格式的excel * * @param fileSavePath 导出文件保存路径 * @param workbook 工作薄对象 * @param sheetIndex sheet位置,0表示第一个表格中的第一个sheet * @param sheetName sheet名称 * @param sheetTitle sheet标题 * @param headers sheet各列标题头 * @param data sheet数据集 * @param weekbottomsW sheet底部合计行(外部) * @param weekbottomsN sheet底部合计行(内部) */ public void exportExcel(String fileSavePath, HSSFWorkbook workbook, int sheetIndex, String sheetName, String sheetTitle, String[] headers, List<List<String>> data, String[] weekbottomsW, String[] weekbottomsN) { try { //创建工作薄 HSSFSheet sheet = workbook.createSheet(); //设置sheet位置及名称 workbook.setSheetName(sheetIndex, sheetName); //设置工作薄默认列宽度,单位:字节 sheet.setDefaultColumnWidth((short) 23); //创建sheet页公共标题行及样式 Row rowTitle = sheet.createRow(0); //标题字体 Font fontTitle = workbook.createFont(); //字体字号 fontTitle.setFontHeightInPoints((short) 11); //是否加粗 fontTitle.setBold(true); //标题样式 CellStyle styleTitle = workbook.createCellStyle(); styleTitle.setBorderBottom(BorderStyle.THIN); styleTitle.setBorderLeft(BorderStyle.THIN); styleTitle.setBorderRight(BorderStyle.THIN); styleTitle.setBorderTop(BorderStyle.THIN); styleTitle.setAlignment(HorizontalAlignment.CENTER); styleTitle.setFont(fontTitle); //标题所在行号0标识当前sheet页第1行 Cell cellTitle = rowTitle.createCell(0); //应用样式 cellTitle.setCellStyle(styleTitle); //标题行跨列设置 sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headers.length - 1)); cellTitle.setCellValue(sheetTitle); //创建表格各列标题行 Row rowHeade = sheet.createRow(1); for (int i = 0; i < headers.length; i++) { Cell cellHeader = rowHeade.createCell((short) i); cellHeader.setCellStyle(styleTitle); HSSFRichTextString text = new HSSFRichTextString(headers[i]); cellHeader.setCellValue(text.toString()); } //遍历数据集合,创建数据行 if (data != null) { //从第3行开始写入数据行 int index = 2; //临时列内容,用于判断背景色是否应发生变化 String code = ""; //是否设置背景色 boolean isColor = true; for (List<String> sheetData : data) { //创建数据行 Row rowData = sheet.createRow(index); String entName = sheetData.get(0); if(StringUtil.isNotEmpty(code) && !entName.equals(code)){ if(isColor){ isColor= false; }else{ isColor= true; } } code = entName; //从第1列开始写入数据列 int cellIndex = 0; for (String sd : sheetData) { Cell cellData = rowData.createCell((short) cellIndex); if(isColor){ cellData.setCellStyle(getCellStyleBlue(workbook)); }else{ cellData.setCellStyle(getCellStyleWhite(workbook)); } cellData.setCellValue(sd.toString()); cellIndex++; } index++; } } //创建表格底部计算行(外部) Row bottomsW = sheet.createRow(data.size() + 2); Cell cellBottom = null; for (int i = 0; i < weekbottomsW.length; i++) { cellBottom = bottomsW.createCell((short) i); cellBottom.setCellStyle(styleTitle); HSSFRichTextString text = new HSSFRichTextString(weekbottomsW[i]); if (i == 0) { sheet.addMergedRegion(new CellRangeAddress(data.size() + 2, data.size() + 2, 0, 1)); } cellBottom.setCellValue(text.toString()); } //创建表格底部计算行(内部) Row bottomsN = sheet.createRow(data.size() + 3); for (int i = 0; i < weekbottomsN.length; i++) { cellBottom = bottomsN.createCell((short) i); cellBottom.setCellStyle(styleTitle); HSSFRichTextString text = new HSSFRichTextString(weekbottomsN[i]); if (i == 0) { sheet.addMergedRegion(new CellRangeAddress(data.size() + 3, data.size() + 3, 0, 1)); } cellBottom.setCellValue(text.toString()); } //初始化文件流对象 OutputStream file = new FileOutputStream(fileSavePath); //将数据写入工作薄 workbook.write(file); //关闭文件流 file.close(); } catch (Exception e) { e.printStackTrace(); } } public CellStyle getCellStyleBlue (HSSFWorkbook workbook){ //数据行字体设置 Font fontData = workbook.createFont(); fontData.setFontHeightInPoints((short) 11); //数据行样式设置 CellStyle cellStyle = workbook.createCellStyle(); //背景色 cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); cellStyle.setBorderBottom(BorderStyle.THIN); cellStyle.setBorderLeft(BorderStyle.THIN); cellStyle.setBorderRight(BorderStyle.THIN); cellStyle.setBorderTop(BorderStyle.THIN); cellStyle.setAlignment(HorizontalAlignment.CENTER); cellStyle.setFont(fontData); //设置背景色为浅蓝色 cellStyle.setFillForegroundColor(IndexedColors.LIGHT_CORNFLOWER_BLUE.getIndex()); return cellStyle; } public CellStyle getCellStyleWhite (HSSFWorkbook workbook){ //数据行字体设置 Font fontData = workbook.createFont(); fontData.setFontHeightInPoints((short) 11); //数据行样式设置 CellStyle cellStyle = workbook.createCellStyle(); //背景色 cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); cellStyle.setBorderBottom(BorderStyle.THIN); cellStyle.setBorderLeft(BorderStyle.THIN); cellStyle.setBorderRight(BorderStyle.THIN); cellStyle.setBorderTop(BorderStyle.THIN); cellStyle.setAlignment(HorizontalAlignment.CENTER); cellStyle.setFont(fontData); cellStyle.setFillForegroundColor(IndexedColors.WHITE1.getIndex()); return cellStyle; } public static void main(String[] args) { try { //导出文件名 String fileName = new StringBuilder("导出Excel文件名").append(".xls").toString(); List<List<String>> weekSheet1Data = new ArrayList<List<String>>(); String weekSheet1bottomsWSumA = "-"; String weekSheet1bottomsWSumB = "-"; String weekSheet1bottomsWSumC = "-"; String weekSheet1bottomsNSumA = "-"; String weekSheet1bottomsNSumB = "-"; String weekSheet1bottomsNSumC = "-"; String[] weekSheet1bottomsW = {"合计(外部)", "", weekSheet1bottomsWSumA, weekSheet1bottomsWSumB, weekSheet1bottomsWSumC}; String[] weekSheet1bottomsN = {"合计(内部)", "", weekSheet1bottomsNSumA, weekSheet1bottomsNSumB, weekSheet1bottomsNSumC}; List<List<String>> weekSheet2Data = new ArrayList<List<String>>(); String weekSheet2bottomsWSumA = "-"; String weekSheet2bottomsWSumB = "-"; String weekSheet2bottomsWSumC = "-"; String weekSheet2bottomsNSumA = "-"; String weekSheet2bottomsNSumB = "-"; String weekSheet2bottomsNSumC = "-"; String[] weekSheet2bottomsW = {"合计(外部)", "", weekSheet2bottomsWSumA, weekSheet2bottomsWSumB, weekSheet2bottomsWSumC}; String[] weekSheet2bottomsN = {"合计(内部)", "", weekSheet2bottomsNSumA, weekSheet2bottomsNSumB, weekSheet2bottomsNSumC}; List<List<String>> weekSheet3Data = new ArrayList<List<String>>(); String weekSheet3bottomsWSumA = "-"; String weekSheet3bottomsWSumB = "-"; String weekSheet3bottomsWSumC = "-"; String weekSheet3bottomsNSumA = "-"; String weekSheet3bottomsNSumB = "-"; String weekSheet3bottomsNSumC = "-"; String[] weekSheet3bottomsW = {"合计(外部)", "", weekSheet3bottomsWSumA, weekSheet3bottomsWSumB, weekSheet3bottomsWSumC}; String[] weekSheet3bottomsN = {"合计(内部)", "", weekSheet3bottomsNSumA, weekSheet3bottomsNSumB, weekSheet3bottomsNSumC}; List rowData1 = new ArrayList<Object>() {{ this.add("北京市"); this.add("某公司"); this.add("1234"); this.add("567"); this.add("89"); }}; List rowData2 = new ArrayList<Object>() {{ this.add("北京市"); this.add("某某公司"); this.add("2334"); this.add("677"); this.add("90"); }}; List rowData3 = new ArrayList<Object>() {{ this.add("河北省"); this.add("X公司"); this.add("8934"); this.add("547"); this.add("69"); }}; List rowData4 = new ArrayList<Object>() {{ this.add("河北省"); this.add("XX公司"); this.add("3934"); this.add("647"); this.add("93"); }}; List rowData5 = new ArrayList<Object>() {{ this.add("山东省"); this.add("公司名称"); this.add("5234"); this.add("787"); this.add("83"); }}; List rowData6 = new ArrayList<Object>() {{ this.add("陕西省"); this.add("公司公司"); this.add("9034"); this.add("737"); this.add("59"); }}; List rowData7 = new ArrayList<Object>() {{ this.add("陕西省"); this.add("某有限公司"); this.add("8834"); this.add("667"); this.add("73"); }}; List rowData8 = new ArrayList<Object>() {{ this.add("青海省"); this.add("0.0有限责任公司"); this.add("7634"); this.add("337"); this.add("82"); }}; List rowData9 = new ArrayList<Object>() {{ this.add("青海省"); this.add("青海X有限责任公司"); this.add("6334"); this.add("737"); this.add("66"); }}; weekSheet1Data.add(rowData1); weekSheet1Data.add(rowData2); weekSheet1Data.add(rowData3); weekSheet1Data.add(rowData4); weekSheet1Data.add(rowData5); weekSheet1Data.add(rowData6); weekSheet1Data.add(rowData7); weekSheet1Data.add(rowData8); weekSheet1Data.add(rowData9); weekSheet2Data.add(rowData1); weekSheet2Data.add(rowData2); weekSheet2Data.add(rowData3); weekSheet2Data.add(rowData4); weekSheet2Data.add(rowData5); weekSheet2Data.add(rowData6); weekSheet2Data.add(rowData7); weekSheet2Data.add(rowData8); weekSheet2Data.add(rowData9); weekSheet3Data.add(rowData1); weekSheet3Data.add(rowData2); weekSheet3Data.add(rowData3); weekSheet3Data.add(rowData4); weekSheet3Data.add(rowData5); weekSheet3Data.add(rowData6); weekSheet3Data.add(rowData7); weekSheet3Data.add(rowData8); weekSheet3Data.add(rowData9); //导出文件保存路径 String fileSavePath = new StringBuilder("D:\\").append(fileName).toString(); //工作薄标题头,假如有5列 String[] weekHeaders = {"省", "公司", "Num1", "Num2", "Num3"}; ExportExcelUtil util = new ExportExcelUtil(); HSSFWorkbook workbook = new HSSFWorkbook(); //假如需要写入三个Sheet工作薄 util.exportExcel(fileSavePath, workbook, 0, "一区", "统计", weekHeaders, weekSheet1Data, weekSheet1bottomsW, weekSheet1bottomsN); util.exportExcel(fileSavePath, workbook, 1, "二区", "统计", weekHeaders, weekSheet2Data, weekSheet2bottomsW, weekSheet2bottomsN); util.exportExcel(fileSavePath, workbook, 2, "三区", "统计", weekHeaders, weekSheet3Data, weekSheet3bottomsW, weekSheet3bottomsN); } catch (Exception e) { e.printStackTrace(); } } }

英雄留步!走过路过不要错过,既然来了就恭请加入 平等 • 自由 • 奔放黑客派社区,一起学习,相互分享,共同进步吧 😄
注册邀请链接:https://hacpai.com/register?r=Stone

  • POI
    23 引用 • 21 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8216 回帖
  • Excel
    31 引用 • 28 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • gRpc
    11 引用 • 9 回帖 • 92 关注
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1794 回帖
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    412 引用 • 3588 回帖
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 178 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 5 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • danl
    166 关注
  • Office

    Office 现已更名为 Microsoft 365. Microsoft 365 将高级 Office 应用(如 Word、Excel 和 PowerPoint)与 1 TB 的 OneDrive 云存储空间、高级安全性等结合在一起,可帮助你在任何设备上完成操作。

    5 引用 • 34 回帖
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    24 引用 • 241 回帖
  • Outlook
    1 引用 • 5 回帖 • 1 关注
  • Access
    1 引用 • 3 回帖 • 1 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 3 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 2 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 763 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    84 引用 • 324 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 316 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 1 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖 • 2 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    125 引用 • 74 回帖
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 53 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 31 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    345 引用 • 749 回帖
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 181 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 396 关注