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();
	}

三、演示: