JAVA:探索Apache POI 处理利器

请关注微信公众号:拾荒的小海螺

1、简述

Apache POI是Apache软件基金会的顶级项目之一,它允许Java开发人员读取和写入Microsoft Office格式的文档,包括Excel、Word和PowerPoint文件。通过POI,开发人员可以创建、修改和读取Excel电子表格,从而实现各种各样的用例,例如数据导入、报表生成和数据分析等。

在这里插入图片描述

2、应用

Apache POI是一个强大的Java库,用于处理Microsoft Office格式文件,特别是Excel电子表格。在本文中,我们将深入探讨Apache POI库,并提供详细的应用实例,以展示其在处理Excel文件时的强大功能。

首先,确保在Maven中引入POI的依赖:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.3</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>
2.1 创建和读取

创建一个简单的Excel文件:

import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelCreationExample {

    public static void main(String[] args) {
        try (Workbook workbook = new XSSFWorkbook()) {
            Sheet sheet = workbook.createSheet("Sheet1");
            Row row = sheet.createRow(0);
            Cell cell = row.createCell(0);
            cell.setCellValue("Hello, Apache POI!");

            FileOutputStream fileOut = new FileOutputStream("example.xlsx");
            workbook.write(fileOut);
            fileOut.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

读取和修改现有的Excel文件:

import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.usermodel.*;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelModificationExample {

    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("example.xlsx");
             Workbook workbook = new XSSFWorkbook(fis)) {
            Sheet sheet = workbook.getSheetAt(0);
            Row row = sheet.getRow(0);
            Cell cell = row.getCell(0);
            String cellValue = cell.getStringCellValue();
            System.out.println("Original Cell Value: " + cellValue);

            cell.setCellValue("Modified by Apache POI!");

            FileOutputStream fos = new FileOutputStream("example.xlsx");
            workbook.write(fos);
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
2.2 图片读取和插入

使用Apache POI库,你可以方便地插入图片到Excel文件中,并读取已经插入的图片。下面是插入图片和读取图片的示例代码:

插入图片到Excel文件中:

import org.apache.poi.ss.usermodel.*;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class InsertImageExample {

    public static void main(String[] args) {
        try (Workbook workbook = new XSSFWorkbook()) {
            Sheet sheet = workbook.createSheet("Sheet1");

            // 读取图片文件
            FileInputStream fis = new FileInputStream("image.jpg");
            byte[] imageData = fis.readAllBytes();
            fis.close();

            // 将图片插入到Excel文件中
            int pictureIdx = workbook.addPicture(imageData, Workbook.PICTURE_TYPE_JPEG);
            CreationHelper helper = workbook.getCreationHelper();
            Drawing drawing = sheet.createDrawingPatriarch();
            ClientAnchor anchor = helper.createClientAnchor();
            anchor.setCol1(1); // 图片起始列
            anchor.setRow1(1); // 图片起始行
            Picture picture = drawing.createPicture(anchor, pictureIdx);

            FileOutputStream fos = new FileOutputStream("output.xlsx");
            workbook.write(fos);
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

从Excel文件中读取图片:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ReadImageExample {

    public static void main(String[] args) {
        try (Workbook workbook = new XSSFWorkbook(new FileInputStream("output.xlsx"))) {
            Sheet sheet = workbook.getSheetAt(0);
            Drawing drawing = sheet.getDrawingPatriarch();

            // 读取图片
            for (Shape shape : drawing) {
                if (shape instanceof Picture) {
                    Picture picture = (Picture) shape;
                    byte[] imageData = picture.getData();
                    BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(imageData));

                    // 将图片保存到文件
                    String filename = "image_from_excel.jpg";
                    FileOutputStream fos = new FileOutputStream(filename);
                    ImageIO.write(bufferedImage, "jpg", fos);
                    fos.close();

                    System.out.println("Image saved to: " + filename);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
2.3 条件格式

添加条件格式规则:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;

public class ConditionalFormattingExample {

    public static void main(String[] args) {
        try (Workbook workbook = new XSSFWorkbook()) {
            Sheet sheet = workbook.createSheet("Sheet1");

            XSSFSheetConditionalFormatting cf = (XSSFSheetConditionalFormatting) sheet.getSheetConditionalFormatting();
            ConditionalFormattingRule rule = cf.createConditionalFormattingRule(ComparisonOperator.GT, "0");
            FontFormatting fontFmt = rule.createFontFormatting();
            fontFmt.setFontStyle(true, false);
            fontFmt.setFontColorIndex(IndexedColors.RED.index);

            CellRangeAddress[] regions = {CellRangeAddress.valueOf("A1:A10")};
            cf.addConditionalFormatting(regions, rule);

            FileOutputStream fos = new FileOutputStream("conditional_formatting_example.xlsx");
            workbook.write(fos);
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

读取当前单元格是否满足条件格式设定的规则:

/**
 * 获取当前单元格是否满足校验规则,并返回满足的规则对象
 * @Author shdxhl
 * @Method  getMatchingConditionalFormattingForCell
 * @Date 17:10 2023-10-14
 * @Param [cell]
 * @return List<EvaluationConditionalFormatRule>
 **/
private List<EvaluationConditionalFormatRule> getMatchingConditionalFormattingForCell(XSSFCell cell) {
	Sheet sheet = cell.getSheet();
	Workbook workbook = sheet.getWorkbook();
	WorkbookEvaluatorProvider workbookEvaluatorProvider =
			(WorkbookEvaluatorProvider)workbook.getCreationHelper().createFormulaEvaluator();
	ConditionalFormattingEvaluator conditionalFormattingEvaluator =
			new ConditionalFormattingEvaluator(workbook, workbookEvaluatorProvider);
	List<EvaluationConditionalFormatRule> matchingCFRulesForCell =
			conditionalFormattingEvaluator.getConditionalFormattingForCell(cell);
	return matchingCFRulesForCell;
}

/**
 * 获取当前单元格匹配规则的颜色
 * @Author shdxhl
 * @Method  getMatchingConditionalColor
 * @Date 17:10 2023-10-14
 * @Param [cell]
 * @return XSSFColor
 **/
private XSSFColor getMatchingConditionalColor(XSSFCell cell){
	List<EvaluationConditionalFormatRule> formatRuleList = getMatchingConditionalFormattingForCell(cell);
	if(Objects.nonNull(formatRuleList) && formatRuleList.size() > 0){
		ConditionalFormattingRule cFRule = formatRuleList.get(0).getRule();
		XSSFColor fontColor = (XSSFColor) cFRule.getFontFormatting().getFontColor();
		if (fontColor != null) {
			return fontColor;
		}
	}
	return null;
}

3、优化

优化Apache POI代码可以提高处理Excel文件时的性能和效率。以下是一些优化技巧以及对应的实例:

3.1 批量操作

避免逐个单元格进行读写操作,而是批量处理单元格数据。这可以通过缓存或预加载数据来实现。

// 逐行读取数据并存储在内存中
List<List<String>> data = new ArrayList<>();
for (Row row : sheet) {
    List<String> rowData = new ArrayList<>();
    for (Cell cell : row) {
        rowData.add(cell.getStringCellValue());
    }
    data.add(rowData);
}
3.2 使用缓存

合理使用POI提供的缓存机制,例如使用CellStyleCache来避免重复创建CellStyle对象。

CellStyle style = workbook.createCellStyle();
style.setBorderBottom(BorderStyle.THIN);
style.setBorderTop(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);

// 使用缓存
CellStyle cachedStyle = CellStyleCache.getOrAdd(style);
3.3 使用SXSSFWorkbook进行大数据量处理

当处理大量数据时,可以使用SXSSFWorkbook来避免内存溢出问题,因为它支持将数据写入临时文件而不是全部加载到内存中。

try (SXSSFWorkbook workbook = new SXSSFWorkbook()) {
    SXSSFSheet sheet = workbook.createSheet("Sheet1");
    for (int rownum = 0; rownum < 10000; rownum++) {
        Row row = sheet.createRow(rownum);
        for (int cellnum = 0; cellnum < 10; cellnum++) {
            Cell cell = row.createCell(cellnum);
            cell.setCellValue("Data" + cellnum);
        }
    }
    try (FileOutputStream fos = new FileOutputStream("large_data.xlsx")) {
        workbook.write(fos);
    }
}
3.4 避免频繁的文件IO操作

尽量减少对文件系统的访问次数,可以通过缓存或批量写入操作来减少文件IO操作。

try (FileOutputStream fos = new FileOutputStream("output.xlsx");
     BufferedOutputStream bos = new BufferedOutputStream(fos);
     Workbook workbook = new XSSFWorkbook()) {
    Sheet sheet = workbook.createSheet("Sheet1");
    // 批量写入数据
    // ...
    workbook.write(bos);
}
3.5 使用事件模型

如果只需要读取Excel文件的数据而不需要修改,可以使用事件驱动的模型(如SAX)来逐行读取数据,以减少内存消耗。

try (OPCPackage pkg = OPCPackage.open(new File("input.xlsx"))) {
    XSSFReader reader = new XSSFReader(pkg);
    StylesTable styles = reader.getStylesTable();
    ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(pkg);
    XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) reader.getSheetsData();
    while (iter.hasNext()) {
        try (InputStream stream = iter.next()) {
            processSheet(styles, strings, stream);
        }
    }
}

通过以上优化方法,可以提高Apache POI代码在处理Excel文件时的性能和效率。

4、结论

Apache POI是处理Excel文件的强大工具,可以满足各种各样的需求,从简单的数据导入到复杂的报表生成。通过本文提供的应用实例,你可以开始探索Apache POI,并利用其丰富的功能来处理Excel文件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面试(04)————JavaWeb

1、网络通讯部分 1.1、 TCP 与 UDP 区别&#xff1f; 1.2、什么是 HTTP 协议&#xff1f; 1.3、TCP 的三次握手&#xff0c;为什么&#xff1f; 1.4、HTTP 中重定向和请求转发的区别&#xff1f; 1.5、 Get 和 Post 的区别&#xff1f; 2、cookie 和 session 的区别&am…

加入酷开会员 酷开系统带你一起开启看电视的美好时光!

看电视对孩子和大人来说&#xff0c;都是有好处的。英国的《星期日泰晤士报》曾刊登报道&#xff1a;“看电视可以让小孩增长见闻&#xff0c;学习各种良好的社交和学习技巧&#xff0c;从而为他们今后的学习打下良好的基础。”而对于成年人来说&#xff0c;看电视也是一种娱乐…

linux 安装 pptp 协议

注意&#xff1a;目前iOS已不支持该协议 yum -y install ppp wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/p/pptpd-1.4.0-2.el7.x86_64.rpm yum -y install pptpd-1.4.0-2.el7.x86_64.rpm vi /etc/pptpd.conf 去除 localip 和 remoteip的注释 …

【.Net】Polly

文章目录 概述服务熔断、服务降级、服务限流、流量削峰、错峰、服务雪崩Polly的基本使用超时策略悲观策略乐观策略 重试策略请求异常响应异常 降级策略熔断策略与策略包裹&#xff08;多种策略组合&#xff09; 参考 概述 Polly是一个被.NET基金会支持认可的框架&#xff0c;同…

SAP-MM 新增公司代码 激活物料分类账

1、OMX1 - 激活物料分类账&#xff08;配置环境&#xff09; 2、CKMSTART - 物料分类账的生产开始&#xff08;生产机运行&#xff09; 不激活创建物料时会报错&#xff1a;估价范围还没有生产式的物料账簿 执行后结果&#xff1a; 以上~~

creo扫描杯子学习笔记

creo扫描杯子学习笔记 扫描2要素&#xff1a; 轨迹&#xff0c; 截面。 多用于曲线扫描&#xff0c;区别于拉伸命令。 大小自定 旋转扫描 抽壳 草绘把手 扫描把手 复制曲面 实例化切除 成型

Web爬虫

&#x1f4d1;前言 本文主要是【Web爬虫】——简单使用的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&#…

PHP实现网站微信扫码关注公众号后自动注册登陆实现方法及代码【关注收藏】

在网站注册登陆这环节&#xff0c;增加微信扫码注册登陆&#xff0c;普通的方法需要开通微信开发者平台&#xff0c;生成二维码扫码后才能获取用户的uinonid或openid&#xff0c;实现注册登陆&#xff0c;但这样比较麻烦还要企业认证交费开发者平台&#xff0c;而且没有和公众号…

区域自动气象站讲解

TH-QC10当我们每天查看天气预报&#xff0c;安排出行计划&#xff0c;或是在户外活动时关注天气变化&#xff0c;很少有人会想到这一切背后默默付出的“英雄”——区域自动气象站。这些看似不起眼的气象监测设备&#xff0c;却在我们日常生活中扮演着至关重要的角色。今天&…

【话题】程序员35岁会失业吗?

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景招聘分析一、技术更新换代的挑战二、经验与技术的双重优势三、职业发展的多元化选择四、个人成长与职业规划的平衡五、结语文章推荐 背景 35岁被认为是程序员职业生…

【OJ】stack刷题

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 1. 155. 最小栈1.1 分析1.2 代码 2. JZ31 栈的压入、弹出序列2.1 分析2.2 代码 3. 150. 逆波兰表达式求值3.1 分析3.2 代码 1. 155. 最小栈 1.1 分析 利用两个栈&#xff0c;一个栈a负责入数据和出数据&#xff0c;另一个…

分类预测 | Matlab实现DRN深度残差网络数据分类预测

分类预测 | Matlab实现DRN深度残差网络数据分类预测 目录 分类预测 | Matlab实现DRN深度残差网络数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现DRN深度残差网络数据分类预测&#xff08;完整源码和数据&#xff09;&#xff0c;运行环境为Matl…

合宙开发板Core_Air780E测试AT指令

一、官方资料 CORE-AIR780E 开发板是合宙通信推出的基于 Air780E 模组所开发的&#xff0c;包含电源&#xff0c;SIM 卡&#xff0c;USB&#xff0c;天线&#xff0c;音频等必要功能的最小硬件系统。以方便用户在设计前期对 Air780E 模块 进行性能评估&#xff0c;功能调试&…

CUDA10的安装

1、因为要用到tensorflow1.15.5的GPU版本&#xff0c;所以想安装cuda10来进行加速&#xff0c;通过nvidia-smi检查本机上的CUDA版本 2、下载的cuda10版本&#xff0c;cuda_10.0.130_411.31_win10.exe 下载的cudnn版本&#xff0c;cudnn-10.0-windows10-x64-v7.6.4.38.zip 然后…

mathtype如何嵌入到word中?mathtype 7永久激活码密钥及2024最新序列号附安装教程

将MathType嵌入到Word中的方法主要有三种&#xff0c;分别是&#xff1a; 通过加载项嵌入MathType。首先&#xff0c;在Word中点击“文件”按钮&#xff0c;选择“选项”&#xff0c;然后选择“加载项”一栏&#xff0c;找到MathType相关的加载项并勾选&#xff0c;点击“确定…

20240404这个数字有什么特点吗?

今天是2024年的清明节&#xff0c;20240404这个数字让我提出了一个疑问&#xff0c;它是否有什么含义或者特点呢&#xff1f; 首先&#xff0c;如果把它拆分为两个整数的平方和&#xff0c;会怎么样呢&#xff1f; 于是&#xff0c;我一顿操作猛如虎&#xff0c;搞出了这么个…

html--烟花3

html <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Canvas烟花粒子</title> <meta name"keywords" content"canvas烟花"/> <meta name"description" content"can…

Kubernetes学习笔记8

Kubernetes集群客户端工具kubectl 我们已经能够部署Kubernetes了&#xff0c;那么我们如何使用Kubernetes集群运行企业的应用程序呢&#xff1f;那么&#xff0c;我们就需要使用命令行工具kubectl。 学习目标&#xff1a; 了解kubectl 命令帮助方法 了解kubectl子命令使用分…

看不惯各种信息收集表,我手写了一个身份证号输入组件

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 个人IP&#xff1a;shigen 背景 shigen最近的需要填写各种报名表的场景有点多&#xff0c;很多场景都要输…

三防笔记本丨加固笔记本丨三防笔记本电脑赋能车辆检修

随着汽车数量的不断增加和交通运输行业的发展&#xff0c;车辆检修行业成为了保障交通安全和延长车辆寿命的重要领域。在车辆检修过程中&#xff0c;需要使用各种工具和设备来进行检测、维修和保养&#xff0c;而信息化技术的应用正逐渐渗透到这一行业中&#xff0c;为检修工作…