【java学习】excel读写_java读写excel-程序员宅基地

技术标签: java  java学习  

1,com.alibaba.easyexcel

1)Demo

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.1</version>
        </dependency>
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

public class ExcelListener extends AnalysisEventListener<ExcelData> {
    

    List<ExcelData> dataList = new ArrayList<>();
    @Override
    public void invoke(ExcelData excelData, AnalysisContext analysisContext) {
            
        dataList.add(networkExcelData);
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    
        System.out.println("读取完毕!");
    }

    public List<ExcelData> getDataList(){
    
        return  this.dataList;
    }
}
@Data
public class ExcelData {
    

    @ExcelProperty(value = "序号", index = 0)
    private String id;

    @ExcelProperty(value = "名称", index = 1)
    private String name;

    @ExcelProperty(value = "省份", index = 2)
    private String province;
}
        ExcelListener listener = new  ExcelListener();
        EasyExcel.read(EXCEL_PATH, ExcelData.class, listener).sheet(EXCEL_SHEET_NAME).doRead();
        List<ExcelData> dataList = listener.getDataList();

2)Apache POI如何获取Excel合并单元格的值

	/**
	 * 获取合并单元格的值
	 * @param sheet
	 * @param row
	 * @param column
	 * @return
	 */
	public String getMergedRegionValue(Sheet sheet ,int row , int column){
    
		int sheetMergeCount = sheet.getNumMergedRegions();
		
		for(int i = 0 ; i < sheetMergeCount ; i++){
    
			CellRangeAddress ca = sheet.getMergedRegion(i);
			int firstColumn = ca.getFirstColumn();
			int lastColumn = ca.getLastColumn();
			int firstRow = ca.getFirstRow();
			int lastRow = ca.getLastRow();
			
			if(row >= firstRow && row <= lastRow){
    
				
				if(column >= firstColumn && column <= lastColumn){
    
					Row fRow = sheet.getRow(firstRow);
					Cell fCell = fRow.getCell(firstColumn);
					
					return getCellValue(fCell) ;
				}
			}
		}
		
		return null ;
	}
	
	/**
	 * 判断指定的单元格是否是合并单元格
	 * @param sheet
	 * @param row
	 * @param column
	 * @return
	 */
	public boolean isMergedRegion(Sheet sheet , int row , int column){
    
		int sheetMergeCount = sheet.getNumMergedRegions();
		
		for(int i = 0 ; i < sheetMergeCount ; i++ ){
    
			CellRangeAddress ca = sheet.getMergedRegion(i);
			int firstColumn = ca.getFirstColumn();
			int lastColumn = ca.getLastColumn();
			int firstRow = ca.getFirstRow();
			int lastRow = ca.getLastRow();
			
			if(row >= firstRow && row <= lastRow){
    
				if(column >= firstColumn && column <= lastColumn){
    
					
					return true ;
				}
			}
		}
		
		return false ;
	}
	
	/**
	 * 获取单元格的值
	 * @param cell
	 * @return
	 */
	public String getCellValue(Cell cell){
    
		
		if(cell == null) return "";
		
		if(cell.getCellType() == Cell.CELL_TYPE_STRING){
    
			
			return cell.getStringCellValue();
			
		}else if(cell.getCellType() == Cell.CELL_TYPE_BOOLEAN){
    
			
			return String.valueOf(cell.getBooleanCellValue());
			
		}else if(cell.getCellType() == Cell.CELL_TYPE_FORMULA){
    
			
			return cell.getCellFormula() ;
			
		}else if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){
    
			
			return String.valueOf(cell.getNumericCellValue());
			
		}
		
		return "";
	}

2,org.apache.poi

1,poi读取文件的时候可能导致OOM

  1. excel文件其实非常大;
    xlsx是一个若干个XML格式的纯文本文件的压缩文件,Excel就是读取这些压缩文件最后展现一个完全图形的电子表格。可以修改后缀为.zip或.rar解压。
  2. XSSFWorkbook、HSSFWorkbook在处理excel过程中会将整个excel都加载到内存中;
  3. SXSSFWorkbook是流式处理,将数据写入临时文件,减少内存消耗,适合大型数据集处理。

2,使用

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.1</version>
        </dependency>
package com.trans;

