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