首页 > 编程语言 > java 读取各种类型的文件 (四)

java 读取各种类型的文件 (四)

时间:2023-08-24 09:55:13浏览次数:37  
标签:java String 各种类型 int rowIndex sheet new null 读取

后端java,springboot 、前端vue: 对 xls、xlsx 文件的读写,以及前端预览

一、后端读

 public Object readXLSX() {       

       //获取到表       

      File file = new File(xxx);

     FileInputStream inputStream = null;
        XSSFWorkbook wb = null;
try {
inputStream = new FileInputStream(file);
//XSSFWorkbook获取到内容
try {
wb = new XSSFWorkbook(inputStream);
} catch (IOException e) {
e.printStackTrace();
LOGGER.error("Excel文件读取失败",e);
}
//获取到Sheet1表
XSSFSheet sheet = wb.getSheetAt(0);
String sheetName = sheet.getSheetName();//表的名称
       //获取标题栏---第0行
XSSFRow titleRow = sheet.getRow(0);
int cellCount = 0;
String[] titlevalues = new String[titleRow.getLastCellNum()];
for(int i = 0;i<titleRow.getLastCellNum();i++){
if(titleRow.getCell(i) == null){
continue;
}else{
titlevalues[cellCount] = titleRow.getCell(i).getStringCellValue();//第一行标题行
cellCount++;
}
}
firstLine = titlevalues;
//存放最终结果
// int count = 0;//总行数(去掉空白行)
sumLines = 0;
//第二行开始,遍历每一行
for (int rowIndex = 1; rowIndex < sheet.getPhysicalNumberOfRows() ; rowIndex++) {
XSSFRow xssfRow = sheet.getRow(rowIndex);//获取到表的某行信息
xssfRow.getPhysicalNumberOfCells();
String[] values = new String[xssfRow.getLastCellNum()];
if (xssfRow == null) {//如果为空进入下一个循环
continue;
}
for (int cellIndex = 0; cellIndex < xssfRow.getLastCellNum() ; cellIndex++) {
Cell xssfCell = xssfRow.getCell(cellIndex);//获取某行某列的值
String value = " ";
if (xssfCell != null) {
value = getCellValue(xssfCell);//数据格式的转换
}
values[cellIndex] = value;
}
try {
fileData.put(values);
} catch (InterruptedException e) {
e.printStackTrace();
}
sumLines++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
LOGGER.error("文件不存在");
}
return null;
}

public Object readXLS() {
//获取到表
 File file = new File(xxx);
//读取内容
FileInputStream inputStream = null;
HSSFWorkbook wb = null;
try {
inputStream = new FileInputStream(file);
//XSSFWorkbook获取到内容
try {
wb = new HSSFWorkbook(inputStream);
} catch (IOException e) {
e.printStackTrace();
LOGGER.error("Excel文件读取失败",e);
}
//获取到Sheet1表
HSSFSheet sheet = wb.getSheetAt(0);
String sheetName = sheet.getSheetName();//表的名称
//获取标题栏---第0行
HSSFRow titleRow = sheet.getRow(0);

int cellCount = 0;//记录真实列数
String[] titlevalues = new String[titleRow.getLastCellNum()];
for(int i = 0;i<titleRow.getLastCellNum();i++){
if(titleRow.getCell(i) == null){
continue;
}else{
titlevalues[cellCount] = titleRow.getCell(i).getStringCellValue();//第一行标题行
cellCount++;
}
}
firstLine = titlevalues;
//存放最终结果
// int count = 0;//总行数(去掉空白行)
sumLines = 0;
//第二行开始,遍历每一行
for (int rowIndex = 0; rowIndex < sheet.getPhysicalNumberOfRows() ; rowIndex++) {
HSSFRow hssfRow = sheet.getRow(rowIndex);//获取到表的某行信息
hssfRow.getPhysicalNumberOfCells();
String[] values = new String[xssfRow.getLastCellNum()];
if (xssfRow == null) {//如果为空进入下一个循环
continue;
}
for (int cellIndex = 0; cellIndex < hssfRow.getLastCellNum() ; cellIndex++) {
Cell hssfCell = hssfRow.getCell(cellIndex);//获取某行某列的值
String value = " ";
if (hssfCell != null) {
value = getCellValue(hssfCell);//数据格式的转换
}
values[cellIndex] = value;
}
try {
fileData.put(values);
} catch (InterruptedException e) {
e.printStackTrace();
}
sumLines++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
LOGGER.error("文件不存在");
}
return null;
}
public String getCellValue(Cell cell) {
String temp = "";
if (cell == null) {
return temp;
}
CellType cellType = cell.getCellType();//获取类型
switch (cellType) {
case STRING:
return cell.getRichStringCellValue().getString();
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
temp = df.format(date);
return temp;
} else {
if (!String.valueOf(cell.getNumericCellValue()).contains("E")) {
return String.valueOf(cell.getNumericCellValue());
} else {
return new DecimalFormat("#").format(cell.getNumericCellValue());
}
}
case FORMULA:
temp = cell.getStringCellValue();
return temp;

default:
return temp;
}
}
二、前后台配合预览
  1、controller
public ResponseEntity<byte[]> previewFile(@RequestBody FileVO fileVO) {
        if(fileVO == null || fileVO.getId() == null){
return null;
}
String filename = fileVO.getFileName();
byte[] buffer = getXLSXBytes(fileVO,30);
    // byte[] buffer = getXLSBytes(fileVO,30);
     HttpHeaders headers = new HttpHeaders();
        //防止中文名乱码
//filename = new String(filename.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
try {
headers.setContentDispositionFormData("attachment", filename=java.net.URLEncoder.encode(filename, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
headers.add(HttpHeaders.CONTENT_TYPE,"application/octet-stream;charset=UTF-8");
headers.add("file-type",smsTaskFile.getFileType());
//返回
return new ResponseEntity<byte[]>(buffer, headers, HttpStatus.CREATED);
}

//1、HSSFWorkbook;2、
HSSFSheet;3、HSSFRow;4、Cell
private byte[] getXLSBytes(FileVO fileVO, int preLines) {
    byte[] fileBuffer = null;
int readLine = 0;
FileInputStream inputStream = null;
HSSFWorkbook wb = null;
try {
inputStream = new FileInputStream(fileVO.getFilePath());
try {
wb = new HSSFWorkbook(inputStream);
} catch (IOException e) {
e.printStackTrace();
LOGGER.error("Excel文件读取失败",e);
}
//获取到Sheet1表
HSSFSheet sheet = wb.getSheetAt(0);
String sheetName = sheet.getSheetName();//表的名称
System.out.println("sheetName=" + sheetName);

int sumLines = 0;
//第二行开始,遍历每一行
int endLine = sheet.getPhysicalNumberOfRows()> preLines ? preLines :sheet.getPhysicalNumberOfRows();
StringBuilder content = new StringBuilder("");
for (int rowIndex = 0; rowIndex < endLine ; rowIndex++) {
readLine = rowIndex;
HSSFRow xssfRow = sheet.getRow(rowIndex);//获取到表的某行信息
if (xssfRow == null) {//如果为空进入下一个循环
content.append("\n");
continue;
}
for (int cellIndex = 0; cellIndex < xssfRow.getLastCellNum() ; cellIndex++) {
Cell xssfCell = xssfRow.getCell(cellIndex);//获取某行某列的值
String value = " ";
if (xssfCell != null) {
value = getCellValue(xssfCell);//数据格式的转换
}
content.append(value).append(" ");
}
content.append("\n");
sumLines++;
}
fileBuffer = content.toString().getBytes(StandardCharsets.UTF_8);
} catch (FileNotFoundException e) {
e.printStackTrace();
LOGGER.error("文件不存在");
}
return fileBuffer;
}

//1、XSSFWorkbook;2、XSSFSheet;3、XSSFRow;4、Cell 
private byte[] getXLSXBytes(FileVO fileVO, int preLines) {
    byte[] fileBuffer = null;
int readLine = 0;
//读取内容
FileInputStream inputStream = null;
XSSFWorkbook wb = null;
try {
inputStream = new FileInputStream(fileVO.getFilePath());
try {
wb = new XSSFWorkbook(inputStream);
} catch (IOException e) {
e.printStackTrace();
LOGGER.error("Excel文件读取失败",e);
}
//获取到Sheet1表
XSSFSheet sheet = wb.getSheetAt(0);
String sheetName = sheet.getSheetName();//表的名称
System.out.println("sheetName=" + sheetName);

int sumLines = 0;
//第二行开始,遍历每一行
int endLine = sheet.getPhysicalNumberOfRows()> preLines ? preLines :sheet.getPhysicalNumberOfRows();
StringBuilder content = new StringBuilder("");
for (int rowIndex = 0; rowIndex < endLine ; rowIndex++) {
readLine = rowIndex;
XSSFRow xssfRow = sheet.getRow(rowIndex);//获取到表的某行信息
if (xssfRow == null) {//如果为空进入下一个循环
content.append("\n");
continue;
}
for (int cellIndex = 0; cellIndex < xssfRow.getLastCellNum() ; cellIndex++) {
Cell xssfCell = xssfRow.getCell(cellIndex);//获取某行某列的值
String value = " ";
if (xssfCell != null) {
value = getCellValue(xssfCell);//数据格式的转换
}
content.append(value).append(" ");
}
content.append("\n");
sumLines++;
}
fileBuffer = content.toString().getBytes(StandardCharsets.UTF_8);
} catch (FileNotFoundException e) {
e.printStackTrace();
LOGGER.error("文件不存在");
}
return fileBuffer;
}

  2、vue
<el-button v-if="item.key == 'operate'" @click.stop="taskfilePreview(scope.row)" type="text" size="small">预览</el-button>
<el-dialog-side :visible="showPreviewFile" @close="showPreviewFile = false;fileContent=''">
  <h1>只预览文件前30行</h1><br>
<el-card>
<el-input v-if="fileContent"
v-model="fileContent"
show-word-limit
:autosize="{ minRows: 12}"
type="textarea"
></el-input>
</el-card>
</el-dialog-side>
taskfilePreview(row){
const reader = new FileReader();

  //通过readAsArrayBuffer将blob转换为ArrayBuffer对
Actions.previewFile(row).then(res => {
if (res.data) {
reader.readAsText(res.data) // 这里的res.data是blob文件流
reader.onload = (event) => {
var data = event.target.result;
this.showPreviewFile = true
this.fileContent = data
}
}
})
}
 
 

标签:java,String,各种类型,int,rowIndex,sheet,new,null,读取
From: https://www.cnblogs.com/dujiudizhimo/p/17651991.html

相关文章

  • Java 实现 国密SM4/ECB/PKCS7Padding对称加密解密
    Java实现国密SM4/ECB/PKCS7Padding对称加密解密,为了演示方便本问使用的是IntelliJIDEA2022.1(CommunityEdition)来构建代码的1、pom.xml文件添加需要的jar<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"......
  • java常用知识
    提取对象数组里面的某个字段List<String>lastTask=lastTasks.stream().map(HistoricActivityInstance::getActivityId).limit(1).collect(Collectors.toList());对象数组排序notEmptyList.sort(Comparator.comparing......
  • 编写JavaScript文件并在heml中调用
    编写JavaScript文件的基本步骤如下:创建一个新的文本文件,并将其保存为以.js为扩展名的文件,例如script.js。在JavaScript文件中编写JavaScript代码。可以编写函数、变量、条件语句、循环等JavaScript代码。例如:functiongreet(){console.log("Hello,World!");}var......
  • 《深入理解Java虚拟机》读书笔记:运行时栈帧结构
    代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步。一、概述在Java虚拟机规范中制定了虚拟机字节码执行引擎的概念模型,这个概念模型成为各种虚拟机执行引擎的统一外观(Facade)。在不同的虚拟机实现里面,执行引擎在执行Java代码的时......
  • Java的深拷贝与浅拷贝的区别
    1、二者的区别浅拷贝:在拷贝一个对象时,对对象的基本数据类型的成员变量进行拷贝,但对引用类型的成员变量只进行引用的传递,并没有创建一个新的对象,当对引用类型的内容修改会影响被拷贝的对象。深拷贝:在拷贝一个对象时,除了对基本数据类型的成员变量进行拷贝,对引用类型的成员变量进行......
  • mybatis 报错:Cause: java.lang.NumberFormatException: For input string: "java"
    1、所错图示:2、为什么包这样的错误?在if查询条件的逻辑没有错,其实在代码转换解析时,自动转换类型了,是代码在转换解析时异常。<!--where与if配合使用--><selectid="selectBlogIfWhere"resultType="blog"parameterType="blog"><includerefid="commBlog"></in......
  • java序列化
    序列化和反序列化序列化:把对象转换为字节序列的过程称为对象的序列化.反序列化:把字节序列恢复为对象的过程称为对象的反序列化.什么时候需要用到序列化和反序列化将内存中的对象持久化到磁盘、数据库或网络传输对象深拷贝Serializable接口在Java中实现了Serializab......
  • JAVA SE基础《九》 ---- 常用API
    目录一、包二、String1、String概述2、String的常用方法3、String使用时的注意事项4、String的应用案例三、ArrayList1、ArrayList快速入门 1、ArrayList应用案例1、ArrayLis综合案例 前言API(ApplicationProgrammingInterface,应......
  • MongoDB :第六章:Java程序操作MongoDB
    MongoDBJava环境配置在Java程序中如果要使用MongoDB,你需要确保已经安装了Java环境及MongoDBJDBC驱动。本章节实例时候Mongo3.x以上版本。你可以参考本站的Java教程来安装Java程序。现在让我们来检测你是否安装了MongoDBJDBC驱动。首先你必须下载mongojar包,下......
  • ChatGPT 问答00021 java 对字符串进行高度压缩的算法
    Java中对字符串进行高度压缩的算法有很多种,下面我介绍两种常见的方法。Run-LengthEncoding(RLE)算法RLE算法是一种简单且高效的字符串压缩算法。它通过将连续重复的字符序列替换为一个字符和其重复次数的表示来实现压缩。示例代码如下:publicstaticStringcompressStrin......