java读取Excel文件,笔者认为:从结构上来看,Excel文件是由一个一个的单元格组成的,有点像细胞cell,逐行的排列。那么我们读的时候也应该逐行逐行的读,从左到右的寻找每一个cell。
一、实例代码:
只是实现了一种方式,因为依照读取内容的不同,读取的后想要的操作不同,因此不能苟同全部,只是方法是相通的。
说道Excel文件的结构,www.acgred.cn这货从数学的角度来说,绝对是一个二维数组,因此我就拿字符串二维数组接受读取后的内容,并每个单元格每个单元格的打印。当然也可以返回三维数组(包含该单元格的位置坐标)。
/**
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(); }
三、演示:
©著作权归作者所有:来自51CTO博客作者Red_Ant_hoyl的原创作品,如需转载,请与作者联系,否则将追究法律责任