excel多sheet导出工具类——java

excel多sheet导出工具类

1、多个sheet导出工具类:


import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;/*** Excel导入、导出*/
public class ExcelDataHandleUtil {private final static String XLS = "xls";private final static String XLSX = "xlsx";private final static String SUFFIX_XLS = ".xls";private final static String SUFFIX_XLSX = ".xlsx";/*** 解析Excel数据*/public static List<Map<String, Object>> analysisExcel(MultipartFile file, String[] keyList) throws Exception {// 1、用HSSFWorkbook打开或者创建“Excel文件对象”Workbook workbook = null;//获得文件名String fileName = file.getOriginalFilename();// 判断后缀if (fileName.endsWith(XLS)) {//2003workbook = new HSSFWorkbook(file.getInputStream());} else if (fileName.endsWith(XLSX)) {//2007workbook = new XSSFWorkbook(file.getInputStream());} else {throw new Exception("文件不是Excel文件");}// 2、用HSSFWorkbook对象返回或者创建Sheet对象Sheet sheet = workbook.getSheetAt(0);int rows = sheet.getLastRowNum();// 指的行数,一共有多少行if (rows == 0) {throw new Exception("请填写数据");}List<Map<String, Object>> list = new ArrayList<>();// 3、用Sheet对象返回行对象,用行对象得到Cell对象for (int i = 1; i <= rows; i++) {// 读取左上端单元格Row row = sheet.getRow(i);// 行不为空if (row != null) {// 4、对Cell对象读写。Map<String, Object> map = new HashMap<>();for (int j = 0; j < keyList.length; j++) {map.put(keyList[j], getCellValue(row.getCell(j)));}list.add(map);}}return list;}/*** 导出excel文件2007*/public static void exportExcel(HttpServletResponse response, List<Map> list, String[] keyList, String[]columnNameList, String fileName) throws Exception {// 第一步,创建一个webbook,对应一个Excel文件XSSFWorkbook workbook = new XSSFWorkbook();// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheetXSSFSheet sheet = workbook.createSheet("Sheet1");// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制shortXSSFRow row = sheet.createRow(0);// 第四步,创建单元格,并设置值表头 设置表头居中XSSFCellStyle style = workbook.createCellStyle();style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式//        HSSFCell cell = row.createCell(0);XSSFCell cell = row.createCell(0);// 列头for (int i = 0; i < columnNameList.length; i++) {cell.setCellValue(columnNameList[i]);cell.setCellStyle(style);cell = row.createCell(i + 1);}// 数据for (int i = 0; i < list.size(); i++) {row = sheet.createRow(i + 1);Map<String, Object> map = list.get(i);for (int j = 0; j < keyList.length; j++) {String key = keyList[j];// 第四步,创建单元格,并设置值if (map.get(key) != null && StringUtils.isNotBlank(map.get(key).toString())) {row.createCell(j).setCellValue(String.valueOf(map.get(key)));}}}// 第六步,输出Excel文件OutputStream output = response.getOutputStream();response.reset();// SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//设置日期格式// String fileName =  df.format(new Date());// new Date()为获取当前系统时间response.setHeader("Content-disposition", "attachment; filename=" +URLEncoder.encode(fileName, "UTF-8") + SUFFIX_XLSX);response.setContentType("application/msexcel");workbook.write(output);output.close();}/*** 导出excel文件2003*/public static void exportExcelXLS(HttpServletResponse response, List<Map> list, String[] keyList, String[]columnNameList, String fileName) throws Exception {// 第一步,创建一个webbook,对应一个Excel文件HSSFWorkbook workbook = new HSSFWorkbook();// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheetHSSFSheet sheet = workbook.createSheet("Sheet1");// 设置表格默认列宽度为20个字节sheet.setDefaultColumnWidth((short) 20);// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制shortHSSFRow row = sheet.createRow(0);// 第四步,创建单元格,并设置值表头 设置表头居中HSSFCellStyle style = workbook.createCellStyle();style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式HSSFCell cell = row.createCell(0);style.setAlignment(HorizontalAlignment.CENTER);style.setFillForegroundColor(HSSFColor.PALE_BLUE.index);style.setFillPattern(FillPatternType.SOLID_FOREGROUND);style.setBorderBottom(BorderStyle.THIN);style.setBorderLeft(BorderStyle.THIN);style.setBorderRight(BorderStyle.THIN);style.setBorderTop(BorderStyle.THIN);// 生成一个字体HSSFFont font = workbook.createFont();font.setColor(HSSFColor.BLACK.index);font.setFontHeightInPoints((short) 12);font.setBold(true);// 把字体应用到当前的样式style.setFont(font);// 列头for (int i = 0; i < columnNameList.length; i++) {cell.setCellValue(columnNameList[i]);cell.setCellStyle(style);cell = row.createCell(i + 1);}// 数据for (int i = 0; i < list.size(); i++) {row = sheet.createRow(i + 1);Map<String, Object> map = list.get(i);for (int j = 0; j < keyList.length; j++) {String key = keyList[j];// 第四步,创建单元格,并设置值if (map.get(key) != null && StringUtils.isNotBlank(map.get(key).toString())) {row.createCell(j).setCellValue(String.valueOf(map.get(key)));}}}// 第六步,输出Excel文件OutputStream output = response.getOutputStream();response.reset();SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//设置日期格式//String fileName = df.format(new Date());// new Date()为获取当前系统时间response.setHeader("Content-disposition", "attachment; filename=" +URLEncoder.encode(fileName, "UTF-8") + SUFFIX_XLS);response.setContentType("application/msexcel");workbook.write(output);output.close();}/*** 多个sheet导出* 导出excel文件2003*/public static void exportExcel(HSSFWorkbook workbook, int sheetNum,String sheetTitle, List<Map<String, Object>> list, String[] keyList, String[]columnNameList) {// 生成一个表格HSSFSheet sheet = workbook.createSheet();workbook.setSheetName(sheetNum, sheetTitle);HSSFRow row = sheet.createRow(0);// 设置表格默认列宽度为20个字节sheet.setDefaultColumnWidth((short) 20);HSSFCell cell = row.createCell(0);// 第四步,创建单元格,并设置值表头 设置表头居中HSSFCellStyle style = workbook.createCellStyle();// 设置这些样式style.setAlignment(HorizontalAlignment.CENTER);style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());style.setFillPattern(FillPatternType.SOLID_FOREGROUND);style.setBorderBottom(BorderStyle.THIN);style.setBorderLeft(BorderStyle.THIN);style.setBorderRight(BorderStyle.THIN);style.setBorderTop(BorderStyle.THIN);// 生成一个字体HSSFFont font = workbook.createFont();font.setColor(HSSFColor.BLACK.index);font.setFontHeightInPoints((short) 13);font.setBold(true);// 把字体应用到当前的样式style.setFont(font);// 列头for (int i = 0; i < columnNameList.length; i++) {cell.setCellValue(columnNameList[i]);cell.setCellStyle(style);row.setHeight((short) (30 * 20));cell = row.createCell(i + 1);}// 数据if (list != null && !list.isEmpty()) {for (int i = 0; i < list.size(); i++) {row = sheet.createRow(i + 1);Map<String, Object> map = list.get(i);for (int j = 0; j < keyList.length; j++) {String key = keyList[j];// 第四步,创建单元格,并设置值if (map.get(key) != null && StringUtils.isNotBlank(map.get(key).toString())) {row.createCell(j).setCellValue(String.valueOf(map.get(key)));}}}}}/*** 获得Cell内容** @param cell 单元格* @return 数据*/private static String getCellValue(Cell cell) {String value = "";if (cell != null) {// 以下是判断数据的类型switch (cell.getCellType()) {case HSSFCell.CELL_TYPE_NUMERIC: // 数字value = cell.getNumericCellValue() + "";if (HSSFDateUtil.isCellDateFormatted(cell)) {Date date = cell.getDateCellValue();if (date != null) {value = new SimpleDateFormat("yyyy-MM-dd").format(date);} else {value = "";}} else {value = new DecimalFormat("##0.####").format(cell.getNumericCellValue());}break;case HSSFCell.CELL_TYPE_STRING: // 字符串value = cell.getStringCellValue();break;case HSSFCell.CELL_TYPE_BOOLEAN: // Booleanvalue = cell.getBooleanCellValue() + "";break;case HSSFCell.CELL_TYPE_FORMULA: // 公式value = cell.getCellFormula() + "";break;case HSSFCell.CELL_TYPE_BLANK: // 空值value = "";break;case HSSFCell.CELL_TYPE_ERROR: // 故障value = "非法字符";break;default:value = "未知类型";break;}}return value.trim();}}

2、工具类使用

