POI 导入导出工具类

Excel导入导出poi工具类的代码及使用教程(JAVA版) 本文详细介绍使用 java 操作 poi 实现Excel导入导出,兼容Excel2003及Excel2007以上的版本,如有疑问欢迎评论留言.所需要的资料,点击资料链接(提取码: )自行下载.操作简单,建议在SpringBoot、maven项目下引入使用,具体步骤如下, 一:在项目pom文件中引入poi的相关的3个依赖 二:把资料中的3+1个java文件复制到项目的utils包下 注意:1,E... 阅读详情

工具类:

package com.jxc.common.utils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

public class ExcelUtils {
    private final static String excel2003L =".xls";    //2003- 版本的excel
    private final static String excel2007U =".xlsx";   //2007+ 版本的excel  
    /*************************************文件上传****************************/
    public static  List<List<Object>> getBankListByExcel(InputStream in, String fileName) throws Exception{
        List<List<Object>> list = null;
        //创建Excel工作薄  
        Workbook work = getWorkbook(in,fileName);
        if(null == work){  
            throw new Exception("创建Excel工作薄为空!");  
        }  
        Sheet sheet = null;
        Row row = null;
        Cell cell = null;
          
        list = new ArrayList<List<Object>>();
        //遍历Excel中所有的sheet  
        for (int i = 0; i < work.getNumberOfSheets(); i++) {  
            sheet = work.getSheetAt(i);  
            if(sheet==null){continue;}  
              
            //遍历当前sheet中的所有行  
            for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) {
                row = sheet.getRow(j);  
                if(row==null||row.getFirstCellNum()==j){continue;}  
                  
                //遍历所有的列  
                List<Object> li = new ArrayList<Object>();  
                for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {  
                    cell = row.getCell(y);  
                    li.add(getCellValue(cell));  
                }  
                list.add(li);  
            }  
        }  
//        work.close();  
        return list;  
    }  
      
    /** 
     * 描述:根据文件后缀,自适应上传文件的版本  
     * @param inStr,fileName 
     * @return 
     * @throws Exception 
     */  
    public static  Workbook getWorkbook(InputStream inStr,String fileName) throws Exception{  
        Workbook wb = null;  
        String fileType = fileName.substring(fileName.lastIndexOf("."));  
        if(excel2003L.equals(fileType)){  
            wb = new HSSFWorkbook(inStr);  //2003-
        }else if(excel2007U.equals(fileType)){  
            wb = new XSSFWorkbook(inStr);  //2007+
        }else{  
            throw new Exception("解析的文件格式有误!");  
        }  
        return wb;  
    }  
  
    /** 
     * 描述:对表格中数值进行格式化 
     * @param cell 
     * @return 
     */  
    public static  Object getCellValue(Cell cell){  
        Object value = null;  
        DecimalFormat df = new DecimalFormat("0");  //格式化number String字符
        SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd");  //日期格式化
        DecimalFormat df2 = new DecimalFormat("0.00");  //格式化数字  
          
        switch (cell.getCellType()) {  
        case Cell.CELL_TYPE_STRING:  
            value = cell.getRichStringCellValue().getString();  
            break;  
        case Cell.CELL_TYPE_NUMERIC:  
            if("General".equals(cell.getCellStyle().getDataFormatString())){  
                value = df.format(cell.getNumericCellValue());  
            }else if("m/d/yy".equals(cell.getCellStyle().getDataFormatString())){  
                value = sdf.format(cell.getDateCellValue());  
            }else{  
                value = df2.format(cell.getNumericCellValue());  
            }  
            break;  
        case Cell.CELL_TYPE_BOOLEAN:  
            value = cell.getBooleanCellValue();  
            break;  
        case Cell.CELL_TYPE_BLANK:  
            value = "";  
            break;  
        default:  
            break;  
        }  
        return value;  
    }  
    /****************************************上传结束***************************************
	/**
	     * 多列头创建EXCEL
	     * 
	     * @param sheetName 工作簿名称
	     * @param clazz  数据源model类型
	     * @param objs   excel标题列以及对应model字段名 从数据库查询出来的数据
	     * @param map  标题列行数以及cell字体样式
	     * @return
	     * @throws IllegalArgumentException
	     * @throws IllegalAccessException
	     * @throws InvocationTargetException
	     * @throws ClassNotFoundException
	     * @throws IntrospectionException
	     * @throws ParseException
	     */
	public static XSSFWorkbook createExcelFile(Class clazz, List objs, Map<Integer, List<ExcelBean>> map, String sheetName) throws IllegalArgumentException,IllegalAccessException,
            InvocationTargetException, ClassNotFoundException, IntrospectionException, ParseException {
	        // 创建新的Excel 工作簿
	        XSSFWorkbook workbook = new XSSFWorkbook();
	        // 在Excel工作簿中建一工作表,其名为缺省值, 也可以指定Sheet名称
	        XSSFSheet sheet = workbook.createSheet(sheetName);
	        // 以下为excel的字体样式以及excel的标题与内容的创建,下面会具体分析;
	        createFont(workbook);//字体样式
	        createTableHeader(sheet, map);//创建标题(头)
	        createTableRows(sheet, map, objs, clazz);//创建内容
	        return workbook;
	    }
	private static XSSFCellStyle fontStyle;
	private static XSSFCellStyle fontStyle2;
	public static void createFont(XSSFWorkbook workbook) {
        // 表头
		fontStyle = workbook.createCellStyle();
        XSSFFont font1 = workbook.createFont();
        font1.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
        font1.setFontName("黑体");
        font1.setFontHeightInPoints((short) 14);// 设置字体大小
        fontStyle.setFont(font1);
        fontStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); // 下边框
        fontStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);// 左边框
        fontStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);// 上边框
        fontStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);// 右边框
        fontStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 居中

        // 内容
        fontStyle2=workbook.createCellStyle();
		XSSFFont font2 = workbook.createFont();
		font2.setFontName("宋体");
		font2.setFontHeightInPoints((short) 10);// 设置字体大小
		fontStyle2.setFont(font2);     
		fontStyle2.setBorderBottom(XSSFCellStyle.BORDER_THIN); // 下边框
        fontStyle2.setBorderLeft(XSSFCellStyle.BORDER_THIN);// 左边框
        fontStyle2.setBorderTop(XSSFCellStyle.BORDER_THIN);// 上边框
        fontStyle2.setBorderRight(XSSFCellStyle.BORDER_THIN);// 右边框
        fontStyle2.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 居中
	}
	
	/**
     * 根据ExcelMapping 生成列头(多行列头)
     * 
     * @param sheet
     *            工作簿
     * @param map
     *            每行每个单元格对应的列头信息
     */
    public static final void createTableHeader(XSSFSheet sheet, Map<Integer, List<ExcelBean>> map) {
        int startIndex=0;//cell起始位置
        int endIndex=0;//cell终止位置

        for (Map.Entry<Integer, List<ExcelBean>> entry : map.entrySet()) {
            XSSFRow row = sheet.createRow(entry.getKey());
            List<ExcelBean> excels = entry.getValue();
            for (int x = 0; x < excels.size(); x++) {
                //合并单元格
                if(excels.get(x).getCols()>1){
                    if(x==0){                                     
                    	endIndex+=excels.get(x).getCols()-1;
                        CellRangeAddress range=new CellRangeAddress(0,0,startIndex,endIndex);
                        sheet.addMergedRegion(range);
                        startIndex+=excels.get(x).getCols();
                    }else{
                        endIndex+=excels.get(x).getCols();
                        CellRangeAddress range=new CellRangeAddress(0,0,startIndex,endIndex);
                        sheet.addMergedRegion(range);
                        startIndex+=excels.get(x).getCols();
                    }
                    XSSFCell cell = row.createCell(startIndex-excels.get(x).getCols());
                    cell.setCellValue(excels.get(x).getHeadTextName());// 设置内容
                    if (excels.get(x).getCellStyle() != null) {
                        cell.setCellStyle(excels.get(x).getCellStyle());// 设置格式
                    }
                    cell.setCellStyle(fontStyle);
                }else{

                    XSSFCell cell = row.createCell(x);
                    cell.setCellValue(excels.get(x).getHeadTextName());// 设置内容
                    if (excels.get(x).getCellStyle() != null) {
                        cell.setCellStyle(excels.get(x).getCellStyle());// 设置格式
                    }
                    cell.setCellStyle(fontStyle);
                }

            }
        }
    }
	
	/**
     * 
     * @param sheet
     * @param map
     * @param objs
     * @param clazz
     */
    @SuppressWarnings("rawtypes")
    public static void createTableRows(XSSFSheet sheet, Map<Integer, List<ExcelBean>> map, List objs, Class clazz)
            throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, IntrospectionException,
            ClassNotFoundException, ParseException {

        int rowindex = map.size();
        int maxKey = 0;
        List<ExcelBean> ems = new ArrayList<ExcelBean>();
        for (Map.Entry<Integer, List<ExcelBean>> entry : map.entrySet()) {
            if (entry.getKey() > maxKey) {
                maxKey = entry.getKey();
            }
        }
        ems = map.get(maxKey);

        List<Integer> widths = new ArrayList<Integer>(ems.size());
        for (Object obj : objs) {
            XSSFRow row = sheet.createRow(rowindex);
            for (int i = 0; i < ems.size(); i++) {
                ExcelBean em = (ExcelBean) ems.get(i);
              // 获得get方法
                PropertyDescriptor pd = new PropertyDescriptor(em.getPropertyName(), clazz);
                Method getMethod = pd.getReadMethod();
                Object rtn = getMethod.invoke(obj);
                String value = "";
                // 如果是日期类型 进行 转换
                if (rtn != null) {
                    if (rtn instanceof Date) {
                        value = DateFormatUtils.format((Date) rtn,"yyyy-MM-dd");
                    } else if(rtn instanceof BigDecimal){
                    	NumberFormat nf = new DecimalFormat("#,##0.00");
                    	value=nf.format((BigDecimal)rtn).toString();
                    } else if((rtn instanceof Integer) && (Integer.valueOf(rtn.toString())<0 )){
                    	value="--";
                    }else {
                        value = rtn.toString();
                    }
                }
                XSSFCell cell = row.createCell(i);
                cell.setCellValue(value);
                cell.setCellType(XSSFCell.CELL_TYPE_STRING);
                cell.setCellStyle(fontStyle2);
                // 获得最大列宽
                int width = value.getBytes().length * 300;
                // 还未设置,设置当前
                if (widths.size() <= i) {
                    widths.add(width);
                    continue;
                }
                // 比原来大,更新数据
                if (width > widths.get(i)) {
                    widths.set(i, width);
                }
            }
            rowindex++;
        }
        // 设置列宽
        for (int index = 0; index < widths.size(); index++) {
            Integer width = widths.get(index);
            width = width < 2500 ? 2500 : width + 300;
            width = width > 10000 ? 10000 + 300 : width + 300;
            sheet.setColumnWidth(index, width);
        }
    }
}

