excel文件追加内容,设置追加数据字体颜色,兼容.xlsx与.xls

2024-03-23 02:58

本文主要是介绍excel文件追加内容,设置追加数据字体颜色,兼容.xlsx与.xls,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于IO的基础知识可见:IO

一、行追加

1、代码详细解释

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileInputStream;
import java.io.FileOutputStream;/*** @author zhangmeng* @Date 2019-11-22* @desc*/
@Slf4j
public class Test {@org.junit.Testpublic void test() {String filePath = "/Users/zhangmeng/Desktop/工作簿2.xlsx";FileInputStream in = null;FileOutputStream out = null;XSSFWorkbook wb = null;try {//获取文件in = new FileInputStream(filePath);wb = new XSSFWorkbook(in);//获取到工作表,因为一个excel可能有多个工作表XSSFSheet sheet = wb.getSheetAt(0);//获取第一行(excel中的行默认从0开始,所以这就是为什么,一个excel必须有字段列头),即,字段列头,便于赋值XSSFRow row = sheet.getRow(0);//分别得到最后一行的行号,和一条记录的最后一个单元格System.out.println(sheet.getLastRowNum() + " " + row.getLastCellNum());out = new FileOutputStream(filePath);//创建现有行号的下一行row = sheet.createRow((short) (sheet.getLastRowNum() + 1));//设置第一个(从0开始)单元格的数据row.createCell(0).setCellValue("123");//设置第二个(从0开始)单元格的数据row.createCell(1).setCellValue(1);} catch (Exception e) {log.info("异常e:{}", e);} finally {try {if (in != null) {in.close();}if (out != null) {out.flush();wb.write(out);out.close();}} catch (Exception e) {log.info("e:{}", e);}}}
}

2、问题解决

org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007  XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)

原因:excel2003和excel2007版本的问题

(1)判断文件后缀名是xls,还是xlsx

(2)文件后缀名是xls,使用HSSFWorkbook;是xlsx,使用XSSFWorkbook

二、列追加

1、代码详细解释

excel处理数据,处理结果在指定行的最后一列添加备注,设置追加数据字体颜色

@Slf4j
public class Test {private static final Integer CURRENT_ROW = 1;@org.junit.Testpublic void test() {String filePath = "/Users/zhangmeng/Desktop/工作簿2.xlsx";FileInputStream in = null;FileOutputStream out = null;XSSFWorkbook wb = null;try {//获取文件in = new FileInputStream(filePath);wb = new XSSFWorkbook(in);//获取到工作表,因为一个excel可能有多个工作表XSSFSheet sheet = wb.getSheetAt(0);//写入数据out = new FileOutputStream(filePath);//设置追加字体颜色CellStyle redStyle = wb.createCellStyle();XSSFFont redFont = wb.createFont();redFont.setColor(new XSSFColor(new Color(255,0,0)));redStyle.setFont(redFont);//获取指定行(excel中的行默认从0开始)XSSFRow row = sheet.getRow(CURRENT_ROW);//在当前行最后一列的下一列追加数据XSSFCell cell = row.createCell(row.getLastCellNum());cell.setCellStyle(redStyle);cell.setCellValue("999");} catch (Exception e) {log.info("异常e:{}", e);} finally {try {if (in != null) {in.close();}if (out != null) {out.flush();wb.write(out);out.close();}} catch (Exception e) {log.info("e:{}", e);}}}
}

2、row.getLastCellNum(),获取的是最后一列的下一列,同size

三、兼容.xlsx与.xls,追加数据

private static final String EXCEL_EXTENSION_XLS = "xls";private void appendExcelData(String filePath, Map<Integer, String> needAppendRows) {FileInputStream in = null;FileOutputStream out = null;Workbook wb = null;try {//获取文件in = new FileInputStream(filePath);if (filePath.endsWith(EXCEL_EXTENSION_XLS)) {wb = new HSSFWorkbook(in);} else {wb = new XSSFWorkbook(in);}//获取到工作表,因为一个excel可能有多个工作表Sheet sheet = wb.getSheetAt(0);//写入数据out = new FileOutputStream(filePath);//设置颜色CellStyle redStyle = wb.createCellStyle();Font redFont = wb.createFont();redFont.setColor(Font.COLOR_RED);redStyle.setFont(redFont);//获取指定行(excel中的行默认从0开始)for (Integer rows : needAppendRows.keySet()) {Row row = sheet.getRow(rows);//在当前行最后一列的下一列追加数据Cell cell = row.createCell(row.getLastCellNum());cell.setCellStyle(redStyle);cell.setCellValue(needAppendRows.get(rows));}} catch (Exception e) {log.info("appendExcelData, 追加数据出现异常e:{}", e);} finally {try {if (in != null) {in.close();}if (out != null) {out.flush();wb.write(out);out.close();}} catch (Exception e) {log.info("appendExcelData, 关闭流出现异常e:{}", e);}}
}

 

这篇关于excel文件追加内容,设置追加数据字体颜色,兼容.xlsx与.xls的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/836914

相关文章

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