maven项目下上传xlsx文件成inputstream流后用WorkbookFactory转换报错

博客讲述了在Java Maven项目中,处理上传的xlsx文件时遇到 WorkbookFactory 转换错误的问题。经过排查,错误可能由文件过大、使用了不合适的Workbook实现或 poi-ooxml-schemas 版本不正确导致。解决方案包括调整JVM内存、使用WorkbookFactory以处理不同格式的Excel文件,以及确保 poi、poi-ooxml 和 poi-ooxml-schemas 的版本一致,特别是要使用正确的 ooxml-schemas 版本。
摘要由CSDN通过智能技术生成

因为java项目需要因此需要

  • html提交xlsx文件
  • controller层能接受MultipartFile文件,并转换成inputstream流扔给business(service)层处理
  • business(service)层将xlsx的信息全部获取并返回到前台

但是在前台上传xlsx文件时,返回信息时一直提示 500,即提示服务器内部错误。
于是在断点的情况下,博主确认controller能接收MultipartFile文件并能转换成inputstream流,但是在inputstream使用poi包下的WorkbookFactory转换时会报错。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

java.lang.NoClassDefFoundError: org/openxmlformats/schemas/spreadsheetml/x2006/main/CTDxfs$1
....

未捕获到 servlet OUTEXCEL 的其中一个服务方法中抛出的异常。抛出的异常:java.lang.NoClassDefFoundError: org.openxmlformats.schemas.spreadsheetml.x2006.main.
你好,关于使用Spring Boot将Excel文件转换为Parquet文件的示例,可以参考以下代码: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.parquet.hadoop.ParquetWriter; import org.apache.parquet.hadoop.metadata.CompressionCodecName; import org.apache.parquet.schema.MessageType; import org.apache.parquet.schema.MessageTypeParser; import org.apache.parquet.schema.Types; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.core.io.ClassPathResource; import org.springframework.util.ResourceUtils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; @SpringBootApplication public class ExcelToParquetApplication { public static void main(String[] args) throws IOException { SpringApplication.run(ExcelToParquetApplication.class, args); // 读取Excel文件 File file = ResourceUtils.getFile("classpath:test.xlsx"); FileInputStream inputStream = new FileInputStream(file); // 定义Parquet文件的Schema MessageType schema = MessageTypeParser.parseMessageType( "message test {\n" + " required binary name (UTF8);\n" + " required int32 age;\n" + "}" ); // 定义Parquet文件的输出路径 Path outputPath = new Path("test.parquet"); // 定义Parquet文件的压缩方式 CompressionCodecName codec = CompressionCodecName.SNAPPY; // 定义Parquet文件的写入器 ParquetWriter writer = new ParquetWriter( outputPath, ParquetWriter.DEFAULT_WRITER_VERSION, new Configuration(), schema, codec, ParquetWriter.DEFAULT_BLOCK_SIZE, ParquetWriter.DEFAULT_PAGE_SIZE, ParquetWriter.DEFAULT_PAGE_SIZE, ParquetWriter.DEFAULT_IS_DICTIONARY_ENABLED, ParquetWriter.DEFAULT_IS_VALIDATING_ENABLED ); // 读取Excel文件中的数据,并写入Parquet文件 List<Row> rows = readExcel(inputStream); for (Row row : rows) { writer.write(row); } // 关闭Parquet文件的写入器 writer.close(); } // 读取Excel文件中的数据 private static List<Row> readExcel(FileInputStream inputStream) { // TODO: 实现读取Excel文件中的数据 return new ArrayList<>(); } } ``` 关于需要的Maven依赖和版本,可以参考以下代码: ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.5.5</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.3.1</version> </dependency> <dependency> <groupId>org.apache.parquet</groupId> <artifactId>parquet-hadoop</artifactId> <version>1.12.</version> </dependency> <dependency> <groupId>org.apache.parquet</groupId> <artifactId>parquet-protobuf</artifactId> <version>1.12.</version> </dependency> <dependency> <groupId>org.apache.parquet</groupId> <artifactId>parquet-schema</artifactId> <version>1.12.</version> </dependency> <dependency> <groupId>org.apache.parquet</groupId> <artifactId>parquet-column</artifactId> <version>1.12.</version> </dependency> <dependency> <groupId>org.apache.parquet</groupId> <artifactId>parquet-common</artifactId> <version>1.12.</version> </dependency> <dependency> <groupId>org.apache.parquet</groupId> <artifactId>parquet-encoding</artifactId> <version>1.12.</version> </dependency> <dependency> <groupId>org.apache.parquet</groupId> <artifactId>parquet-format</artifactId> <version>2.4.</version> </dependency> </dependencies> ``` 希望能对你有所帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值