excel对象:

package com.jxc.common.utils;
import lombok.Getter;
import lombok.Setter;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;

/**
 * 
 * @Description: 导入导出excel
 */
@Getter
@Setter
public class ExcelBean implements java.io.Serializable {
    private String headTextName;//列头(标题)名
     private String propertyName;//对应字段名
     private Integer cols;//合并单元格数
     private XSSFCellStyle cellStyle;//2007 excel
     
     public ExcelBean(){

     }
     public ExcelBean(String headTextName, String propertyName){
    	 this.headTextName = headTextName;
         this.propertyName = propertyName;
     }
     public ExcelBean(String headTextName, String propertyName, Integer cols) {
         super();
         this.headTextName = headTextName;
         this.propertyName = propertyName;
         this.cols = cols;
     }

}
poi导入导出(导出一个或者多个excel)excel工具类 poi导入导出(导出一个或者多个excel)excel工具类 package com.gosun.order.management.common.utils; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.metadata.style.Writ 阅读详情

相关推荐

Apache POI工具类实现Excel导入导出.zip

Apache POI是一个开源的Java库,用于读取和写入Microsoft Office格式的文件,如Excel、Word、PowerPoint等。它为开发者提供了操作Microsoft Office文档的API,无需安装Office软件即可在Java应用程序中直接处理这些文档。Apache POI特别适合于需要处理Excel文件的场景,如数据导入、导出、报告生成等,它支持多种Excel文件格式,包括旧的.xls格式和较新的.xlsx格式。

