文本表格文件指定分隔符分列转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 ...
随机推荐
- burpsuit之Spider、Scanner、Intruder模块
1.spider模块 1.spider模块介绍 被动爬网:(被动爬网获得的链接是手动爬网的时候返回页面的信息中分析发现超链接) 对于爬网的时候遇到HTML表单如何操作: 需要表单身份认证时如何操作(默 ...
- 学习webpack基础笔记01
学习webpack基础笔记 1.webpack搭建环境最重要的就是如何使用loader和plugins,使用yarn/npm安装插件.预处理器,正确的配置好去使用 2.从0配置webpack - 1. ...
- 4. selenium中鼠标和键盘操作
一.鼠标操作 第一步:引入模块函数 from selenium.webdriver.common.action_chains import ActionChains 第二步:元素定位 element ...
- mvc+ef入门(三)
(1)新建一个DAL层用来放置Accountcontext.cs和Accountinitializer.新建一个models层用来归放sysuser,sysrole和sysuserrole,三个类.( ...
- [源码分析] 从实例和源码入手看 Flink 之广播 Broadcast
[源码分析] 从实例和源码入手看 Flink 之广播 Broadcast 0x00 摘要 本文将通过源码分析和实例讲解,带领大家熟悉Flink的广播变量机制. 0x01 业务需求 1. 场景需求 对黑 ...
- OpenCV-Python 理解特征 | 三十六
目标 在本章中,我们将尝试理解什么是特征,为什么拐角重要等等 解释 你们大多数人都会玩拼图游戏.你会得到很多小图像,需要正确组装它们以形成大的真实图像.问题是,你怎么做?将相同的理论投影到计算机程序上 ...
- TensorFlow 安装官方教程:Ubuntu 安装,Mac OS X 安装,Windows 安装
从我的使用体验来看 Ubuntu 是最好的, Mac 没有显卡,后期跑大项目比较鸡肋,Windows 安装各种依赖各种坑.Ubuntu 安装 TensorFlow 方便,后面安装 TensorFl ...
- NeurIPS审稿引发吐槽大会,落选者把荒唐意见怼了个遍:“我谢谢你们了”
七月份的尾巴,机器学习顶会NeurIPS 2019的初步结果已经来了. 一年一度的吐槽盛会也由此开始. "有评审问我啥是ResNet." "有评审问我为啥没引用X论文.我 ...
- Git使用的一些问题:.gitignore规则不生效、git同步代码至github和gitee
Git忽略规则及.gitignore规则不生效的解决办法 .gitignore 的基本使用 在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件 ...
- SuperMap许可常见问题及解决办法
一.试用许可申请可以直接在北京超图软件股份有限公司官网的“SuperMap 技术资源中心”申请试用许可,申请后您将获得:1.如果申请的是 SuperMap GIS 7C 系列产品的许可,您将获得 一个 ...