场景:上传一个excel文件,把其转化成csv
- 首先创建一个ExcelUtils的工具类,里面写上函数
public static String excelToCsv(MultipartFile multipartFile){
}
MultipartFile 是 Spring Framework 提供的一个接口,用于处理 web 应用程序中通过 HTTP 请求以
multipart/form-data 格式上传的文件。当用户在网页表单中选择一个或多个文件,并点击提交按钮时,浏览器会按照
multipart/form-data 规范打包这些文件及其相关信息,形成一个多部分(multipart)的 HTTP 请求发送到服务器。
使用EasyExcel(这个一个开源工具)读
list = EasyExcel.read(multipartFile.getInputStream())
.excelType(ExcelTypeEnum.XLSX) //指定了所读取文件的类型为.xlsx
.sheet() //操作当前工作表(Sheet)。在不指定具体工作表索引或名称的情况下,默认处理第一个工作表
.headRowNumber(0)//意味着数据的第一行被当作表头(包含列名)。如果数据从第二行开始,则应设置为1
.doReadSync();//此方法会阻塞直到所有数据从Excel文件中读取完毕,并将解析后的数据以某种数据结构(通常是List)返回。结果存储在变量list中
- 开始转化
StringBuilder builder = new StringBuilder();
//读取表头
LinkedHashMap<Integer, String> headerMap = (LinkedHashMap)list.get(0);
//过滤不为null的,放到headerList中
List<String> headerList = headerMap.values().stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList());
builder.append(StringUtils.join(headerList,",")).append("\n");
//读取数据
for (int i = 1; i < list.size(); i++) {
LinkedHashMap<Integer, String> dataMap = (LinkedHashMap) list.get(i);
//同样的过滤
List<String> dataList = dataMap.values().stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList());
builder.append(StringUtils.join(dataList,",")).append("\n");
}
- 完成工具类
@Slf4j
public class ExcelUtils {
public static String excelToCsv(MultipartFile multipartFile) throws FileNotFoundException {
// File file = ResourceUtils.getFile("classpath:test_excel.xlsx");
List<Map<Integer, String>> list = null;
try {
list = EasyExcel.read(multipartFile.getInputStream())
.excelType(ExcelTypeEnum.XLSX)
.sheet()
.headRowNumber(0)
.doReadSync();
} catch (IOException e) {
log.error("csv转换错误",e);
}
System.out.println(list);
//转化为csv
StringBuilder builder = new StringBuilder();
//读取表头
LinkedHashMap<Integer, String> headerMap = (LinkedHashMap)list.get(0);
List<String> headerList = headerMap.values().stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList());
builder.append(StringUtils.join(headerList,",")).append("\n");
//读取数据
for (int i = 1; i < list.size(); i++) {
LinkedHashMap<Integer, String> dataMap = (LinkedHashMap) list.get(i);
List<String> dataList = dataMap.values().stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList());
builder.append(StringUtils.join(dataList,",")).append("\n");
}
return builder.toString();
}
}
CSV,全称为 Comma-Separated Values(逗号分隔值),是一种通用的、简单的文件格式,用于存储和交换表格数据。它是一种纯文本文件,其主要特点如下:
纯文本格式:CSV 文件是以文本形式存在的,这意味着它们可以直接用文本编辑器(如记事本、TextEdit等)打开和查看。它们不包含任何二进制编码或特殊格式标记,仅包含可打印字符。
数据组织:CSV 文件中的数据以行和列的形式组织,类似于电子表格或数据库表格。每一行代表一个数据记录,而每行内部的各个数据项(字段)则由特定的分隔符(通常是逗号)分隔开来。例如:
Name,Age,City
Alice,30,New York
Bob,25,Los Angeles