weixin_31486261的博客 362

java中如何下载文件的接口,如何通过java代码将Excel文件的数据写入到数据库中

java中如何下载文件的接口,如何通过java代码将Excel文件的数据写入到数据库中java中下载文件的接口首先导包再写接口如何通过java代码将Excel文件的数据写入到数据库中第一步导包或者通过maven导包第二步 jsp页面第三步添加工具类第四步controller层第二步service层第五步serviceImpl层 java中下载文件的接口 首先导包 <dependency> <groupId>commons-io</groupId&g

weixin_46852039的博客 579

Java poi导入导出EXCEL工具类(兼容各版本)

概述:Java poi导入导出EXCEL工具类(兼容各版本) 一、功能说明 允许同时导入或导出多个sheet,同一sheet可同时存在多个数据块,按数据块划分处理数据。 二、配置文件示例及详细说明 1、导入xml配置示例如下(见src/main/resources/import-config.xml) 2、导出xml配置示例如下(见src/main/resources/export-config.xml) 三、调用示例 1、导入:src/test/java/com/reports/test/ExcelImportReportTest.java 2、导出:src/test/java/com/reports/test/ExcelExportReportTest.java 四、测试用例及数据 路径src/test/resources/

java 用边读边下载文件,可用于大数据excel下载

先记录下,然后再完善 excel可以用xml表示。故可以以此来实现边写边下载文件 package com.tydic.qop.controller; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.

