使用POI完成Excel数据处理
感谢写代码的时候遇到的所有大恩人!磕头了磕头了!
咚!咚!咚!
昨天晚上接了个活。
每个月的月初需要把上个月的物流提单大包数和对应的ID上传到特定的表格中...
做法是先在在线表格取得提单号,根据提单号从邮件里找到对应提单的预报邮件,下载一个压缩包,压缩包里有一个Excel表格,表格里有几万个大包号,需要手动把大包号去重,把大包数量和大包ID提取出来塞到在线表格里。
这是其中一个表格,一共150个
一个不熟练的人估计需要做一上午。
想了下,之前弄过POI,可以用POI把表格数据提出来,去重,最后输出出来,再往在线表格里塞,这样能节省几个小时。
嘿嘿....开动
首先:从邮件里搜索到下载这一步只能手工搞,我可以把压缩包重命名成提单号,解压缩出来带有提单号的目录,目录里只有一个Excel文件,用Java把Excel文件名改成提单号。遍历每个Excel文件,用POI把数据去重输出,输出数据数量和数据内容。
说干就干。
首先获取整个文件夹的文件名称并赋给文件夹内的文件,我参考了虫卅blog中的一部分代码
【java】如何获取整个文件夹的文件名称_java获取文件名称_虫卅的博客-CSDN博客
package com;import java.io.File;public class FileDemo {private static String filepath="D:\\test\\2023-05-10";public static void getfileName(String filepath) {//获取目录下所有文件的名字(不包括文件夹)File f3 = new File(filepath);File[] files = f3.listFiles();for (File fi : files){if (fi.isFile()){System.out.println(fi.getName());}}}
}
遍历出来xslx文件之后,使用file.renameTo(new File(filename));方法重命名,但是失败了,翻了不少博客又看了不少文章也找不出个所以然,倒是删除文件没问题。后来看了另外一位朋友的博客决定曲线救国,复制文件改名。
巧妙地解决Java文件重命名失败的问题-蒲公英云
大概意思就是引用一个FileUtils类,通过这个类去把文件复制。我找了几个博客看了下
感谢出处不详,经久不息
Java常用类(三):FileUtils类_出处不详,经久不息的博客-CSDN博客
public class FileDemo {private static String filepath="D:\\test\\2023-05-10";private static String xlsxdirName;private static String xlsxpath;....public static void getfileName(String filepath) throws IOException {//获取目录下所有文件的名字(不包括文件夹)File f3 = new File(filepath);File[] files = f3.listFiles();for (File fi : files){if (fi.isFile()){System.out.println(fi.getName());//fi.renameTo(new File(xlsxdirName+".xlsx"));FileUtils.copyFile(fi,new File(xlsxdirName + ".xlsx"));//FileUtils.delete(fi);}}}
}
运行了下,没反应...找了半天才发现,文件复制+重命名成功了,但是复制到了项目目录下...
行吧...
下面搞遍历,遍历所有目录。
public static void readfile_(String filepath) throws FileNotFoundException, IOException {File file = new File(filepath);String[] list=file.list();for(int i=0;i<list.length;i++){if(file.isDirectory()){System.out.println(list[i]);xlsxdirName=list[i];xlsxpath=filepath + "\\" + xlsxdirName;getfileName(xlsxpath);}}}
很轻松。写个main函数。
整个目录中所有的表格名都被改成提单号了
package com.cecz;import org.apache.commons.io.FileUtils;import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;/*** 目的:输入目录,将目录中所有的文件复制到另外一个目录并将其重命名为目录名* filepath:目录路径* xlsxdirName:目录里所有目录名称* xlsxpath:表格路径* */public class FileDemo {private static String filepath="D:\\test\\2023-05-10";private static String xlsxdirName;private static String xlsxpath;public static void main(String[] args) throws IOException {readfile_(filepath);}public static void readfile_(String filepath) throws FileNotFoundException, IOException {File file = new File(filepath);String[] list=file.list();for(int i=0;i<list.length;i++){if(file.isDirectory()){System.out.println(list[i]);xlsxdirName=list[i];xlsxpath=filepath + "\\" + xlsxdirName;getfileName(xlsxpath);}}}//get目录下的name并将其重命名→输出文件夹:D:\dev-project\IdeaProjects\cecz-excelpublic static void getfileName(String filepath) throws IOException {//获取目录下所有文件的名字(不包括文件夹)File f3 = new File(filepath);File[] files = f3.listFiles();for (File fi : files){if (fi.isFile()){System.out.println(fi.getName());//fi.renameTo(new File(xlsxdirName+".xlsx"));FileUtils.copyFile(fi,new File(xlsxdirName + ".xlsx"));//FileUtils.delete(fi);}}}
}
下面开始搞POI
POI比较轻松,不过长时间不做这个有点记不清了,就去狂神那里看了一i眼。
4、Excel基本读取及注意_哔哩哔哩_bilibili
通过FirstTalent的博客知道了如何获取表格里的总行数
利用poi获取导入的Excel表格一共有多少行数据!!!_poi获取excel行数_FirstTalent的博客-CSDN博客
需要把每行的大包数找出来进行,删除重复的数据
思路是先初始化一个静态数组和一个int类型的count,每遍历一行数据就和数组里的数据进行比对,如果数组里没有的话就直接add进并且count++。遍历完所有行之后遍历数组并取得数组长度
想了一下这有没有什么类库能实现...一拍脑瓜
ArrayList搞得定啊!
找了一篇博客
如何在Java中将String值与String类型的ArrayList进行比较? | 码农家园
list.contains()方法,舒服了!
package com.cpp;import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.jupiter.api.Test;import java.io.*;
import java.util.ArrayList;public class ExcelReadTest {public static int count=0;public static ArrayList<String> list=new ArrayList<>();public static String path="D:\\dev-project\\IdeaProjects\\cecz-excel";public ExcelReadTest() throws FileNotFoundException {}//public static void main(String[] args) throws IOException {//将Java程序的输出结果写到txt文件PrintStream ps = new PrintStream("D:\\log.txt");System.setOut(ps);//sout出的都进log.txt中//遍历所有文件执行testRead07File allFiles = new File(path);String[] list=allFiles.list();for(int i=0;i<list.length;i++){if(allFiles.isDirectory()){if(list[i].endsWith(".xlsx")){System.out.println("================"+list[i]+"=====================");testRead07(list[i]);}}}}public static void testRead07(String fileName) throws IOException {//读取excel文件FileInputStream fileInputStream = new FileInputStream(path+"\\"+fileName);Workbook workbook = new XSSFWorkbook(fileInputStream);Sheet sheet = workbook.getSheetAt(0);
// Row row = sheet.getRow(1);
// Cell cell = row.getCell(1);//获取行数int physicalNumberOfRows = sheet.getPhysicalNumberOfRows();//输出行数到*********控制台System.out.println("行数="+physicalNumberOfRows);//遍历行,做对比for(int i=1;i<physicalNumberOfRows;i++){Row row = sheet.getRow(i);Cell cell = row.getCell(1);
// System.out.println(cell.getStringCellValue());compare(cell.getStringCellValue());}//完成之后返回行数和list中的数据System.out.println("行数:"+list.size());for (String str:list) {//输出比对好的list数据到*******控制台System.out.println(str);}//清除list并count归零list.clear();count=0;}/*** 对比num和数组中的数据,* 如果数组里没有num,则放入,count+1。* 如果有,则不防暑* */public static void compare(String num){if(!list.contains(num)){list.add(num);count++;}}
}
接着遍历目录里所有的文件,并把数据打印在txt文档里。
感谢太閤秀吉的文章
java输出结果到txt_将Java程序的输出结果写到txt文件中的方法_太閤秀吉的博客-CSDN博客
齐活,一个月干一天的工作俩小时搞定了...
下面开始考虑怎么把list里的数据塞进在线表格里的Cell里....
有点麻烦似乎...
使用POI完成Excel数据处理相关推荐
- Java POI 对Excel合并单元格的数据处理
Java POI 对Excel合并单元格的数据处理 最近在项目开发过程中,有个一个导入Excel文件处理合并单元格数据的需求,就自己在网上找了一个模板,自己进行二次开发来开发需求. Excel工具类 ...
- POI进行Excel的合并单元格数据处理
POI进行Excel的合并单元格数据处理 近日接到一个要处理合并Excel单元格的上料表的需求,就到网上找了一些模板,发现有的技术大牛还是挺厉害的,对他们致以敬意. 合并单元格工具类 在这个类中将传入 ...
- POI对Excel自定义日期格式的读取
用POI读取Excel数据:(版本号:POI3.7) 1.读取Excel Java代码 private List<String[]> rosolveFile(InputStream i ...
- java通过poi读取excel中的日期类型数据或自定义类型日期
java通过poi读取excel中的日期类型数据或自定义类型日期 Java 读取Excel表格日期类型数据的时候,读出来的是这样的 12-十月-2019,而Excel中输入的是 2019/10/12 ...
- java利用poi导出excel功能-附带图片导出
java利用poi导出excel功能-附带图片导出 写在前面 最近刚离职,闲来无事,于是把上两家公司都有碰到过的需求但都没有去研究实现:即导出带图片的excel报表.于是就折腾了一下这个功能,研究出来 ...
- POI处理Excel,条形图,散点图,折线图
POI处理Excel,条形图,散点图,折线图 一.引入Maven依赖 二.条形图实现 2.1实现效果展示 2.2 代码实现如下: 三.散点图实现-----对应Excel中的XY散点图 3.1初始数据准 ...
- java通过poi读取excel中的日期类型
1.问题分析 Java 读取Excel表格日期类型数据的时候,读出来的是这样的 12-十月-2020,而Excel中输入的是 2020/10/12 或 2020-10-12 poi处理excel时,当 ...
- POI导出Excel (满满的干货啊)
已经实现的POI导出Excel 步骤一:导入依赖 <dependency><groupId>org.apache.poi</groupId><artifact ...
- POI处理Excel中的日期数据类型
在POI处理Excel中的日期类型的单元格时,如果仅仅是判断它是否为日期类型的话,最终会以NUMERIC类型来处理. 正确的处理方法是先判断单元格 的类型是否则NUMERIC类型, 然后再判断单元格是 ...
最新文章
- 关于问题的讨论不应停留在人的维度上
- 【源代码】基于Android和蓝牙的单片机温度採集系统
- portal for arcgis 10.4的安装和配置及遇到的问题
- VS CRT C标准库函数strrev解析
- php mysql 表关联,mysql的多表关联_MySQL
- Snipaste截图
- java 异步调用方法_乐字节Java编程之方法、调用、重载、递归
- 瑞幸咖啡公布对董事长兼CEO郭谨一调查结果:未发现不当行为
- sqlbulkcopy能用于mysql吗_混凝土自动上料搅拌车能用于农村盖房吗?
- mysql高级用法(函数)
- [转]Why Not Paxos
- 数据蜂巢架构演讲之路读后感
- IOS 开发学习29 Socket框架 AsynSocket的使用
- 数据库系统概论 (王珊.第五版)第七章数据库设计习题答案
- 国密算法简介及电子印章相关标准
- [湖南大学程序设计实训训练作业一]9.二叉树遍历,从前序、中序到后序(二叉树呀,面试必考哦!)
- 百度网盘PC端扫描二维码登录时无法加载二维码问题解决方法
- Andriod Studio 线性布局(LinearLayout)
- 电脑桌面加html格式壁纸,巧妙使用IDM获取精美电脑桌面壁纸
- 在mac上安装md5命令