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