nature_fly088的专栏 4700

Android T GPS 定位流程

Gps 定位

好记性不如烂笔头 1354

MuJoCo 仿真中的碰撞检测与参数优化实战

本文深入解析MuJoCo仿真中的碰撞检测机制与参数优化策略,涵盖位掩码配置、凸包分解实战及穿模问题解决方案。通过具体案例和参数设置建议,帮助开发者高效解决机械臂抖动、轴孔装配等常见问题,提升仿真精度与稳定性。特别针对步进电机仿真提供了高增益位置执行器的优化方案。

weixin_29081101的博客 332

Java后台实现Excel文件下载

Java实现下载excel依赖使用的是poi实现目的请求HSSFWorkbook方法setResponseHeader方法fypclXls方法实现整个下载过程 依赖 使用的是poi 开发中经常会设计到excel的处理,如导出Excel,导入Excel到数据库中,操作Excel目前有两个框架,一个是apache 的poi, 另一个是 Java Excel Apache POI 简介是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Offi

weixin_50419828的博客 1万+

从零开始搭建企业级安全扫描平台:基于Docker的Greenbone和ClamAV部署指南

本文提供了一份基于Docker容器技术,从零开始搭建企业级安全扫描平台的实战指南。详细介绍了如何部署和集成漏洞扫描工具Greenbone与病毒扫描工具ClamAV,涵盖架构设计、Docker环境优化、容器化部署步骤以及平台集成与监控方案,帮助企业构建自动化、可扩展的安全防御核心组件。

delta的博客 752

java读取Excel里面的内容包括(xls和xlsx)后缀文件

java通过POI架包(HSSFWorkbook和XSSFWorkbook)读取Excel里面的内容包括(xls和xlsx)后缀文件 在我们平时的开发的过程,难免会遇到需要读取Excel文件,Excel文件又分为xls和xlsx文件,这篇文章通过POI中的HSSFWorkbook和XSSFWorkbook来读取Excel文件 POI版本的问题 poi-3.16.jar poi-examples-3...

Null1997的博客 1191

逆向拆解dy接口a_bogus 1.0.1.19版本核心算法(纯算版)第二部分

本文深入解析了dy接口a_bogus 1.0.1.19版本的核心算法,重点介绍了逆向分析的基础方法论、魔改Base64编码识别与还原、随机数生成与位运算解析等关键技术。通过详细的代码示例和实用技巧,帮助开发者掌握逆向工程中的关键步骤,特别是针对a_bogus参数的生成逻辑和混淆处理。

weixin_29288313的博客 406

