版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25034451/article/details/79385751
做自动化报表收集,少不了读取CSV、xls、xlsx文件,以下用Java语言读取这些数据。
首先用到的jar包
dom4j-1.6.1.jar
geronimo-stax-api_1.0_spec-1.0.jar
opencsv-2.3.jar
poi-3.7-20101029.jar
poi-examples-3.7-20101029.jar
poi-ooxml-3.7-20101029.jar
poi-ooxml-schemas-3.7-20101029.jar
poi-scratchpad-3.7-20101029.jar
xmlbeans-2.3.0.jar
下载地址:http://download.csdn.net/download/qq_25034451/10261070
读取CSV文件
try {
FileReader fReader;
fReader = new FileReader(file);
CSVReader csvReader = new CSVReader(fReader);
List<String[]> list = csvReader.readAll();
csvReader.close();l
return rowList;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
读取的数据将保存在list 中,然后我们可以处理了。
读取xls文件
try{
//创建存储数据数组
ArrayList<ArrayList<Object>> rowList = new ArrayList<ArrayList<Object>>();
//一行的对象数组
ArrayList<Object> colList;
//工作文件
HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(file));
//工作表0
HSSFSheet sheet = wb.getSheetAt(0);
//行变量
HSSFRow row;
//单元格变量
HSSFCell cell;
//值变量
Object value;
//从第0行起,读取每一行数据
for(int i = 0 ; i < sheet.getLastRowNum() ; i++ ){
//获取i行数据
row = sheet.getRow(i);
//创建用于存储这一行数据的数组
colList = new ArrayList<Object>();
//若为空,则添加数组大小为0的数据行
if(row == null){
rowList.add(colList);
continue;
}
//遍历一行数据
for( int j = 0 ; j <row.getLastCellNum() ;j++){
//获取单元格
cell = row.getCell(j);
if(cell == null || cell.getCellType() == HSSFCell.CELL_TYPE_BLANK){
//当该单元格为空
colList.add("");
continue;
}
//根据单元格数据类型获取String值
switch(cell.getCellType()){
case XSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case XSSFCell.CELL_TYPE_NUMERIC:
if ("@".equals(cell.getCellStyle().getDataFormatString())) {
value = df.format(cell.getNumericCellValue());
} else if ("General".equals(cell.getCellStyle()
.getDataFormatString())) {
value = nf.format(cell.getNumericCellValue());
} else {
value = sdf.format(HSSFDateUtil.getJavaDate(cell
.getNumericCellValue()));
}
break;
case XSSFCell.CELL_TYPE_BOOLEAN:
value = Boolean.valueOf(cell.getBooleanCellValue());
break;
case XSSFCell.CELL_TYPE_BLANK:
value = "";
break;
default:
value = cell.toString();
}// end switch
colList.add(value);
}//end for j
rowList.add(colList);
}//end for i
return rowList;
}catch(Exception e){
return null;
}
数据存储在rowList 中,根据需求做相应的处理
读取xlsx文件
与xls文件类似,但改变了类
try{
ArrayList<ArrayList<Object>> rowList = new ArrayList<ArrayList<Object>>();
ArrayList<Object> colList;
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(file));
XSSFSheet sheet = wb.getSheetAt(0);
XSSFRow row;
XSSFCell cell;
Object value;
for(int i =0 ; i < sheet.getLastRowNum(); i++ ){
row = sheet.getRow(i);
colList = new ArrayList<Object>();
if(row == null){
rowList.add(colList);
continue;
}
for( int j = 0 ; j < row.getLastCellNum() ;j++){
cell = row.getCell(j);
if(cell == null || cell.getCellType() == HSSFCell.CELL_TYPE_BLANK){
colList.add("");
continue;
}
switch(cell.getCellType()){
case XSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case XSSFCell.CELL_TYPE_NUMERIC:
if ("@".equals(cell.getCellStyle().getDataFormatString())) {
value = df.format(cell.getNumericCellValue());
} else if ("General".equals(cell.getCellStyle()
.getDataFormatString())) {
value = nf.format(cell.getNumericCellValue());
} else {
value = sdf.format(HSSFDateUtil.getJavaDate(cell
.getNumericCellValue()));
}
break;
case XSSFCell.CELL_TYPE_BOOLEAN:
value = Boolean.valueOf(cell.getBooleanCellValue());
break;
case XSSFCell.CELL_TYPE_BLANK:
value = "";
break;
default:
value = cell.toString();
}// end switch
colList.add(value);
}//end for j
rowList.add(colList);
}//end for i
return rowList;
}catch(Exception e){
e.printStackTrace();
return null;
}
为了做出统一个工具类,对CSV文件的读写做更改
try {
ArrayList<ArrayList<Object>> rowList = new ArrayList<ArrayList<Object>>();
ArrayList<Object> colList;
FileReader fReader;
fReader = new FileReader(file);
CSVReader csvReader = new CSVReader(fReader);
List<String[]> list = csvReader.readAll();
for(String[] ss : list){
colList =new ArrayList<Object>(Arrays.asList(ss));
rowList.add(colList);
}
csvReader.close();
return rowList;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
完整的工具类
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import au.com.bytecode.opencsv.CSVReader;
public class ExcelUtil {
//默认单元格内容为数字时格式
private static DecimalFormat df = new DecimalFormat("0");
// 默认单元格格式化日期字符串
private static SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss");
// 格式化数字
private static DecimalFormat nf = new DecimalFormat("0.00");
public static ArrayList<ArrayList<Object>> readExcel(File file){
if(file == null){
return null;
}
if(file.getName().endsWith("xlsx")){
//处理ecxel2007
return readExcel2007(file);
}else if(file.getName().endsWith("xls")) {
//处理ecxel2003
return readExcel2003(file);
}else if(file.getName().endsWith("csv")){
//处理csv文件
return readCSV(file);
}else{
return null;
}
}
/**
* 读取CSV文件
* @param file
* @return
*/
private static ArrayList<ArrayList<Object>> readCSV(File file) {
try {
ArrayList<ArrayList<Object>> rowList = new ArrayList<ArrayList<Object>>();
ArrayList<Object> colList;
FileReader fReader;
fReader = new FileReader(file);
CSVReader csvReader = new CSVReader(fReader);
List<String[]> list = csvReader.readAll();
for(String[] ss : list){
colList =new ArrayList<Object>(Arrays.asList(ss));
rowList.add(colList);
}
csvReader.close();
return rowList;
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
public static ArrayList<ArrayList<Object>> readExcel2003(File file){
try{
//创建存储数据数组
ArrayList<ArrayList<Object>> rowList = new ArrayList<ArrayList<Object>>();
//一行的对象数组
ArrayList<Object> colList;
//工作文件
HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(file));
//工作表0
HSSFSheet sheet = wb.getSheetAt(0);
//行变量
HSSFRow row;
//单元格变量
HSSFCell cell;
//值变量
Object value;
//从第0行起,读取每一行数据
for(int i = 0 ; i < sheet.getLastRowNum() ; i++ ){
//获取i行数据
row = sheet.getRow(i);
//创建用于存储这一行数据的数组
colList = new ArrayList<Object>();
//若为空,则添加数组大小为0的数据行
if(row == null){
rowList.add(colList);
continue;
}
//遍历一行数据
for( int j = 0 ; j <row.getLastCellNum() ;j++){
//获取单元格
cell = row.getCell(j);
if(cell == null || cell.getCellType() == HSSFCell.CELL_TYPE_BLANK){
//当该单元格为空
colList.add("");
continue;
}
//根据单元格数据类型获取String值
switch(cell.getCellType()){
case XSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case XSSFCell.CELL_TYPE_NUMERIC:
if ("@".equals(cell.getCellStyle().getDataFormatString())) {
value = df.format(cell.getNumericCellValue());
} else if ("General".equals(cell.getCellStyle()
.getDataFormatString())) {
value = nf.format(cell.getNumericCellValue());
} else {
value = sdf.format(HSSFDateUtil.getJavaDate(cell
.getNumericCellValue()));
}
break;
case XSSFCell.CELL_TYPE_BOOLEAN:
value = Boolean.valueOf(cell.getBooleanCellValue());
break;
case XSSFCell.CELL_TYPE_BLANK:
value = "";
break;
default:
value = cell.toString();
}// end switch
colList.add(value);
}//end for j
rowList.add(colList);
}//end for i
return rowList;
}catch(Exception e){
return null;
}
}
public static ArrayList<ArrayList<Object>> readExcel2007(File file){
try{
ArrayList<ArrayList<Object>> rowList = new ArrayList<ArrayList<Object>>();
ArrayList<Object> colList;
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(file));
XSSFSheet sheet = wb.getSheetAt(0);
XSSFRow row;
XSSFCell cell;
Object value;
for(int i =0 ; i < sheet.getLastRowNum(); i++ ){
row = sheet.getRow(i);
colList = new ArrayList<Object>();
if(row == null){
rowList.add(colList);
continue;
}
for( int j = 0 ; j < row.getLastCellNum() ;j++){
cell = row.getCell(j);
if(cell == null || cell.getCellType() == HSSFCell.CELL_TYPE_BLANK){
colList.add("");
continue;
}
switch(cell.getCellType()){
case XSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case XSSFCell.CELL_TYPE_NUMERIC:
if ("@".equals(cell.getCellStyle().getDataFormatString())) {
value = df.format(cell.getNumericCellValue());
} else if ("General".equals(cell.getCellStyle()
.getDataFormatString())) {
value = nf.format(cell.getNumericCellValue());
} else {
value = sdf.format(HSSFDateUtil.getJavaDate(cell
.getNumericCellValue()));
}
break;
case XSSFCell.CELL_TYPE_BOOLEAN:
value = Boolean.valueOf(cell.getBooleanCellValue());
break;
case XSSFCell.CELL_TYPE_BLANK:
value = "";
break;
default:
value = cell.toString();
}// end switch
colList.add(value);
}//end for j
rowList.add(colList);
}//end for i
return rowList;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
public static DecimalFormat getDf() {
return df;
}
public static void setDf(DecimalFormat df) {
CopyOfExcelUtil.df = df;
}
public static SimpleDateFormat getSdf() {
return sdf;
}
public static void setSdf(SimpleDateFormat sdf) {
CopyOfExcelUtil.sdf = sdf;
}
public static DecimalFormat getNf() {
return nf;
}
public static void setNf(DecimalFormat nf) {
CopyOfExcelUtil.nf = nf;
}
}
使用方法:
File file = new File(path);
ArrayList<ArrayList<Object>> result = ExcelUtil.readExcel(file);