apache poi 導出復雜的excel表格

如何導出復雜的excel 表格

如圖表格,存在行和列的合并,邊框,樣式,顏色等。
在這里插入圖片描述

依賴

 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency>

實現的示例demo

 @GetMapping("/exportExcel")public void exportExcel(HttpServletRequest request, HttpServletResponse response) {try {HSSFWorkbook workbook = new HSSFWorkbook();//創建一個excel對象HSSFSheet sheet = workbook.createSheet();//創建一個工作薄對象HSSFRow row = sheet.createRow(0);HSSFCell createCell = row.createCell(0);
//            sheet.addMergedRegion(CellRangeAddress.valueOf("$A$1:$E$1"));//單元格合并HSSFCellStyle cellStyle = workbook.createCellStyle();cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());//25%灰色cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);//顏色cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());// 設置邊框樣式為細線cellStyle.setBorderRight(BorderStyle.THIN);cellStyle.setBorderLeft(BorderStyle.THIN);cellStyle.setBorderTop(BorderStyle.THIN);cellStyle.setBorderBottom(BorderStyle.THIN);//字體水平和垂直居中cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中HSSFFont font = workbook.createFont();//字體,大小,粗細font.setFontName("宋體");font.setFontHeight((short) 20);font.setBold(true);//加粗cellStyle.setFont(font);createCell.setCellStyle(cellStyle);createCell.setCellValue("活動統計報表");
//            CellRangeAddress mergedRegion = new CellRangeAddress(0, 0, 0, 4);CellRangeAddress mergedRegion = CellRangeAddress.valueOf("$A$1:$E$1");sheet.addMergedRegion(mergedRegion);//單元格合并RegionUtil.setBorderTop(BorderStyle.THIN, mergedRegion, sheet);// 合并 A1:E1 設置邊框粗細RegionUtil.setBorderTop(BorderStyle.THIN, mergedRegion, sheet);RegionUtil.setBorderBottom(BorderStyle.THIN, mergedRegion, sheet);RegionUtil.setBorderLeft(BorderStyle.THIN, mergedRegion, sheet);RegionUtil.setBorderRight(BorderStyle.THIN, mergedRegion, sheet);row = sheet.createRow(1);createCell = row.createCell(0);font.setFontHeightInPoints((short) 12);font.setBold(true);cellStyle.setFont(font);createCell.setCellValue("2024-01-01~2024-01-31");createCell.setCellStyle(cellStyle);sheet.autoSizeColumn(0);sheet.autoSizeColumn(1);List<String> headerList = Arrays.asList("項目", "", "活動類型", "參數人數", "經費");List<List<String>> listData = new ArrayList<>();listData.add(Arrays.asList("球類賽事", "", "籃球", "16", "158"));listData.add(Arrays.asList("", "", "羽毛球", "8", "231"));listData.add(Arrays.asList("", "", "網球", "23", "143"));font.setBold(true);cellStyle.setFont(font);for (int j = 0; j < listData.size(); j++) {row = sheet.createRow(j + 3);List<String> strings = listData.get(j);for (int k = 0; k < headerList.size(); k++) {createCell = row.createCell(k, CellType.STRING);createCell.setCellStyle(cellStyle);String text = strings.get(k);text = null == text ? "" : text;createCell.setCellValue(text);sheet.autoSizeColumn(k);}}sheet.addMergedRegion(CellRangeAddress.valueOf("$A$2:$E$2"));sheet.addMergedRegion(CellRangeAddress.valueOf("$A$3:$E$3"));sheet.addMergedRegion(CellRangeAddress.valueOf("$A$4:$B$6"));ExcelUtil.setFileDownloadHeader(request, response, "測試" + System.currentTimeMillis() + ".xls");OutputStream outputStream = response.getOutputStream();workbook.write(outputStream);workbook.close();logger.info("導出成功");} catch (Exception e) {logger.error("導出失敗", e);}}
import org.apache.commons.lang.StringUtils;
import org.apache.poi.ss.util.CellReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;public class ExcelUtil {private static final Logger logger = LoggerFactory.getLogger(ExcelUtil.class);public static void setFileDownloadHeader(HttpServletRequest request, HttpServletResponse response, String fileName) {String userAgent = request.getHeader("USER-AGENT");try {String finalFileName = null;if (StringUtils.contains(userAgent, "MSIE") || StringUtils.contains(userAgent, "Trident")) {finalFileName = URLEncoder.encode(fileName, "UTF8");} else if (StringUtils.contains(userAgent, "Mozilla")) {finalFileName = new String(fileName.getBytes(), "ISO8859-1");} else {finalFileName = URLEncoder.encode(fileName, "UTF8");}response.setHeader("Cache-Control", "private");response.setHeader("Pragma", "private");response.setContentType("application/vnd.ms-excel;charset=utf-8");response.setHeader("Content-Type", "application/force-download");response.setHeader("Content-Disposition", "attachment;filename=\"" + finalFileName + "\"");} catch (UnsupportedEncodingException e) {logger.error("導出設置錯誤", e);}}public static String columnIndexToColumnName(int columnIndex) {String string = CellReference.convertNumToColString(16384);return string;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/922148.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/922148.shtml
英文地址,請注明出處:http://en.pswp.cn/news/922148.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

下載 Eclipse Temurin 的 OpenJDK 提示 “無法訪問此網站 github.com 的響應時間過長”

打開 Eclipse Temurin 的 OpenJDK 的官網下載地址&#xff1a; https://adoptium.net/zh-CN/temurin/releases 問 deepseek&#xff1a; 國內網絡&#xff0c;打不開github.com網頁&#xff0c;提示github.com 的響應時間過長。 國內無法訪問 GitHub 或訪問緩慢&#xff0c;通…

C/C++類型轉換

C/C類型轉換 1. C類型轉換 C 語言中的類型轉換主要分為兩種&#xff1a;隱式類型轉換 (Implicit Conversion) - 由編譯器自動完成。顯式類型轉換 (Explicit Conversion) - 由程序員強制指定&#xff0c;也稱為強制類型轉換。1.2 隱式類型轉換 編譯器在編譯時自動進行的轉換&…

【Java】Windows切換Java8和Java11

現在有些項目要升級到Java17, 所以需要切換不同的java版本。 如何安裝Java8 由于已經安裝了jJava8, 之前的安裝文章&#xff1a;【Java】jdk8安裝——英文版 如何安裝Java17 Java17下載地址 https://www.oracle.com/java/technologies/downloads/#java17-windows 下載到電…

SQLite 數據庫核心知識與 C 語言編程

一、數據庫基礎概念1.1 數據庫分類根據規模和應用場景&#xff0c;數據庫可分為以下幾類&#xff1a;大型數據庫&#xff1a;Oracle&#xff08;適用于企業級高并發、大容量場景&#xff09;中型數據庫&#xff1a;MySQL、MSSQL&#xff08;適用于中小型系統、Web 應用&#xf…

Netty 調優篇:實戰配置、性能監控與常見坑

&#x1f680; Netty 調優篇&#xff1a;實戰配置、性能監控與常見坑前面我們已經深入了 Netty 的 線程模型、Pipeline、EventLoop、內存池、零拷貝和背壓機制。 但在實際工作中&#xff0c;很多人踩坑的地方不是“源碼沒看懂”&#xff0c;而是 調優沒做好。 今天我們就從三個…

Linux Node.js 安裝及環境配置詳細教程

如果您喜歡此文章&#xff0c;請收藏、點贊、評論&#xff0c;謝謝&#xff0c;祝您快樂每一天。 一、Node.js是什么 Node.js是一個基于Chrome V8引擎的[JavaScript運行環境]。 Node.js使用了一個事件驅動、非阻塞式I/O 的模型。 Node.js是一個讓JavaScript運行在服務端的開…

呼叫中心系統IVR流程設計的心理學

呼叫中心的 IVR&#xff08;交互式語音應答&#xff09;系統看似是 “機器與用戶的對話”&#xff0c;實則暗藏對用戶心理的精準把握。其設計需圍繞降低焦慮、提升效率、強化信任三大核心目標&#xff0c;背后依托認知心理學、行為心理學、情感心理學等理論支撐。一、認知負荷理…

一些開源或免費的網絡管理工具

整理開源及免費網絡管理工具推薦,涵蓋監控、配置、安全、流量分析等場景,適用于不同規模的網絡環境: ?一、網絡監控與性能分析? 1. ?Zabbix? ?特點?:企業級監控方案,支持SNMP、IPMI、JMX等多種協議,提供實時儀表盤、告警通知和自動化發現功能。 ?適用場景?:服…

谷粒商城項目-P16快速開發-人人開源搭建后臺管理系統

1.對腳手架工程進行改造 此項目選用的腳手架工程是人人開源 地址&#xff1a;人人開源 選擇的是下圖標紅的renren-fast作為后端&#xff0c;renren-fast-vue作為前端 克隆上述兩個項目 2.后端改造 2.1將renrenfast項目的git文件夾刪除后&#xff0c;拖進后端代碼文件夾中 2…

V少JS基礎班之第八彈:this

文章目錄一、 前言二、本節涉及知識點三、重點內容1、從新的角度認識this2、this是函數的參數3、this的值4、函數的調用1- 裸函數調用2- 函數作為構造函數調用3- 函數作為對象的方法調用4- 函數顯示調用5- 箭頭函數一、 前言 第八彈內容是this。this相對來說難度不大&#xff…

《堆的詳解:結構、操作及堆排序算法》

目錄 一.堆的概念與結構 1.1 堆的概念 1.2 堆性質&#xff1a; 1.3 堆的結構定義 二.堆的初始化和銷毀 2.1 堆的初始化&#xff1a; 2.2 堆的銷毀&#xff1a; 三.堆的插入數據(含向上調整算法的實現) 3.1 插入邏輯 3.2 插入函數 3.3 向上調整算法 三. 堆的刪除數…

深入解析 Kubernetes 中的 Service 資源:為應用提供穩定的網絡訪問

什么是 Kubernetes 中的 Service&#xff1f; 在現代微服務架構中&#xff0c;服務之間的通信和負載均衡是至關重要的。尤其是在 Kubernetes 環境中&#xff0c;由于 Pod 是動態創建和銷毀的&#xff0c;如何為一組 Pod 提供穩定的訪問入口&#xff0c;成為了架構設計中的一個關…

使用Samba網絡磁盤作為MacOS時間機器的遠程備份磁盤

最近考慮MacOS系統升級&#xff0c;所以需要做磁盤備份&#xff0c;MacOS里有個備份磁盤很方便的工具&#xff1a;時間機器&#xff0c;可以自動定期備份磁盤&#xff0c;但是一般需要一個大點的移動硬盤插在macbook上選擇其為備份磁盤&#xff0c;可惜我并沒有移動硬盤&#x…

智能頭盔實時監控系統設計與實現

智能頭盔實時監控系統設計與實現 源碼 https://gitee.com/intostars/csdn-demo/tree/master/src/views/smartHelmet 預覽 一、功能概述 智能頭盔實時監控系統是基于Vue 3和TypeScript開發的一套用于遠程監控和控制智能頭盔設備的前端應用模塊。該系統通過WebSocket與后端服務…

Docker 學習筆記(八):容器運行時工具實踐及 OpenStack 部署基礎

容器管理工具Containerd nerdctl 實踐 nerdctl管理存儲 nerdctl命令創建容器的時候&#xff0c;可以使用-v選項將本地目錄掛載給容器實現數據持久化 示例&#xff1a; [rootlocalhost ~]# mkdir /data [rootlocalhost ~]# nerdctl run -d -v /data:/data busybox -- sleep infi…

Unity鍵盤控制角色運動

以下是一個完整的Unity角色移動和跳躍腳本,支持WASD或方向鍵移動: 使用說明 確保組件設置正確: 確保您的游戲對象有一個CharacterController組件 如果沒有,可以通過菜單 "Component -> Physics -> Character Controller" 添加 相機設置: 確保場景中有一…

linux 宏 DEVICE_ATTR

理解 DEVICE_ATTR DEVICE_ATTR 是 Linux 內核中用于創建設備屬性的宏&#xff0c;通常用于 sysfs 文件系統。通過 sysfs&#xff0c;用戶空間的程序可以讀取或修改內核中的設備屬性。DEVICE_ATTR 宏定義在 <linux/device.h> 頭文件中&#xff0c;用于聲明和定義一個設備屬…

MCP模型上下文協議以及交互流程

1. MCP 是什么全稱&#xff1a;Model Context Protocol定位&#xff1a;讓大語言模型&#xff08;LLM&#xff09;能在“上下文”之外&#xff0c;按統一格式訪問外部數據、調用插件、持久化狀態。動機&#xff1a;以前每家框架&#xff08;LangChain、LlamaIndex 等&#xff0…

MySQLTransactionRollbackException

問題描述mysql部署1主3從&#xff0c;昨天發現主庫有大量報警錯誤&#xff1a;Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction ; Deadlock found when trying to get lock; …

Redis環境搭建指南:Windows/Linux/Docker多場景安裝與配置

Redis環境搭建指南&#xff1a;Windows/Linux/Docker多場景安裝與配置 1. Redis安裝方式概覽 1.1 安裝方式對比 安裝方式適用場景優點缺點難度Windows直接安裝開發調試安裝簡單&#xff0c;Windows兼容好性能不如Linux&#xff0c;生產不推薦?Linux源碼編譯生產環境性能最佳…