• 【EasyExcel】Java将不同的.csv文件数据存入同一个.xlsx文件的不同sheet当中


    问题背景

    在利用Tablesaw进行数据分析和处理后,我想要将所有的表格数据存入同一个.xlsx文件的不同sheet当中。但是Tablesaw只支持将表格写入.csv文件,因此我就需要将.csv文件中的数据读取后存入.xlsx的指定sheet当中。

    本文基于EasyExcel库实现上述功能,关于EasyExcel的介绍、安装和基本操作参考:

    本文在以上两篇文章的基础上稍作修改后实现。

    需要注意的是,文章中的方法读取到Excel的数据均为Srting字符串格式,因此数字也被存为String类型,将String类型的数字存入Excel文件后会引发警告,因此需要将String类型的数字转化为Double类型,详情请参考:

    程序实现

    public static void CsvToXlsx(String oripath, String despath, String sheet) 
    {		
    	ExcelWriter excelWriter = null;
        File destFile = new File(despath);
        File oriFile = new File(oripath);
        File transFile = new File(destFile.getParent(),"trans.xlsx");
        try {
            if (destFile.exists()) 
            {
            	//创建中转文件
                //追加数据,中转文件与目标文件不能是同一个文件名
                //withTemplate()指定模板文件,即复制一份; file() 中间文件名; autoCloseStream() 必须为True,自动关闭输入流     	
                excelWriter = EasyExcel.write().withTemplate(destFile)
                        //.file() 指定目标文件,不能与模板文件是同一个文件
                        .file(transFile).autoCloseStream(true).build(); //
            } 
            else 
            {
                excelWriter = EasyExcel.write(destFile).build();
            }
            WriteSheet writeSheet = EasyExcel.writerSheet(sheet).needHead(false).build();
    
            List<Map<Integer,Object>> list = importdata(oriFile); //返回的数据全部都是String类型的
            
            //将列表中值为数字的字符串转化为Double型
            Pattern pattern = Pattern.compile("-?[0-9]+.?[0-9]*");
            for(int i=0;i<list.size();i++)
            {
            	Map<Integer, Object> map = list.get(i);
            	for(int j=0;j<map.size();j++)
            	{
            		if(map.get(j)==null)continue;
            		String value = map.get(j).toString();
            		if(pattern.matcher(value).matches())
            		{
            			map.put(j, Double.parseDouble(value));
            		}
            		else
            		{
            			map.put(j, value);
            		}
            	}
            	list.set(i, map);
            }
            
            excelWriter.write(list, writeSheet);
        } 
        finally 
        {
        	
        	if (excelWriter != null)
        	{
        		excelWriter.finish();
        	}
        }
        
        if (transFile.exists()) 
        {
            //删除原文件
        	destFile.delete();	
            boolean result = transFile.renameTo(destFile);
            if(result)System.out.println("改名成功");
            else System.out.println("改名失败");
        }					
    }
    
    //导入数据
    public static List<Map<Integer,Object>> importdata(File file) 
    {		
    	List<Map<Integer,Object>> list = new LinkedList<>();
    	
    	EasyExcel.read(file)
    			.excelType(ExcelTypeEnum.CSV) //如果原始为.xlsx文件则改成.XLSX
    			.sheet()
    			.registerReadListener(new AnalysisEventListener<Map<Integer,Object>>() {
    
    				@Override
    				public void invoke(Map<Integer, Object> integerStringMap, AnalysisContext analysisContext) {
    					// TODO Auto-generated method stub
    					list.add(integerStringMap);
    				}
    
    				@Override
    				public void doAfterAllAnalysed(AnalysisContext context) {
    					// TODO Auto-generated method stub
    					System.out.println("数据读取完毕");
    				}
    			}).headRowNumber(0).doRead();
    	return list;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90

    调用CsvToXlsx(String oripath, String despath, String sheet) 即可,若原始文件为.xlsx格式,则需要修改函数importdata(File file)中的.excelType(ExcelTypeEnum.CSV)

    CsvToXlsx(String oripath, String despath, String sheet) 函数的输入参数分别表示:

    • oripath:原始文件的路径,即分散的表格文件;
    • despath:想要写入目标文件的路径,如果不存在会自动创建;
    • sheet:想要写入目标文件中指定sheet的名称。

    下面我将以一个简单的案例介绍一下函数的使用方法。

    案例介绍

    假设我有如下两个表格,名称分别为a.csvb.csv

    在这里插入图片描述
    运行下面这两句程序,会生成一个名为text.xlsx的文件:

    CsvToXlsx("data/a.csv", "data/test.xlsx", "a");
    CsvToXlsx("data/b.csv", "data/test.xlsx", "b");
    
    • 1
    • 2

    打开文件,可以看到两个表格的内容均写入了文件的不同sheet当中:

    在这里插入图片描述

  • 相关阅读:
    Nocas为什么会在SpringBoot启动完就会注册呢?
    10.数学环境排列数学公式
    linux删除某个文件夹下的某个固定文件
    设计模式的设计原则
    “论单元测试方法及应用”写作框架,软考高级论文,系统架构设计师论文
    Unity实现 GridView 页面
    ESP8266 做简单的仪器
    认识xml文件
    【LLS-Player】webrtc m94 修改
    基于springboot的宠物商城网站
  • 原文地址:https://blog.csdn.net/cyj972628089/article/details/126165577