空间节省算法在Rowhammer防御中的应用与优化

空间节省算法(Space-Saving)是一种高效的流式数据处理算法,主要用于在有限内存条件下实时识别数据流中的高频项。其核心原理是通过维护固定大小的计数器表,动态跟踪最活跃的元素,适用于处理无限数据流场景。该算法在内存安全领域具有重要价值,特别是在Rowhammer攻击防御中,能够有效检测异常高频访问的DRAM行地址。通过结合计数器衰减策略(如DSAC)和混合架构设计,空间节省算法可以在保证低硬件开销的同时,提供高精度的攻击检测能力。这些技术已成功应用于现代DDR5内存控制器,展现出优异的工程实践价值。

weixin_31139479的博客 606

poi导入导出工具类(超级实用,记得收藏)

poi导入导出工具类

qq_34091529的博客 2070

增量编码器资讯大全

增量编码器是什么 增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小,按照工作原理编码器可分为增量式和绝对式两类。 增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小。 编码器是把角位移或直线位移转换成电信号的一种装置。前者称为码盘,后者称码尺.按照读出方式编码器可以分为接触式和非接触式两种.接触式采...

kindele的博客 6008

Java poi 实现excel导入导出工具类

最近项目上又要大量的涉及excel导入导出,网上各种导入导出的方式层出不穷,我是比较青睐官方的poi,但是要自己去操作工作簿对象自己一行一行的读取,会有很多的重复代码,重复劳动,也极为不美观,基于合成/聚合复用程序设计原则,降低耦合,所以提出来基于poi写了这套工具类。以前也写过类似的工具类,由于项目进度问题,没写博客记录,导致这次用的时候找不到了(此处捂脸一分钟),于是痛定思痛,又封装了这一套,写完赶紧写个博客记录下,方便自己以后有需要时查阅,如得各位大佬享用,荣幸之至,所有方法已在项目中验证,可直接使用

百块富翁的博客 8647

Kotlin kapt插件报错全解析:从Could not load module到彻底解决(含Gradle 8.2.2适配指南)

本文深度解析了Kotlin开发中常见的kapt插件报错“Could not load module”的根源,并提供了从诊断到解决的完整方案。重点探讨了Gradle 8.2.2与Kotlin 1.9.x的兼容性问题,包括JVM IR后端冲突、配置缓存问题及依赖版本对齐,并给出了详细的调试技巧与迁移至KSP的建议。

rrr55的博客 314

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

POI导入导出工具类

导入POI依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> <...

男人要霸气的博客 1197

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java-Poi导入导出excel工具类

一、添加依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.6</version> </dependency> <dependency> ...

weixin_44407691的博客 650

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

POI导出导入Excel工具类(原来Excel导入导出这么简单)

POI导出/导入Excel工具类(原来Excel导入导出这么简单) 一.首先废话不多说,先导包 <!--POI相关坐标--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <vers...

weixin_45152583的博客 918

Java中使用POI导入导出工具类

依赖: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <dependency> ...

Coding Farmer的博客 1483

利用POI实现Excel导入导出工具类(包含样式)

说明:1、代码实现了将表格内容与Collection之间的转换,T代表对应的实体类。2、表格内容可以设置起始行和起始列,如需扩展可根据代码继续扩展。3、此文章参考了多篇文章,仅学习用。代码只是看着有点多,实际上不会很难,希望看完后对您有所帮助,同时也欢迎大家积极交流学习!

m0_74413652的博客 559

POI导入导出excel(附工具类)

关于POI导出excel的功能我在前面的文章已经写过了,POI导出excel的三种方式,导出表格数据到excel并下载(HSSFWorkbook版),本篇文章主要是将导入导出功能进一步地封装,在项目中使用工具类直接调用即可。下面是工具类的代码: pom依赖:      <dependency> <groupId>org.ap...

dd10850的博客 289

poi导入导出Excel文件完整实现 封装工具类

poi导入导出完整实现 包含工具类:https://blog.youkuaiyun.com/weixin_53233637/article/details/114369689

qq_42017395的博客 138
上一篇: 跨域工具类配置
下一篇: swagger实战使用
Carl God
博客等级 码龄7年 1908粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Carl God

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值