java读取Excel文件,笔者认为:从结构上来看,Excel文件是由一个一个的单元格组成的,有点像细胞cell,逐行的排列。那么我们读的时候也应该逐行逐行的读,从左到右的寻找每一个cell。
一、实例代码:
只是实现了一种方式,因为依照读取内容的不同,读取的后想要的操作不同,因此不能苟同全部,只是方法是相通的。
说道Excel文件的结构,这货从数学的角度来说,绝对是一个二维数组,因此我就拿字符串二维数组接受读取后的内容,并每个单元格每个单元格的打印。当然也可以返回三维数组(包含该单元格的位置坐标)。
/**
- 20181105 red_ant
- @param file excel 格式的文件
- @param ignoreRows 读取开头忽略的行数
- @return 读取的结果
*/
public static String[][] readExcelData(File file, int ignoreRows) throws Exception{
List<String[]> result = new ArrayList<String[]>();
int rowSize = 0;
BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
//打开HSSWorkbook
POIFSFileSystem fs = new POIFSFileSystem(in);
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFCell cell = null;
for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) {
HSSFSheet st = wb.getSheetAt(sheetIndex);
//从规定位置,开始逐行读取内容
for (int rowIndex = ignoreRows; rowIndex < st.getLastRowNum(); rowIndex++) {
HSSFRow row = st.getRow(rowIndex);
if(row == null){
continue;
}
int tempRowSize = row.getLastCellNum() + 1;
if(tempRowSize > rowSize){
rowSize = tempRowSize;
}
String[] values = new String[rowSize];
Arrays.fill(values, "");
boolean hasValue = false;
for (short columnIndex = 0; columnIndex < row.getLastCellNum(); columnIndex++) {
String value = "";
cell = row.getCell(columnIndex);
if(cell != null){
//设置字体编码
//cell.setEncoding(HSSFCell.ENCODING_UTF_16);
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
if(HSSFDateUtil.isCellDateFormatted(cell)){
Date date = cell.getDateCellValue();
if(date != null){
value = new SimpleDateFormat("yyyy-MM-dd").format(date);
}else{
value = "";
}
}else{
value = new DecimalFormat("0").format(cell.getNumericCellValue());
}
break;
case HSSFCell.CELL_TYPE_FORMULA:
//导入时如果为公式生成的数据则无值
if(!cell.getStringCellValue().equals("")){
value = cell.getStringCellValue();
}else{
value = cell.getNumericCellValue() + "";
}
break;
case HSSFCell.CELL_TYPE_BLANK:
break;
case HSSFCell.CELL_TYPE_ERROR:
value = "";
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
value = (cell.getBooleanCellValue() == true ? "Y":"N");
break;
default:
value = "";
break;
}
}
if(columnIndex == 0 && value.trim().equals("")){
break;
}
values[columnIndex] = removeSpaceTrim(value);
hasValue = true;
}
if(hasValue){
result.add(values);
}
}
}
in.close();
String[][] returnArray = new String[result.size()][rowSize];
for (int i = 0; i < returnArray.length; i++) {
returnArray[i] = (String[]) result.get(i);
}
return returnArray;
}
/**
* 去掉字符串右边的空格
* @param 要处理的字符串
* @return 处理后的结果
*/
private static String removeSpaceTrim(String value) {
if(StringHelper.isEmpty(value)){
return "";
}
int length = value.length();
for (int i = length - 1; i >= 0; i--) {
if(value.charAt(i) != 0x20){
break;
}
length--;
}
return value.substring(0, length);
}
二、main函数的测试:
File file = new File("D:\\red_ant_file\\20181105\\测试.xls");
try {
String[][] result = AllServiceIsHere.readExcelData(file, 2);
int rowLength = result.length;
for (int i = 0; i < rowLength; i++) {
for (int j = 0; j < result[i].length; j++) {
System.err.println(result[i][j] + "\t\t");
}
System.err.println("$$$$$$$$$$$$$");
}
} catch (Exception e) {
e.printStackTrace();
}
三、演示:
原文地址:http://blog.51cto.com/13479739/2313213
时间: 2024-10-17 20:28:48