文本表格文件指定分隔符分列转Excel(java实现)
--【可实现以行为单位去重,指定分隔符分列】
我的需求:
- 嗯,实习中遇到,需要过滤数据然后以指定的列名输出为excel
我是这样解决的:
- 写出到一个文本或者表格文件然后指定分隔符分列的输出excel,因为要要设计到去重处理。不能直接写入,
我需要做的:
- 写一个文本以指定分隔符分列为excel的工具类。
之后输出的样子:
- txt文件,以‘-’作为分割符

- 执行是这个样子

- 输出是这个样子:

也可以对表格文件以指定的列名分列。
具体的思路使用PIO构造,需要的依赖
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.0</version>
</dependency>
具体代码:传递参数为输入文件,输出文件,分割符,列名
package utils; import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import utils.interfaceutils.InputStreamPeocess1; import java.io.*;
import java.util.*; /**
* @author Liruilong
* @return
* @description 文本写入excel
* @date 2020年04月14日 16:04:20
**/ public class POIUtils { private static final String XLS = "xls";
private static final String XLSX = "xlsx";
private static List<String> fileNameExtension = Arrays.asList(XLS, XLSX); /**
* @param inFile 文件输入 : txt
* @param outFile 文件输出位置 :(文件|目录)
* @param splie 分割符 正则匹配,特殊字符需要转义
* @param append 文件存在时的写入方式
* @param columnName
* @return
* @description 文件转换
* @author Liruilong
* @date 2020年04月18日 11:04:51
**/ public static void txt2Excel(File inFile, File outFile, String splie,boolean append, String... columnName) {
List<String> list = txt2List(inFile);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
FileOutputStream fileOutputStream = null;
String fileName = inFile.getName().substring(0, inFile.getName().indexOf("."));
try {
if (!outFile.exists()) {
System.out.println("***************************文件路径错误****************************");
throw new Exception();
} else if (outFile.isDirectory()) {
outFile.mkdirs();
fileOutputStream = new FileOutputStream(outFile.getAbsolutePath() + "\\" + fileName + ".xlsx");
} else {
if (outFile.isFile()) {
String tempFileNameExtension = outFile.getName().substring(outFile.getName().indexOf(".") + 1);
if (fileNameExtension.stream().anyMatch( o ->o.equals(tempFileNameExtension))){
fileOutputStream = new FileOutputStream(outFile,append);
}
fileOutputStream = new FileOutputStream(outFile.getParent() + "\\" + fileName + ".xlsx");
}
}
createExcel(fileName,splie,list,columnName).write(baos);
fileOutputStream.flush();
fileOutputStream.write(baos.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}
} /**
* @param inFile 文件输入 : txt
* @param outFile 文件输出位置 :(文件|目录)
* @param splie 分割符 正则匹配,特殊字符需要转义
* @param columnName 列名
* @return
* @description 以默认方式写入
* @author Liruilong
* @date 2020年04月18日 11:04:51
**/ public static void txt2Excel(File inFile, File outFile, String splie, String... columnName) {
List<String> list = txt2List(inFile);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
FileOutputStream fileOutputStream = null;
String fileName = inFile.getName().substring(0, inFile.getName().indexOf("."));
try {
if (!outFile.exists()) {
System.out.println("***************************文件路径错误****************************");
throw new Exception();
} else if (outFile.isDirectory()) {
outFile.mkdirs();
fileOutputStream = new FileOutputStream(outFile.getAbsolutePath() + "\\" + fileName + ".xlsx");
} else {
if (outFile.isFile()) {
//获取输出文件后缀
String tempFileNameExtension = outFile.getName().substring(outFile.getName().indexOf(".") + 1);
if (fileNameExtension.stream().anyMatch( o ->o.equals(tempFileNameExtension))){
fileOutputStream = new FileOutputStream(outFile,false);
}
fileOutputStream = new FileOutputStream(outFile.getParent() + "\\" + fileName + ".xlsx");
}
}
createExcel(fileName,splie,list,columnName).write(baos);
fileOutputStream.flush();
fileOutputStream.write(baos.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}
} /**
* @param fileName 文件名
* @param splie 分割符 正则匹配,特殊字符需要转义
* @param list 文件转换后的List
* @param columnName 列名
* @return
* @description
* @author Liruilong
* @date 2020年04月18日 11:04:46
**/ public static HSSFWorkbook createExcel(String fileName,String splie,List<String> list,String...columnName) {
//1. 创建一个 Excel 文档
HSSFWorkbook workbook = new HSSFWorkbook();
//2. 创建文档摘要
workbook.createInformationProperties();
//3. 获取并配置文档信息
DocumentSummaryInformation docInfo = workbook.getDocumentSummaryInformation();
//文档类别
docInfo.setCategory(fileName);
//文档管理员
docInfo.setManager("liruilong");
//设置公司信息
docInfo.setCompany("www.liruiong.org");
//4. 获取文档摘要信息
SummaryInformation summInfo = workbook.getSummaryInformation();
//文档标题
summInfo.setTitle(fileName);
//文档作者
summInfo.setAuthor("liruilong");
// 文档备注
summInfo.setComments("本文档由 liruilong 提供");
//5. 创建样式
//创建标题行的样式
HSSFCellStyle headerStyle = workbook.createCellStyle();
headerStyle.setFillForegroundColor(IndexedColors.YELLOW.index);
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
HSSFCellStyle dateCellStyle = workbook.createCellStyle();
dateCellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy"));
HSSFSheet sheet = workbook.createSheet(fileName);
HSSFRow rx = null;
//构造表格框架
rx = sheet.createRow(0);
for (int i = 0; i < columnName.length; i++) {
//设置列的宽度
sheet.setColumnWidth(i, 12 * 456);
//创建标题行
HSSFCell cx = rx.createCell(i);
cx.setCellValue(columnName[i]);
cx.setCellStyle(headerStyle);
}
// 填充数据
for (int i = 0; i < list.size(); i++) {
HSSFRow row = sheet.createRow(i + 1);
String[] tempLine = list.get(i).toString().split(splie);
for (int i1 = 0; i1 < tempLine.length; i1++) {
row.createCell(i1).setCellValue(tempLine[i1]);
}
}
return workbook;
} /**
* @param file
* @param data 每行数据
* @return
* @description 写入excel数据
* @author Liruilong
* @date 2020年04月15日 10:04:40
**/ public static void excelWriter(File file, String... data) {
//获取文件类型
String fileType = file.getName().substring(file.getName().indexOf(".") + 1);
try (POIFSFileSystem poifsFileSystem = new POIFSFileSystem(new FileInputStream(file))) {
Workbook workbook = null;
if (fileType.equalsIgnoreCase(XLS)) {
workbook = new HSSFWorkbook(poifsFileSystem);
} else if (fileType.equalsIgnoreCase(XLSX)) {
workbook = new XSSFWorkbook(file);
}
Sheet sheetAt = workbook.getSheetAt(0);
Row row = sheetAt.getRow(0);
System.out.println("最后一行的行号为:" + sheetAt.getLastRowNum() + "--记录为:" + row.getLastCellNum());
row = sheetAt.createRow(sheetAt.getLastRowNum() + 1);
for (int i = 0; i < data.length; i++) {
row.createCell(i).setCellValue(data[i]);
}
} catch (Exception e) {
e.printStackTrace();
}
} /**
* @param file
* @return
* @description 判断文件的Excel类型,输出Excel对象
* @author Liruilong
* @date 2020年04月15日 10:04:37
**/ public static Workbook getWorkbook(File file) {
Workbook workbook = null;
String fileType = file.getName().substring(file.getName().indexOf(".") + 1);
try (FileInputStream fileInputStream = new FileInputStream(file)) {
if (fileType.equalsIgnoreCase(XLS)) {
workbook = new HSSFWorkbook(fileInputStream);
} else if (fileType.equalsIgnoreCase(XLSX)) {
workbook = new XSSFWorkbook(fileInputStream);
}
} catch (IOException e) {
e.printStackTrace();
}
return workbook;
} /**
* @param file
* @return
* @description 文本文件 --》 内存List
* @author Liruilong
* @date 2020年04月14日 18:04:01
**/ public static List<String> txt2List(File file) {
String string = null;
List<String> txtListAll = new ArrayList<>();
if (!file.exists() || file.isDirectory()) {
System.out.println("***************************文件错误****************************");
} else {
fileToBufferedReader((bufferedReader) -> {
String str = null;
StringBuilder stringBuilder = new StringBuilder();
while ((str = bufferedReader.readLine()) != null) {
// TODO 此处可以书写去重逻辑。
if (!txtListAll.contains(str)) {
txtListAll.add(str);
}
}
}, file);
}
if (txtListAll.size() > 65535) {
System.out.println("***************************行数太多错误****************************");
}
return txtListAll;
} /**
* @param inputStreamPeocess
* @param file
* @return 环绕处理
* @description
* @author Liruilong
* @date 2020年04月14日 16:04:57
**/ public static void fileToBufferedReader(InputStreamPeocess1 inputStreamPeocess, File file) {
try (FileInputStream fileInputStream = new FileInputStream(file)) {
try (InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream)) {
try (BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
inputStreamPeocess.peocess(bufferedReader);
}
}
} catch (IOException e) {
e.printStackTrace();
}
} /**
* @param fileParentPath 文件父路径
* @param shilp 分割符
* @return
* @description 以父目录的形式进行转化,默认输出位置,列名,写入方式
* @author Liruilong
* @date 2020年04月18日 10:04:28
**/ public static void dir2Excel(String fileParentPath, String shilp) {
File[] files = new File(fileParentPath).listFiles();
Arrays.stream(files).forEach(f -> {
txt2Excel(f, f, shilp, "");
});
} /**
* @param fileParentPath 输入文件父路径
* @param outParentPath 输出文件父路径
* @param shilp 分割符
* @return
* @description 以指定输出父目录输出,列名默认
* @author Liruilong
* @date 2020年04月18日 10:04:41
**/ public static void dir2Excel(String fileParentPath, String outParentPath, String shilp) {
File[] files = new File(fileParentPath).listFiles();
Arrays.stream(files).forEach(f -> {
txt2Excel(f, new File(outParentPath), shilp, "");
});
} /**
* @param fileParentPath 输入文件父路径
* @param outParentPath 输出文件父路径
* @param shilp 分割符
* @return
* @description 以指定输出父目录输出,列名指定
* @author Liruilong
* @date 2020年04月18日 10:04:23
**/ public static void dir2Excel(String fileParentPath, String outParentPath, String shilp, String... columnName) {
File[] files = new File(fileParentPath).listFiles();
Arrays.stream(files).forEach(f -> {
txt2Excel(f, new File(outParentPath), shilp, columnName);
});
} /**
* @param filePath 文件路径
* @param shilp 分割符
* @return
* @description 单文件转化,指定分割符,
* @author Liruilong
* @date 2020年04月18日 10:04:08
**/ public static void OneTxt2Excel(String filePath, String shilp) {
File file = new File(filePath);
txt2Excel(file, file, shilp,"");
} /**
* @param filePath
* @param outFilePath
* @param shilp
* @param append
* @return
* @description 单文件转化,指定分割符,写入方式
* @author Liruilong
* @date 2020年04月18日 11:04:07
**/ public static void OneTxt2Excel(String filePath, String outFilePath, String shilp, boolean append) {
File file = new File(filePath);
File outFile = new File(outFilePath);
txt2Excel(file, outFile, shilp,append, "");
} public static void main(String[] args) { /*父目录转换
public static void dir2Excel(String)
public static void dir2Excel(String,String)
public static void dir2Excel(String,String,String[])*/ /* 文件转换
public static void OneTxt2Excel(String,String,boolean)
public static void OneTxt2Excel(String)*/
Arrays.stream(POIUtils.class.getMethods()).forEach( m ->{
System.out.println(m.getName());
}); } }
package utils.interfaceutils; import java.io.BufferedReader;
import java.io.IOException; /**
* @Description :
* @Author: Liruilong
* @Date: 2020/4/14 16:39
*/
@FunctionalInterface
public interface InputStreamPeocess1 {
/**
* @Author Liruilong
* @Description 方法签名 BufferedReader ->String
* @Date 15:47 2020/3/17
* @Param [inputStream]
* @return com.liruilong.demotext.service.utils.InputStream
**/ void peocess(BufferedReader bufferedReader) throws IOException;
}
文本文件转Excel--
文本表格文件指定分隔符分列转Excel(java实现)的更多相关文章
- python读取Excel表格文件
python读取Excel表格文件,例如获取这个文件的数据 python读取Excel表格文件,需要如下步骤: 1.安装Excel读取数据的库-----xlrd 直接pip install xlrd安 ...
- php中读写excel表格文件示例。
测试环境:php5.6.24.这块没啥兼容问题. 需要更多栗子,请看PHPExcel的examples.还是蛮强大的. 读取excel文件. 第一步.下载开源的PHPExcel的类库文件,官方网站是h ...
- pyhton读取 excel表格文件
2019的第一天,忘记昨日之事,迎接新的明天. excel表格文件办公中常用,如通过Python操作这些数据需导入并有序读取这些数据 特随笔,供以后查阅 代码如下: import xlrd # fil ...
- java与Excel (.xls文件) ---使用JXL创建,增添表格文件
由于一些原因要搞一下excel文件,个人感觉poi太难,所以用了JXL(感觉比较简单). 1.添加外部归档 jxl.jar 2. /** 生成的xls文件第一次需要手动选择EXCEL打开* * */ ...
- 【 D3.js 进阶系列 — 1.0 】 CSV 表格文件的读取
在入门系列的教程中.我们经常使用 d3.json() 函数来读取 json 格式的文件.json 格式非常强大.但对于普通用户可能不太适合,普通用户更喜欢的是用 Microsoft Excel 或 O ...
- JAVA之编码---->CSV在文本下是正常的,用EXCEL打开是乱码的问题
JAVA之编码---->CSV在文本下是正常的,用EXCEL打开是乱码的问题 在JAVA下输出文件流,保存成CSV(用UTF-8)文件,怎么处理用EXCEL下是乱码,但是在记事本等其他软件都是正 ...
- [原创]VBA实现汇总excel,将多个Excel文件内容复制到一个Excel文件中
功能:遍历用户指定的文件夹,把文件夹中所有的excel文件的第一个表格的数据复制到本excel文件中.注意,每个excel文件中有效数据行的判断标准是A列的最后一个有数据的单元格的行号,比如A列到第1 ...
- 如何使用免费控件将Word表格中的数据导入到Excel中
我通常使用MS Excel来存储和处理大量数据,但有时候经常会碰到一个问题—我需要的数据存储在word表格中,而不是在Excel中,这样处理起来非常麻烦,尤其是在数据比较庞大的时候, 这时我迫切地需要 ...
- atitit.sql server2008导出导入数据库大的表格文件... oracle mysql
atitit.sql server2008导出导入数据库大的表格文件... 1. 超过80M的文件是不能在查询分析器中执行的 1 2. Oracle ,mysql大的文件导入 1 2.1. 使用sql ...
随机推荐
- java-字节流练习(新手)
参考手册: 关键字: FileInputStream() Input是从硬盘到内存 FileOutputStream() 而output是从内存到硬盘,所以实现了复制粘贴. read() 调用方法读取 ...
- VS2019 C++动态链接库的创建使用(4) - C语言客户端
前面提到过C++具有函数重载功能,所以引出的函数名会有变化,即名称改编,如果是C语言编写的客户端则无法正确识别. 处理方法: ①只需在宏定义中间增加 extern "C",但这种使 ...
- 「 Offer收割机之JVM」:生存还是毁灭
这两天,广州的天气又开始热了起来,又到了小动物交配的季节,啊呸,又到了一个收割 offer 的季节.年底将至,又到了面试的高峰期,JVM 作为Java 程序员面试绕不过的一道坎儿,它又来了,你准备好了 ...
- [转载]-虚拟键值表-virtual key code
转载 虚拟键值表, virtual key code Virtual-Key Codes VK_LBUTTON (01)Left mouse button VK_RBUTTON (02)Right ...
- DNS提供的服务
DNS提供的服务 DNS是:1.一个由分层的DNS服务器实现的分布式数据库:2. 一个使主机能够查询分布式数据库的应用协议.DNS协议运行在UDP上,使用53号端口. 与http,FTP,SMTP协议 ...
- 为什么你的程序配了classpath还是找不到类
classpath简介 classpath是java程序时拥有的一个系统变量,这个变量可以通过如下方式获取 System.out.println(System.getProperty("ja ...
- python使用matplotlib:subplot绘制多个子图 不规则画图
https://www.cnblogs.com/xiaoboge/p/9683056.html
- Hive支持的文件格式和压缩格式及各自特点
Hive中的文件格式 1-TEXTFILE 文本格式,Hive的默认格式,数据不压缩,磁盘开销大.数据解析开销大. 对应的hive API为:org.apache.hadoop.mapred.Text ...
- OpenCV-Python 如何使用背景分离方法 | 四十六
目标 背景分离(BS)是一种通过使用静态相机来生成前景掩码(即包含属于场景中的移动对象像素的二进制图像)的常用技术. 顾名思义,BS计算前景掩码,在当前帧与背景模型之间执行减法运算,其中包含场景的静态 ...
- 一个完整的机器学习项目在Python中演练(四)
大家往往会选择一本数据科学相关书籍或者完成一门在线课程来学习和掌握机器学习.但是,实际情况往往d是,学完之后反而并不清楚这些技术怎样才能被用在实际的项目流程中.就像你的脑海中已经有了一块块" ...