import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ReadExcel {
    

    private File file;
    //k-colIndex Object-value
    private List<Map<Integer, Object>> valueMaps = new ArrayList<>();

    public ReadExcel(File file) {
    
        this.file = file;
    }
    public ReadExcel read(){
    
        try {
    
            FileInputStream inputStream = new FileInputStream(file);
            XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
            XSSFSheet xssfSheet = workbook.getSheetAt(0);
            //不获取表头数据
            for (int rowIndex=Constant.TABLE_NUM; rowIndex <= xssfSheet.getLastRowNum(); rowIndex++){
    
                getDataFromRow(xssfSheet.getRow(rowIndex));
            }
        }catch (Exception e){
    
            //文件错误
        }
        return this;
    }
    private void getDataFromRow(XSSFRow row){
    
        if (isRowEmpty(row)){
    
            return;
        }
        Map<Integer, Object> valueMap = new HashMap<>();
        for(int i=0; i<row.getLastCellNum(); i++) {
    
            if (!isCellEmpty(row.getCell(i))) {
    
                valueMap.put(i, getLabelCellValue(row.getCell(i)));
            }
        }
        valueMaps.add(valueMap);
    }

    private boolean isRowEmpty(XSSFRow row) {
    
        if (null == row) {
    
            return true;
        }
        for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) {
    
            XSSFCell cell = row.getCell(i);
            if (null != cell && cell.getCellTypeEnum() != CellType.BLANK) {
    
                return false;
            }
        }
        return true;
    }

    private boolean isCellEmpty(XSSFCell cell) {
    
        return null == cell || cell.toString().length() == 0;
    }

    public List<Map<Integer, Object>> getValueMaps() {
    
        return valueMaps;
    }

    private String getLabelCellValue(XSSFCell xssfCell) {
    
        String cellValue;
        if (null != xssfCell) {
    
            //判断cell类型
            if (xssfCell.getCellTypeEnum() == CellType.NUMERIC || xssfCell.getCellTypeEnum() == CellType.FORMULA) {
    
                if (new Double(xssfCell.getNumericCellValue()).intValue() == new Double(xssfCell.getNumericCellValue())) {
    
                    cellValue = String.valueOf(new Double(xssfCell.getNumericCellValue()).intValue());
                } else {
    
                    cellValue = xssfCell.getNumericCellValue().toString();
                }
            } else if (xssfCell.getCellTypeEnum() == CellType.BOOLEAN) {
    
                cellValue = String.valueOf(xssfCell.getBooleanCellValue());
            } else if (xssfCell.getCellTypeEnum() == CellType.STRING) {
    
                cellValue = xssfCell.getStringCellValue();
            } else {
    
                cellValue = xssfCell.toString();
            }

        } else {
    
            cellValue = "";
        }
        return cellValue.trim();
    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/SunshineTan/article/details/125974645

智能推荐

Android开发之仿微信显示更多文字的View_android 文字显示更多-程序员宅基地

文章浏览阅读2.1k次。最近开发需求中要模仿微信朋友圈文章的展开收起功能,网上找了找,发现都有问题,于是乎自己在前辈的基础上进行了一定量的修改,下边将源码贴出来供大家参考:1.主Activity布局文件就不粘贴了,很简单,就一个ListView.2.主Activity功能实现:package com.example.textviewdemo; import java.util.HashMap; import andr_android 文字显示更多

【转载南非蚂蚁】MYSQL企业常用架构与调优经验分享-程序员宅基地

文章浏览阅读63次。http://ixdba.blog.51cto.com/blog/2895551/1751377 好文章,防止以后找不到了,先转载一份过来。 转载于:https://blog.51cto.com/lee90/1757425

IntelliJ IDEA设置代码自动提示的快捷键_idea开启自动提示 快捷键-程序员宅基地

文章浏览阅读6k次,点赞8次,收藏6次。前言:使用 eclipse 都习惯使用快捷键ALT+/ 来代码自动提示,后来使用IntelliJ Idea这个快捷键并不管用,十分不便,这里记录如何使更改idea代码自动提示快捷键。打开Settings设置 [ 快捷键 Ctrl + Alt + S ]File ––> Settings ––> KeyMap进入快捷键设置界面。idea中默认的代码自动提示快捷键是Basic Ctrl + 空格(可以再搜索框中输入 basic快速查找),这个和安装的中文输入法切换快捷键冲突,所以需要修改._idea开启自动提示 快捷键

字符4串my_atoi_while (*psz != '\0' && *psz != 0x0d && *psz != 0x0-程序员宅基地

文章浏览阅读608次。//#include //#include //#include //int my_atoi(const char *psz);//int main()//{// char str[] = " -23j1";// int a = my_atoi(str);// printf("%d\n",a);// return 0;//}////int my__while (*psz != '\0' && *psz != 0x0d && *psz != 0x0a)

你不知道的Echarts柱状图应用在React中_react柱状图怎么给series赋值-程序员宅基地

文章浏览阅读943次。echarts 柱状图在React里面的运用:正常的echarts 都是竖直型的,或者一个里边包含多个的。 这次做个不同的, y轴为坐标,x轴为值,左右都为正数展开。(1)、引入相关的文件import React, { Compoent } from 'react';import { Spin } from 'antd';import echarts from 'echarts'..._react柱状图怎么给series赋值

随便推点

邮件群发,如何选择最好用的电子邮箱?_群发邮件邮箱评比-程序员宅基地

文章浏览阅读1.4k次。偶然看到有人在如何选择最适合、最好用的群发邮箱?恰巧最近我接触到了一款很好的邮箱~TOM VIP邮箱,在此分享给各位~邮件群发,如何选择最好用的电子邮箱?首先,TOM VIP邮箱拥有十多年邮件系统研发和服务经验,超高送达率,发qq,发163,发国外,发国内,发外贸迅速抵达。同时,就其35位靓号的稀有性来讲就比较赞。目前多数邮箱靓号也是有的,但是35位这种超短靓号还是比较稀缺的,更遑论豹子号..._群发邮件邮箱评比

浅谈电商场景中的扣除库存问题_如果支付时扣库存,有什么问题-程序员宅基地

文章浏览阅读1.1k次,点赞14次,收藏23次。电商场景中扣库存需要考虑秒杀高并发、事务一致性等场景,需要根据业务和场景来选择不同的方案。_如果支付时扣库存,有什么问题

c++笔试题(带答案)值得我们一看_c++题目描述有这样一个四位数,其千位和百位之和为偶数,十位和个位之和为奇数,-程序员宅基地

文章浏览阅读3.8k次。C++笔试题目大全(笔试宝典)(不断完善中) 收藏 (转)1.new 、 delete 、 malloc 、 free 关系 delete 会调用对象的析构函数 , 和 new 对应 free 只会释放内存, new 调用构造函数。 malloc 与 free 是 C++/C 语言的标准库函数, new/delete 是 C++ 的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用 maloc/free 无法满足动态对象的要求。对象_c++题目描述有这样一个四位数,其千位和百位之和为偶数,十位和个位之和为奇数,

基于OHCI的USB主机 —— USB设备设置地址-程序员宅基地

文章浏览阅读135次。设置地址设置地址需要注意的是该命令只能从地址0、端口0发送,等到执行成功以后,需要设置协议栈对象的usbAddr为新的地址,以后所有命令的收发都只能通过新地址进行:/***给USB设备设置地址*/shortusbSetAddress(unsignedchar*pDataBuf,unsignedshorta..._usb主机 设置地址

JVM-性能调优-3-运行时参数_jvm jit xmixed-程序员宅基地

文章浏览阅读85次。官网地址:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html1.JVM参数选项类型类型一:标准参数选项特点:比较稳定,后续版本基本不会变化,以-开头各种选项:运行java或者java -help可以看到所有的标准选项类型二:-X参数选项特点:非标准化参数,功能还是比较稳定的。但是官方说后续版本可能会变更,以-X开头。各种选项:运行java -X命令可以看到所有的X选项。JVM的JIT编译模式相关的选_jvm jit xmixed

AO4805&19-VB一种2个P沟道SOP8封装MOS管-程序员宅基地

文章浏览阅读374次,点赞11次,收藏8次。5. **开态电阻 (On-State Resistance):** RDS(ON) = 21mΩ @ VGS=10V, VGS=12V,说明在特定的栅源电压下,开态时的电阻。6. **阈值电压 (Threshold Voltage):** Vth = -1.8V,表示在栅源电压作用下,器件从关态切换到开态所需的最小电压。4. **最大电流 (Maximum Current):** -8.5A,表示器件能够承受的最大电流,负号表示电流方向为从漏极到源极。- 阈值电压: Vth = -1.8V。

推荐文章

热门文章

相关标签