 @ApiOperation(value = "资产中心-资产包-导出")@ApiResponse(code = 200, message = "返回结果")@RequestMapping(value = "/export", method = RequestMethod.POST)public void export(@RequestBody AssetPackageVersionSearchDto dto, HttpServletResponse response)throws IOException {if (dto.getProjectMainId() == null) {throw new LogicException(500, "项目id不能为空");}// 导出查询AssetPackageVersionResultDto resultDto = this.assetPackageClient.queryDetail(dto).getResult();// 获取枚举数据,进行枚举数据匹配Map<String, String> operateStatusMap = getOperateStatus();for (AssetUnitResultDto assetUnitResultDto : resultDto.getAssetUnitList()) {// 资产状态替换if (operateStatusMap.containsKey(assetUnitResultDto.getOperateStatus().toString())) {assetUnitResultDto.setOperateStatusName(operateStatusMap.get(assetUnitResultDto.getOperateStatus().toString()));}}try {String s1 = JSON.toJSONString(resultDto.getAssetPackageList());String s2 = JSON.toJSONString(resultDto.getAssetUnitList());// 资产包List<Map<String, Object>> assetPackageList = JSONObject.parseObject(s1, new TypeReference<List<Map<String,Object>>>() {});// 资产单元List<Map<String, Object>> assetUnitList = JSONObject.parseObject(s2, new TypeReference<List<Map<String,Object>>>() {});// 资产包字段名String[] assetPackageKey = {"assetPackageCode", "assetPackageName", "firstFormatName", "buildingArea","selfBuildingArea", "saleableBuildingArea", "matchingArea", "governmentRepurchaseArea","otherArea", "assetLocation", "remark"};// 资产包表格列头-顺序需要一致String[] assetPackageColumnName = {"资产包编码", "资产包名称", "汇总业态", "总建筑面积(㎡)","自持建筑面积(㎡)", "可售建筑面积(㎡)", "配套面积(㎡)", "政府回购面积(㎡)","其他面积(㎡)", "资产包坐落", "备注"};// 资产单元字段名String[] assetUnitKey = {"assetUnitName", "assetUnitCode", "buildingName", "assetPackageName","assetPackageCode", "operateStatusName", "firstFormatName", "buildingFormatName","secondFormatName","buildingArea", "selfBuildingArea", "saleableBuildingArea", "matchingArea","governmentRepurchaseArea", "otherArea", "remark"};// 资产单元表格列头-顺序需要一致String[] assetUnitColumnName = {"资产单元名称", "资产单元编码", "所属楼栋", "所属资产包名称","所属资产包编码", "资产状态", "汇总业态", "建筑业态", "营销业态", "总建筑面积(㎡)","自持建筑面积(㎡)", "可售建筑面积(㎡)", "配套面积(㎡)", "政府回购面积(㎡)","其他面积(㎡)", "备注"};// 导出HSSFWorkbook workbook = new HSSFWorkbook();ExcelDataHandleUtil.exportExcel(workbook, 0, "资产包", assetPackageList,assetPackageKey, assetPackageColumnName);ExcelDataHandleUtil.exportExcel(workbook, 1, "资产单元", assetUnitList,assetUnitKey, assetUnitColumnName);// 定义文件名称String fileName = "资产包数据导出" + DateUtils.dateTimeNow();OutputStream output = response.getOutputStream();response.reset();response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");String dlfileName = URLEncoder.encode(fileName, "utf-8").replaceAll("\\+", "%20");response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + dlfileName + ".xls");workbook.write(output);output.close();} catch (Exception e) {throw new LogicException(500, "导出失败,请重试!");}}/*** 获取资产状态** @return 数据*/public Map<String, String> getOperateStatus() {DicCodeVo dicCodeVo = DicCodeVo.init()// 资产状态.addDic("assetPackageOperateStatus", DictPathConstant.ASSET_PACKAGE_OPERATE_STATUS);Map<String, String> map = Maps.newHashMap();dicCodeVo.getDic().entrySet().forEach(d -> {// 资产状态if ("assetPackageOperateStatus".equals(d.getKey())) {d.getValue().getChildren().forEach(v -> {map.put(v.getValue(), v.getName());});}});return map;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/820332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统(第五周 第一二堂总结)

目录 回顾 前景知识 概述 定义 进程和线程的关系 进程和线程的区别 线程优缺点 优点&#xff1a; 缺点&#xff1a; 易混概念 线程实现方式 线程的类型&#xff1a; ​编辑 多线程模型&#xff1a; 线程函数 头文件&#xff1a; 线程创建函数&#xff1a; 线…

【团体程序设计天梯赛 往年关键真题 详细分析完整AC代码】L2-003 月饼(贪心) L2-004 这是二叉搜索树吗? (数据结构)

L2-003 月饼 贪心 月饼是中国人在中秋佳节时吃的一种传统食品&#xff0c;不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量&#xff0c;请你计算可以获得的最大收益是多少。 注意&#xff1a;销售时允许取出一部分库存。样例给出的…

vscode i18n Ally插件配置项

.vscode文件&#xff1a; {"i18n-ally.localesPaths": ["src/lang"], //显示语言&#xff0c; 这里也可以设置显示英文为en,// 如下须要手动配置"i18n-ally.keystyle": "nested", // 翻译路径格式 (翻译后变量格式 nested&#xff1a…

氟化钡与盐酸反应不

结论&#xff1a;反应 氟化钡 名称   中文名称&#xff1a;氟化钡   英文别名&#xff1a;Bariumfluoride 化学式   BaF2 相对分子质量   175.32 性状   无色透明立方结晶或白色粉末。溶于盐酸、硝酸、氢氟酸和氯化铵溶液&#xff0c;微溶于水。 相对密度4.83。 熔…

MongoDB 使用

1 引用依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>2 配置文件配置mongodb资料 # MongoDB连接信息 spring.data.mongodb.host 192.168.23.…

C#中的this关键字:详解与使用

在C#编程中&#xff0c;类和对象是构建应用程序的基础。面向对象编程的核心是封装、继承和多态。在类的内部&#xff0c;我们定义了成员变量和成员方法&#xff0c;这些成员变量和方法构成了对象的状态和行为。然而&#xff0c;在类的成员方法中&#xff0c;我们经常需要访问对…

(二)使用VS2022克隆下载C++自制植物大战僵尸游戏教程

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/uzrnw 本文将介绍如何使用VS2022克隆下载《植物大战僵尸C自制版本》。 Gitee项目地址&#xff1a; Gitee仓库地址https://gitee.com/GITLZ/PlantsVsZombies Github项目地址&#xff1a; Github仓库地址https://github…

linux运行node项目

文章目录 1、安装node2、安装forever node的守护进程3、forever操作3.1 启动相关3.2 停止操纵3.3 重启操作 1、安装node 下载node包&#xff0c;wget node链接进行解压增加配置文件 export PATH$PATH:node解压路径刷新配置文件node -v 查看node版本 2、安装forever node的守护…

我这10年的“搞站”路

我叫老牛&#xff0c;是高中室友给起的&#xff0c;原因很简单&#xff0c;我在8人寝室年龄排第六&#xff0c;四川话“老6”和“老牛”读音相仿。 后来我就把我的qq昵称改成了“L.N.”&#xff0c;我接受了这个称呼&#xff0c;因为自我审视&#xff0c;性格的确有执拗的一面&…

【JS】querySelectorAll和getElementsByClassName

现有一段代码&#xff0c;li的类名均为item&#xff0c;有一按钮可动态添加类名为item的li。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge…

【C++从练气到飞升】07---内存管理

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 一、 C/C内存分布 二、 C语言中动态内存管理方式 三、 C中动态内存管理 1. new/delete操作内置类型 2. new和delete操作…

Mongodb入门--头歌实验MongoDB 实验——数据备份和恢复

在实际的应用场景中&#xff0c;经常需要对业务数据进行备份以做容灾准备&#xff0c; MongoDB 提供了备份和恢复的功能&#xff0c;分别是 MongoDB 下的 一、数据备份 任务描述 本关任务&#xff1a;按照编程要求备份数据库。 相关知识 为了完成本关任务&#xff0c;你需要掌…

前端二维码工具小程序:营销裂变的好助手

一、摘要 在数字化营销日益盛行的今天&#xff0c;如何以新颖、高效的方式吸引用户&#xff0c;成为了每一个营销者所追求的目标。前端二维码工具小程序&#xff0c;作为一款集二维码生成、AI助手与绘图画画功能于一体的综合性工具&#xff0c;不仅为营销人员提供了全新的思路…

微服务架构核心组件介绍

微服务架构是一种设计方法&#xff0c;它将应用程序分解为一组小型、松散耦合的服务。每个服务运行在自己的进程中&#xff0c;并通常围绕业务能力组织。这种架构风格使得服务可以独立地部署、扩展和维护。在微服务架构中&#xff0c;有几个核心组件是至关重要的&#xff0c;它…

android 修改kernel编译版本信息

1&#xff0c;android版本&#xff1a; 在android/build/core/version_defaults.mk中红色部分 ifeq "" "$(BUILD_NUMBER)" # BUILD_NUMBER should be set to the source control value that # represents the current state of the source code. E.g…

0101tomcat部署war访问mysql失败-容器间通信-docker项目部署

文章目录 一、简介二、部署1、mysql数据迁移2、docker部署redis3、docker部署tomcat并运行war包 三、报错四、解决1 分析2 解决 结语 一、简介 最近参与开发一个项目&#xff0c;其中一部分系统需要迁移。从阿里云迁移到实体服务器&#xff0c;使用docker部署。系统使用Java语…

openssl密钥证书管理(Key and Certificate Management)

前言 前两日应别人要求提供一份CSR文件过去&#xff0c;方便他们生成相关证书&#xff0c;对于这一块本来也不熟&#xff0c;于是找到openssl官网&#xff0c;想找找相关的教程看看&#xff0c;一番小找&#xff0c;果有收获&#xff0c;是个宝藏&#xff0c;源文档在这…

项目管理-Jiar Software

Jira Software是澳大利亚公司Atlassian出品的一款项目与事务跟踪工具&#xff0c;被广泛应用于需求管理、项目追踪、任务追踪、缺陷追踪、流程审批、敏捷项目管理等软件研发领域。它不仅是一个强大的项目管理工具&#xff0c;还是一个适用于各种类型用例的工作管理工具。 在项…

Mysql-模糊匹配度排序分页

Mysql-模糊匹配度排序分页 抛出问题 在使用模糊匹配分页的时候想根据匹配度高进行排序应该如何实现呢&#xff1f; 上面是添加的模拟数据&#xff0c;根据匹配度高的情况下张三的优先级肯定是最高的&#xff0c;首先直接使用模糊搜索分页看看效果吧。 很明显的可以看到&#…

【解决】Spring Boot创建项目常见问题

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;Spring学习之路&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 idea无maven选项 无效发行版17 类⽂件具有错误的版本 61.0, 应为 …