Excel文件导入导出操作

article/2025/9/9 7:31:30
> 注意!注意!!注意!!! 文末有惊喜彩蛋,请注意查收!

日常开发工作中对于文件的相关操作大家多少都会涉及:上传解析、数据导出等。此篇内容主要分享一下工作中常用的Excel文件的解析和导出工作类实现。

实践

1.maven依赖

首先引入POI包依赖

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version>
</dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version>
</dependency>

2.API

大家需要了解一下相关的API类,便于后面理解代码逻辑和排查问题,重写相关逻辑实现自己的业务需求。

  1.import org.apache.poi.ss.usermodel.Workbook,对应Excel文档;2.import org.apache.poi.hssf.usermodel.HSSFWorkbook,对应xls格式的Excel文档;3.import org.apache.poi.xssf.usermodel.XSSFWorkbook,对应xlsx格式的Excel文档;4.import org.apache.poi.ss.usermodel.Sheet,对应Excel文档中的一个sheet;5.import org.apache.poi.ss.usermodel.Row,对应一个sheet中的一行;6.import org.apache.poi.ss.usermodel.Cell,对应一个单元格。

3.导入

public class ImportExcelUtil {private static final String EXCEL_XLS_SUFFIX = ".xls";private static final String EXCEL_XLSX_SUFFIX = ".xlsx";/*** 读取Excel数据内容** @param rowIndex    指定行号* @param columnIndex 指定列号* @return Map 包含单元格数据内容的Map对象*/public static List<Map<Integer, Object>> readExcelContent(String filepath, Integer rowIndex, Integer columnIndex) throws Exception {List<Map<Integer, Object>> returnList = new LinkedList<>();Workbook wb = null;Sheet sheet;Row row;try {InputStream is = new FileInputStream(filepath);if (filepath.endsWith(EXCEL_XLS_SUFFIX)) {wb = new HSSFWorkbook(is);} else if (filepath.endsWith(EXCEL_XLSX_SUFFIX)) {wb = new XSSFWorkbook(is);}if (wb == null) {throw new Exception("Workbook对象为空!");}sheet = wb.getSheetAt(0);//解析文件总行数、总列数int rowNum = rowIndex != null ? rowIndex : sheet.getLastRowNum();row = sheet.getRow(0);int colNum = columnIndex != null ? columnIndex : row.getLastCellNum();//循环列for (int colIndex = colNum; colIndex > 0; colIndex--) {Cell cell = row.getCell(colIndex);if (cell != null && !"".equals(cell.toString())) {colNum = colIndex;break;}}logger.info("have data col:{}", colNum);// 正文内容应该从第二行开始,第一行为表头的标题for (int i = 0; i <= rowNum; i++) {row = sheet.getRow(i);int j = 0;int size = (int) (colNum / .75f) + 1;//存储单元格数据Map<Integer, Object> cellValue = new LinkedHashMap<>(size);if (row == null) {continue;}while (j <= colNum) {Cell cell = row.getCell(j);String value = "";//日期单元格需格式化日期if (cell != null) {if (cell.getCellType() == CellType.NUMERIC) {if (HSSFDateUtil.isCellDateFormatted(cell)) {Date d = cell.getDateCellValue();SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");value = formatter.format(d);} else if (cell.toString().contains("E")) {DecimalFormat nf = new DecimalFormat("0");value = nf.format(cell.getNumericCellValue());} else {value = cell.toString().endsWith(".0") ? cell.toString().replace(".0", "") : cell.toString().trim();}} else if (cell.getCellType() == CellType.FORMULA) {value = String.valueOf(cell.getNumericCellValue());} else {value = cell.toString().trim();}}cellValue.put(j, value);j++;}returnList.add(cellValueMap);}wb.close();} catch (FileNotFoundException e) {logger.error("FileNotFoundException", e);} catch (IOException e) {logger.error("IOException", e);} finally {if (wb != null) {wb.close();}}return returnList;}}

** 解释: **
此处方法只是提供一个思路,后期大家可以根据自己的业务需求改写,比如指定sheet,行号,列号等等。着重说明一下返回值数据结构List,主要存储结构为Map,key=列号,value=单元格内容;这种操作便于后期验证必须列是否缺失、以及可以动态设计上传文件的列结构不必固定列位置等等。

4.导出


public class ExportExcelUtil {/*** 导出excel文件,表头为一维数组表示不用合并单元格* @param sheetName* @param excelTitle* @param dataCollection* @param <T>* @return*/public static<T> HSSFWorkbook exportExcel(String sheetName, String[] excelTitle, Collection<T> dataCollection) {//创建一个Excel文件HSSFWorkbook workbook = new HSSFWorkbook();//创建一个Sheet表格工作空间HSSFSheet sheet = workbook.createSheet(sheetName);HSSFCellStyle style = workbook.createCellStyle();//设置表格默认宽度sheet.setDefaultColumnWidth(20);//设置表格的表头HSSFCell cellHeader;HSSFRow row = sheet.createRow(0);for (int i = 0; i < excelTitle.length; i++) {//创建单元格表头cellHeader = row.createCell(i);cellHeader.setCellValue(new HSSFRichTextString(excelTitle[i]));}//匹配表头设置单元格的值setWorkBookValue(sheet, dataCollection,0, style);return workbook;}/*** (根据自定义)把具体数据写入到excel中* @param sheet* @param dataCollection* @param index* @param style* @param <T>*/@SuppressWarnings("unchecked")private static<T> void setWorkBookValue(HSSFSheet sheet,Collection<T> dataCollection, int index,HSSFCellStyle style){T t;Object[] fields;String fieldName;String getMethodName;HSSFCell cell;HSSFRow row;Class tClass;Method getMethod;Object value;//遍历集合设置单元格值Iterator<T> it = dataCollection.iterator();while(it.hasNext()){//创建一行单元格index ++;row = sheet.createRow(index);//获取数据t = it.next();//利用反射,根据JavaBean属性的先后顺序,动态调用getXxx()方法得到属性值fields = t.getClass().getDeclaredFields();for(int i = 0; i < fields.length; i++){cell = row.createCell(i);style.setAlignment(HorizontalAlignment.LEFT);cell.setCellStyle(style);//利用反射,根据JavaBean属性的先后顺序,动态调用getXxx()方法得到属性值Field[] newFields = t.getClass().getDeclaredFields();fieldName = newFields[i].getName();getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);try {tClass = t.getClass();getMethod = tClass.getMethod(getMethodName, new Class[]{});value = getMethod.invoke(t, new Object[]{});setCellValue(value,cell);} catch (Exception e) {e.printStackTrace();}}}}
/*** value格式校验*/private static void setCellValue(Object value,HSSFCell cell){SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String textValue = null;Pattern pattern = Pattern.compile(RULE);Matcher matcher;HSSFRichTextString richTextString;if (!StringUtils.isEmpty(value)){//value进行类型转换if (value instanceof Integer) {cell.setCellValue((Integer) value);} else if (value instanceof Float) {textValue = String.valueOf(value);cell.setCellValue(textValue);} else if (value instanceof Double) {textValue = String.valueOf(value);cell.setCellValue(textValue);} else if (value instanceof Long) {cell.setCellValue((Long) value);} else if (value instanceof Boolean) {textValue = "是";if (!(Boolean) value) {textValue = "否";}} else if (value instanceof Date) {textValue = sdf.format((Date) value);} else {// 其它数据类型都当作字符串简单处理textValue = value.toString();}if (textValue != null) {matcher = pattern.matcher(textValue);if (matcher.matches()) {// 是数字当作double处理cell.setCellValue(Double.parseDouble(textValue));} else {richTextString = new HSSFRichTextString(textValue);cell.setCellValue(richTextString);}}}}/*** excel 导出文件* @param response* @param workbook* @param fileName* @throws IOException*/public static void exportExcelFile(HttpServletResponse response, HSSFWorkbook workbook, String fileName) throws IOException {if (workbook != null) {response.reset();//指定下载的文件名SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");String filePrefix = sdf.format(new Date());response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");fileName = URLEncoder.encode(filePrefix + "_" + fileName, "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");response.addHeader("Access-Control-Allow-Origin", "*");response.setHeader("Access-Control-Expose-Headers", "*");BufferedOutputStream bufferedOutput = null;try {bufferedOutput = new BufferedOutputStream(response.getOutputStream());workbook.write(bufferedOutput);bufferedOutput.flush();} catch (IOException e) {e.printStackTrace();throw e;} finally {if (bufferedOutput != null) {try {bufferedOutput.close();} catch (IOException e) {e.printStackTrace();}}}}}
}

外部访问导出文件示例:

public void exportFile(String objectJson, HttpServletResponse response) throws Exception {....//省略业务代码HSSFWorkbook workbook = ExportExcelUtil.exportExcel(SHEET_NAME, TITLE_LINE, xxxList);ExportExcelUtil.exportExcelFile(response, workbook, FILE_NAME);}

特殊说明:导出操作实际上利用反射机制实现,则需保证Excel标题列顺序需与导出定义的实体对象属性顺序保持一致,否则会出现错位现象。

整理的这份超全Java面试题包含: Java基础、Java异常、Spring、SpirngMVC、MyBatis、SpringBoot、SpringCloud、BIO、NIO、AIO、Netty、Tomcat、Redis、MySQL、Memcache、ElasticSearch、zookeeper、RabbitMQ、Vue、Dubbo、并发编程、Java虚拟机、TCP、Http、大数据、设计模式、Linux等

公众号Java专栏,后台回复【面试题66】。即可获取!
或者点击下方超链接:
史上最全Java面试题,41个方向!一网打尽!
在这里插入图片描述


http://chatgpt.dhexx.cn/article/6f0TLuSE.shtml

相关文章

Java实现Excel导入导出

一、导入 前言&#xff1a;导入必须用post请求 具体原因在2中叙述 1、Excel导入 总结一下目标&#xff0c;就是要将excel中的数据行、逐一提取&#xff0c;最后得到一个list&#xff0c;这个list的每个元素就是excel的每个数据行的实例&#xff0c;之后的操作就是常规的jav…

Java实现Excel导入

实现前准备&#xff08;导入所需要的依赖&#xff09; <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.22</version></dependency><dependency><groupId>org.apache.…

导入Excel文件的方法

我们在做一些项目的时候通常会遇到有导入文件的这种需求&#xff0c;下面我给大家分享一下导入Excel文件的方法。 首先我们得准备一个模板&#xff0c;下图就是一个简单的EX导入模板&#xff0c; 下图就是一个导入模板&#xff0c; 我们先把导入模板写好&#xff0c; 还有一个…

两种方式导入excel

第一种 easyExcel pom文件导入 com.alibaba easyexcel 2.2.3 然后 /** * 导入用户excel * param * return */ PostMapping(“manage/imporAcc”) Message<?> imporAcc(RequestParam(“accountFile”) MultipartFile file,RequestParam(“role”)String role,Request…

Java实现Excel导入和导出,看这一篇就够了(珍藏版)

目录 目录 前言 1. 功能测试 1.1 测试准备 1.2 数据导入 1.2.1 导入解析为JSON 1.2.2 导入解析为对象&#xff08;基础&#xff09; 1.2.3 导入解析为对象&#xff08;字段自动映射&#xff09; 1.2.4 导入解析为对象&#xff08;获取行号&#xff09; 1.2.5 导入解析…

常见机器学习面试题

参考&#xff1a;http://kubicode.me/2015/08/16/Machine%20Learning/Common-Interview/?fromsinglemessage# http://blog.csdn.NET/heyongluoyao8/article/details/49429629 http://lib.csdn.Net/article/machinelearning/33798 http://www.cnblogs.com/zuochongyan/p/540705…

机器学习面试题60~100

61.说说梯度下降法 LeftNotEasy&#xff0c;本题解析来源&#xff1a;http://www.cnblogs.com/LeftNotEasy/archive/2010/12/05/mathmatic_in_machine_learning_1_regression_and_gradient_descent.html 下面是一个典型的机器学习的过程&#xff0c;首先给出一个输入数据&#…

深度学习机器学习面试题汇——模型优化,轻量化,模型压缩

深度学习机器学习面试题汇——模型优化&#xff0c;轻量化&#xff0c;模型压缩 提示&#xff1a;互联网大厂可能考的面试题 若CNN网络很庞大&#xff0c;在手机上运行效率不高&#xff0c;对应模型压缩方法有了解吗 介绍一下模型压缩常用的方法&#xff1f;为什么用知识蒸馏&…

Python干货:破解40大机器学习面试题(包含初中高级)

机器学习&#xff08;ML&#xff09;是我们世界的未来。在未来的几年中&#xff0c;几乎每种产品都将包含ML组件。ML预计将从2020年的$ 7.3B增长到2024年的$ 30.6B。对ML技能的需求遍及整个行业。 机器学习面试是一个严格的过程&#xff0c;在此过程中&#xff0c;应聘者会评估…

2021机器学习面试必考面试题汇总(附答案详解)

问题&#xff1a;Xgboost、lightGBM和Catboost之间的异同&#xff1f; 树的特征 三种算法基学习器都是决策树&#xff0c;但是树的特征以及生成的过程仍然有很多不同。 CatBoost使用对称树&#xff0c;其节点可以是镜像的。CatBoost基于的树模型其实都是完全二叉树。 XGBoo…

机器学习面试题之——简单介绍最小二乘

1、常用到的最小二乘场合&#xff1a;最小二乘法直线拟合&#xff0c;最小二乘法多项式&#xff08;曲线&#xff09;拟合&#xff0c;机器学习中线性回归的最小二乘法&#xff0c;系统辨识中的最小二乘辨识法&#xff0c;参数估计中的最小二乘法&#xff0c;等等。 2、为什么…

AI人工智能、机器学习 面试题(2022最新版)

人工智能、机器学习面试题总结&#xff0c;侧重于理解&#xff0c;回答供参考&#xff0c;欢迎讨论。 General 深度学习&#xff08;Deep Learning, DL&#xff09;和机器学习&#xff08;Machine Learning, ML&#xff09;的关系是什么&#xff1f; 深度学习是机器学习的子类…

面试官最爱用的统计学、数据科学、机器学习面试题答案

【导读】本文盘点了数据科学和机器学习面试中的常见问题&#xff0c;着眼于不同类型的面试问题。如果您计划向数据科学领域转行&#xff0c;这些问题一定会有所帮助。 技术的不断进步使得数据和信息的产生速度今非昔比&#xff0c;并且呈现出继续增长的趋势。此外&#xff0c;…

41个机器学习面试题

####41 Essential Machine Learning Interview Questions (with answers) <font color‘orange’&#xff0c;size5>一、算法理论 Q1: 什么是偏倚&#xff08;bias&#xff09;、方差&#xff08;variable&#xff09;均衡&#xff1f; 偏倚指的是模型预测值与真实值的…

推荐收藏,25道机器学习面试问题(附答案)

近年来&#xff0c;对深度学习的需求不断增长&#xff0c;其应用程序被应用于各个商业部门。各公司现在都在寻找能够利用深度学习和机器学习技术的专业人士。 在本文中&#xff0c;将整理深度学习面试中最常被问到的25个问题和答案。如果你最近正在参加深度学习相关的面试工作…

机器学习面试题之机器学习基础(一)

1、L1与L2正则化 他们都是可以防止过拟合&#xff0c;降低模型复杂度。 L1会趋向于产生少量的特征&#xff0c;而其他的特征都是0&#xff1b;L2会选择更多的特征&#xff0c;这些特征都会接近于0。L1在特征选择时非常有用&#xff0c;L2就只是一种规则化而已。 简单总结一下就…

机器学习面试必考面试题汇总—附解析

问题&#xff1a;xgboost对特征缺失敏感吗&#xff0c;对缺失值做了什么操作&#xff0c;存在什么问题 不敏感&#xff0c;可以自动处理&#xff0c;处理方式是将missing值分别加入左节点 右节点取分裂增益最大的节点将missing样本分裂进这个节点 。这种处理方式的问题在xgboo…

机器学习面试题——聚类算法

机器学习面试题——聚类算法 提示&#xff1a;互联网大厂经常考的传统机器学习算法 文章目录 机器学习面试题——聚类算法[TOC](文章目录) 题目k-means介绍一下&#xff0c;K-means的过程k-means优缺点k-means的簇&#xff08;k簇&#xff09;怎么选&#xff0c;K-means如何选取…

机器学习面试题目整理

0 调参技巧 清洗数据&#xff0c;数据预处理&#xff0c;数据增广是否使用预训练模型使用BN在过拟合后&#xff0c;使用正则化技巧如L1、L2、Dropout对于不均匀样本&#xff0c;使用重采样使用合适的优化器。第一&#xff0c;如果你关心快速收敛&#xff0c;使用自适应优化器&…

面试 | 22道机器学习常见面试题目

(1) 无监督和有监督算法的区别&#xff1f; 有监督学习&#xff1a;对具有概念标记&#xff08;分类&#xff09;的训练样本进行学习&#xff0c;以尽可能对训练样本集外的数据进行标记&#xff08;分类&#xff09;预测。这里&#xff0c;所有的标记&#xff08;分类&#xf…