文件常量类,文件类型相关的常量
package com.lijinquan.fileparse;
/**
* 文件常量
*
* @author lijinquan
*
*/
public interface IFileBasic
{
public static final String File_Type_CSV = "csv";
public static final String File_Type_XLS = "xls";
public static final String File_Type_XLSX="xlsx";
}
解析操作类
package common.lijinquan.utility;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.lijinquan.fileparse.IFileBasic;
/**
*
* CSV文件解析操作类
*
* @author lijinquan
*
*/
public class CSVAnalysis
{
private InputStreamReader fr = null;
private BufferedReader br = null;
private String fistSheetName = null;
public CSVAnalysis(String f) throws IOException {
fr = new InputStreamReader(new FileInputStream(f));
File file = new File(f);
setFistSheetName(file.getName().toLowerCase().replace("."+IFileBasic.File_Type_CSV, ""));
}
public CSVAnalysis(File objfile) throws IOException
{
fr = new InputStreamReader(new FileInputStream(objfile));
setFistSheetName(objfile.getName().toLowerCase().replace("."+IFileBasic.File_Type_CSV, ""));
}
public CSVAnalysis(File objfile,String encode) throws IOException
{
fr = new InputStreamReader(new FileInputStream(objfile),encode);
setFistSheetName(objfile.getName().toLowerCase().replace("."+IFileBasic.File_Type_CSV, ""));
}
/**
* 解析csv文件 到一个list中
* 每个单元个为一个String类型记录,每一行为一个list。
* 再将所有的行放到一个总list中
* @return
* @throws IOException
*/
public List<List<String>> readCSVFile() throws IOException {
br = new BufferedReader(fr);
String rec = null;//一行
String str;//一个单元格
List<List<String>> listFile = new ArrayList<List<String>>();
try {
//读取一行
while ((rec = br.readLine()) != null) {
//补加逗号,用于解决xls文件变为csv文件的解析
if(!rec.endsWith(","))
{
rec = rec + ",";
}
Pattern pCells = Pattern.compile("(\"[^\"]*(\"{2})*[^\"]*\")*[^,]*,");
Matcher mCells = pCells.matcher(rec);
List<String> cells = new ArrayList<String>();//每行记录一个list
//读取每个单元格
while (mCells.find()) {
str = mCells.group();
//csv文件逗号分割符处理
if(str.endsWith(","))
{
int iend = str.lastIndexOf(",");
str = str.substring(0, iend);
}
//正则表达式处理
str = str.replaceAll("(?sm)\"?([^\"]*(\"{2})*[^\"]*)\"?.*,", "$1");
str = str.replaceAll("(?sm)(\"(\"))", "$2");
//csv文件双引号处理
str = str.replaceAll("\"\"", "\"");
str = str.replaceAll("\" \"", "\"");
cells.add(str);
}
listFile.add(cells);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fr != null) {
fr.close();
}
if (br != null) {
br.close();
}
}
return listFile;
}
public String getFistSheetName() {
return fistSheetName;
}
public void setFistSheetName(String fistSheetName) {
this.fistSheetName = fistSheetName;
}
public static void main(String[] args) throws IOException
{
CSVAnalysis parser = new CSVAnalysis("C:/0000000000000.csv");
List<List<String>> result = parser.readCSVFile();
if(result != null)
{
for(int i = 0 ; i < result.size(); i++)
{
List<String> list1 = result.get(i);
System.out.print(i+": ");
for(String cell : list1)
{
System.out.print(" |"+cell+"| ");
}
System.out.println(" *");
}
}
}
}
创建一个接口,后面csv文件操作类继承此类
package com.globex.supplier.logic.fileparse;
import java.util.List;
import java.util.Map;
/**
* 文件操作接口
*
* @author lijinquan
*
*/
public interface IFileOperation
{
/**
* 获取文件列头
*
* @return 文件列头
*/
public String[] getColumnHeaders();
/**
* 获取文件内容数据
*
* @return 文件内容数据
*/
public List<String[]> getFileContentData();
/**
* 获取用map形式组装的数据列表
* @author lijinquan
* @since 2017年12月15日
* @return
*/
public List<Map<String,String>> getFileContentDataMap();
/**
* 获取文件所有数据
*
* @return 文件所有数据
*/
public List<String[]> getFileData();
/**
* 获取文件的第一个sheet名字
* @return
*/
public String getFirstSheetName();
}
csv文件操作类实现类
package com.lijinquan.fileparse;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import common.lijinuqan.CSVAnalysis;
/**
* CSV文件操作类
*
* @author lijinquan
*
*/
public class CSVFileOperation implements IFileOperation
{
/**
* CSV文件里的标题
*/
private String[] columnHeaders;
/**
* CSV文件内容
*/
private List<String[]> fileContentData;
/**
* CSV文件里所有数据
*/
private List<String[]> fileData;
/**
* 第一个sheet名字
*/
private String fistSheetName;
public CSVFileOperation(String uploadfile) throws FileOperationException
{
try
{
CSVAnalysis objCSVAnalys = new CSVAnalysis(uploadfile);
init(objCSVAnalys);
} catch (IOException e)
{
throw new FileOperationException(e);
}
}
public CSVFileOperation(File objfile) throws FileOperationException
{
try
{
CSVAnalysis objCSVAnalys = new CSVAnalysis(objfile);
init(objCSVAnalys);
} catch (IOException e)
{
throw new FileOperationException(e);
}
}
/**
* 对CSV文件进行解析
*
* @param objCSVAnalysis
* @throws FileOperationException
*/
public void init(CSVAnalysis objCSVAnalysis) throws FileOperationException
{
try
{
List<List<String>> result = objCSVAnalysis.readCSVFile();
if(result != null && result.size() > 0)
{
fileData = new ArrayList<String[]>();
for(int i = 0 ; i < result.size(); i++)
{
List<String> list = result.get(i);
String[] arrtemp = new String[list.size()];
arrtemp = list.toArray(arrtemp);
fileData.add(arrtemp);
}
columnHeaders = fileData.get(0);
fileContentData = new ArrayList<String[]>();
fileContentData.addAll(fileData);
fileContentData.remove(0);
}
setFistSheetName(objCSVAnalysis.getFistSheetName());
} catch (IOException e)
{
throw new FileOperationException(e);
}
}
public String[] getColumnHeaders()
{
return columnHeaders;
}
public List<String[]> getFileContentData()
{
return fileContentData;
}
public List<String[]> getFileData()
{
return fileData;
}
public String getFirstSheetName() {
return fistSheetName;
}
public void setFistSheetName(String fistSheetName) {
this.fistSheetName = fistSheetName;
}
@Override
public List<Map<String, String>> getFileContentDataMap() {
return null;
}
}
定义一个工厂类,方便处理不同文件类型
package com.lijinquan.fileparse;
import java.io.File;
/**
* excel文件解析工厂类
*
* @author lijinquan
*
*/
public class FileParseFatory
{
/**
* 获得订单文件操作对象
*
* @param fileType 文件类型
* @param uploadFile 文件路径,用于建立文件对象
* @return 文件操作对象
* @throws FileOperationException
*/
public static IFileOperation getFileOperation(String fileType, String uploadFile) throws FileOperationException
{
if(IFileBasic.File_Type_CSV.equalsIgnoreCase(fileType))
{
return new CSVFileOperation(uploadFile);
}else if(IFileBasic.File_Type_XLS.equalsIgnoreCase(fileType))
{
return new ExcelFileOperation(uploadFile);
}else if(IFileBasic.File_Type_XLSX.equalsIgnoreCase(fileType))
{
return new XExcelFileOperation(uploadFile);
}else
{
return null;
}
}
/**
* 获得订单文件操作对象
*
* @param fileType 文件类型
* @param upFile 文件对象
* @return 文件操作对象
* @throws FileOperationException
*/
public static IFileOperation getFileOperation(String fileType, File upFile) throws FileOperationException{
return getFileOperation(fileType,upFile,false);
}
public static IFileOperation getFileOperation(String fileType, File upFile,boolean assemMap) throws FileOperationException
{
if(IFileBasic.File_Type_CSV.equalsIgnoreCase(fileType))
{
return new CSVFileOperation(upFile);
}else if(IFileBasic.File_Type_XLS.equalsIgnoreCase(fileType))
{
return new ExcelFileOperation(upFile,assemMap);
}else if(IFileBasic.File_Type_XLSX.equalsIgnoreCase(fileType))
{
return new XExcelFileOperation(upFile);
}
else
{
return null;
}
}
}
到这里,只需要以下步骤进行调用即可
public static void main(String[] args) {
File file= new File("E://abc/def.csv");
String strFileType= "csv";
IFileOperation objFileOperation = FileParseFatory.getFileOperation(strFileType, file);
//获取表头
String[] columnHeaders = objFileOperation.getColumnHeaders();
//获取行内容
List<String[]> roLineContentData = objFileOperation.getFileContentData();
}
相关链接 详细整理java jxl包读取excel文件点击这里