java 提取excel文件中的数据
1.首先文件转为字节型数组
byte[] bytes = multipartFile.getBytes();
2.
字节数组输入流在内存中创建一个字节数组缓冲区,从输入流读取的数据保存在该字节数组缓冲区中。创建字节数组输入流对象有以下几种方式。
接收字节数组作为参数创建:
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
3.使用的是JAVA POI实现的导出Excel;
POI 提供了对2003版本的Excel的支持 ---- HSSFWorkbook
POI 提供了对2007版本以及更高版本的支持 ---- XSSFWorkbook
定义工作簿
workbook = new XSSFWorkbook(inputStream);
定义工作表
// 默认取第一个子表
xssfSheet = xssfWorkbook.getSheetAt(0);
4.取标题
//定义行 //默认第一行为标题行,index = 0 XSSFRow titleRow = xssfSheet.getRow(0);
5.循环取数据
//循环取每行的数据
for (int rowIndex = 1; rowIndex < xssfSheet.getPhysicalNumberOfRows(); rowIndex++) { XSSFRow xssfRow = xssfSheet.getRow(rowIndex); if (xssfRow == null) { continue; } Map<String, String> map = new LinkedHashMap<String, String>(); //循环取每个单元格(cell)的数据 for (int cellIndex = 0; cellIndex < xssfRow.getPhysicalNumberOfCells(); cellIndex++) { XSSFCell titleCell = titleRow.getCell(cellIndex); XSSFCell xssfCell = xssfRow.getCell(cellIndex); map.put(getString(titleCell),getString(xssfCell)); } list.add(map); }
getLastRowNum
如果sheet中一行数据都没有则返回-1,只有第一行有数据则返回0,最后有数据的行是第n行则返回 n-1;
getPhysicalNumberOfRows
获取有记录的行数,即:最后有数据的行是第n行,前面有m行是空行没数据,则返回n-m;
6.不同类型的单元格分别取不同的数据。
/** * 把单元格的内容转为字符串 * @param xssfCell 单元格 * @return 字符串 */ public static String getString(XSSFCell xssfCell) { if (xssfCell == null) { return ""; } if (xssfCell.getCellTypeEnum() == CellType.NUMERIC) { return String.valueOf(xssfCell.getNumericCellValue()); } else if (xssfCell.getCellTypeEnum() == CellType.BOOLEAN) { return String.valueOf(xssfCell.getBooleanCellValue()); } else { return xssfCell.getStringCellValue(); } }
7.写入
/** * 把内容写入Excel * @param list 传入要写的内容,此处以一个List内容为例,先把要写的内容放到一个list中 * @param outputStream 把输出流怼到要写入的Excel上,准备往里面写数据 */ public static void writeExcel(List<List> list, OutputStream outputStream) { //创建工作簿 XSSFWorkbook xssfWorkbook = null; xssfWorkbook = new XSSFWorkbook(); //创建工作表 XSSFSheet xssfSheet; xssfSheet = xssfWorkbook.createSheet(); //创建行 XSSFRow xssfRow; //创建列,即单元格Cell XSSFCell xssfCell; //把List里面的数据写到excel中 for (int i=0;i<list.size();i++) { //从第一行开始写入 xssfRow = xssfSheet.createRow(i); //创建每个单元格Cell,即列的数据 List sub_list =list.get(i); for (int j=0;j<sub_list.size();j++) { xssfCell = xssfRow.createCell(j); //创建单元格 xssfCell.setCellValue((String)sub_list.get(j)); //设置单元格内容 } } //用输出流写到excel try { xssfWorkbook.write(outputStream); outputStream.flush(); outputStream.close(); }catch (IOException e) { e.printStackTrace(); } }
文学使思想充满血与肉,他比科学和哲学更能给予思想以巨大的明确性和说明性。