Excel文件的上傳和下載

一、需要準備的maven依賴:

        <dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi</artifactId>
		<version>3.14</version>
	</dependency>
	<dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi-ooxml</artifactId>
		<version>3.14</version>
	</dependency>

	<dependency>
		<groupId>commons-lang</groupId>
		<artifactId>commons-lang</artifactId>
		<version>2.6</version>
	</dependency>

二、準備的jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="s" %>
<%
  	String path = request.getContextPath();
  	String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
  			+ path + "/";
  %>
</head>
<body>
<form name="form" METHOD="POST" ACTION="/ReadExcel/dealExcel/upload" ENCTYPE="multipart/form-data">
    請選擇你要上傳的文件:<input name="attach" type="FILE" id="attach" size="50" ><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

三、需要的util類:

package com.sunzy.project.xlsx.util;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class POIUtil
{
	 private final static String xls = "xls";
	    private final static String xlsx = "xlsx";
	    /**
	     * 讀入excel文件,解析後返回
	     * @param file
	     * @throws IOException
	     */
	    public static List<String[]> readExcel(MultipartFile file) throws IOException {
	        //檢查文件
	        checkFile(file);
	        //獲得Workbook工作薄對象
	        Workbook workbook = getWorkBook(file);
	        //創建返回對象,把每行中的值作爲一個數組,所有行作爲一個集合返回
	        List<String[]> list = new ArrayList<String[]>();
	        if(workbook != null){
	            for(int sheetNum = 0;sheetNum < workbook.getNumberOfSheets();sheetNum++){
	                //獲得當前sheet工作表
	                Sheet sheet = workbook.getSheetAt(sheetNum);
	                if(sheet == null){
	                    continue;
	                }
	                //獲得當前sheet的開始行
	                int firstRowNum  = sheet.getFirstRowNum();
	                //獲得當前sheet的結束行
	                int lastRowNum = sheet.getLastRowNum();
	                //循環除了第一行的所有行
	                for(int rowNum = firstRowNum+1;rowNum <= lastRowNum;rowNum++){
	                    //獲得當前行
	                    Row row = sheet.getRow(rowNum);
	                    if(row == null){
	                        continue;
	                    }
	                    //獲得當前行的開始列
	                    int firstCellNum = row.getFirstCellNum();
	                    //獲得當前行的列數
	                    int lastCellNum = row.getPhysicalNumberOfCells();
	                    String[] cells = new String[row.getPhysicalNumberOfCells()];
	                    //循環當前行
	                    for(int cellNum = firstCellNum; cellNum < lastCellNum;cellNum++){
	                        Cell cell = row.getCell(cellNum);
	                        cells[cellNum] = getCellValue(cell);
	                    }
	                    list.add(cells);
	                }
	            }
	            workbook.close();
	        }
	        return list;
	    }

	    public static void checkFile(MultipartFile file) throws IOException{
	        //判斷文件是否存在
	        if(null == file){
	            throw new FileNotFoundException("文件不存在!");
	        }
	        //獲得文件名
	        String fileName = file.getOriginalFilename();
	        //判斷文件是否是excel文件
	        if(!fileName.endsWith(xls) && !fileName.endsWith(xlsx)){
	            throw new IOException(fileName + "不是excel文件");
	        }
	    }

	    public static Workbook getWorkBook(MultipartFile file) {
	        //獲得文件名
	        String fileName = file.getOriginalFilename();
	        //創建Workbook工作薄對象,表示整個excel
	        Workbook workbook = null;
	        try {
	            //獲取excel文件的io流
	            InputStream is = file.getInputStream();
	            //根據文件後綴名不同(xls和xlsx)獲得不同的Workbook實現類對象
	            if(fileName.endsWith(xls)){
	                //2003
	                workbook = new HSSFWorkbook(is);
	            }else if(fileName.endsWith(xlsx)){
	                //2007
	                workbook = new XSSFWorkbook(is);
	            }
	        } catch (IOException e) {
	        }
	        return workbook;
	    }

	    public static String getCellValue(Cell cell){
	        String cellValue = "";
	        if(cell == null){
	            return cellValue;
	        }
	        //把數字當成String來讀,避免出現1讀成1.0的情況
	        if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){
	            cell.setCellType(Cell.CELL_TYPE_STRING);
	        }
	        //判斷數據的類型
	        switch (cell.getCellType()){
	            case Cell.CELL_TYPE_NUMERIC: //數字
	                cellValue = String.valueOf(cell.getNumericCellValue());
	                break;
	            case Cell.CELL_TYPE_STRING: //字符串
	                cellValue = String.valueOf(cell.getStringCellValue());
	                break;
	            case Cell.CELL_TYPE_BOOLEAN: //Boolean
	                cellValue = String.valueOf(cell.getBooleanCellValue());
	                break;
	            case Cell.CELL_TYPE_FORMULA: //公式
	                cellValue = String.valueOf(cell.getCellFormula());
	                break;
	            case Cell.CELL_TYPE_BLANK: //空值
	                cellValue = "";
	                break;
	            case Cell.CELL_TYPE_ERROR: //故障
	                cellValue = "非法字符";
	                break;
	            default:
	                cellValue = "未知類型";
	                break;
	        }
	        return cellValue;
	    }
}

四、最後是driver,具有上傳和下載的功能:

package com.sunzy.project.xlsx;

import java.io.OutputStream;
import java.util.Arrays;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

@Controller
@RequestMapping(value = "dealExcel")
public class DealExcel {

	
	@RequestMapping(value = "upload")
	public void upload(HttpServletRequest request, HttpServletResponse response) throws Exception {
		MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;
	    MultipartFile file = mRequest.getFile("file");
	    Workbook workbook = Workbook.getWorkbook(file.getInputStream());
	    //遍歷Sheet頁
	    Arrays.stream(workbook.getSheets())
	        .forEach(sheet -> {
	          int size = sheet.getRows();
	          for(int i=0; i<size; i++){
	            //遍歷每一行,讀取每列信息
	            Arrays.stream(sheet.getRow(i)).forEach(cell -> System.out.print(cell.getContents()+" "));
	            System.out.println();
	          }
	        });
	    workbook.close();
	    response.setHeader("Content-Disposition", "attachment; filename=return.xls");
	    WritableWorkbook writableWorkbook = ExcelUtils.createTemplate(response.getOutputStream());
	    writableWorkbook.write();
	    writableWorkbook.close();
	}
	
	@RequestMapping(value = "download")
	public void download(HttpServletRequest request, HttpServletResponse response) throws Exception{
	    response.setHeader("Content-Disposition", "attachment; filename=template.xls");
	    WritableWorkbook writableWorkbook = ExcelUtils.createTemplate(response.getOutputStream());
	    writableWorkbook.write();
	    writableWorkbook.close();
	  }
	
	static class ExcelUtils {
	    public static WritableWorkbook createTemplate(OutputStream output) throws Exception {
	      WritableWorkbook writableWorkbook= Workbook.createWorkbook(output);
	      WritableSheet wsheet = writableWorkbook.createSheet("測試title", 0);
	 
	      writableWorkbook.getSheet(0).getCell(1, 0).getCellFormat();
	      WritableCellFormat wc = new WritableCellFormat();
	      // 設置居中
	      wc.setAlignment(Alignment.CENTRE);
	      // 設置邊框線
//	    wc.setBorder(Border.ALL, BorderLineStyle.THIN);
	      wc.setBackground(jxl.format.Colour.GREEN);
	 
	      Label nc0 = new Label(0, 0, "卡號",wc);//Label(x,y,z)其中x代表單元格的第x+1列,第y+1行, 單元格的內容是z
	      Label nc1 = new Label(1, 0, "金額",wc);
	 
	      Label nc3 = new Label(0, 1, "12312311231231");
	      Label nc4 = new Label(1, 1, "100");
	 
	      Label nc5 = new Label(0, 2, "12312311231200");
	      Label nc6 = new Label(1, 2, "100");
	      
	      wsheet.addCell(nc0);
	      wsheet.addCell(nc1);
	      wsheet.addCell(nc3);
	      wsheet.addCell(nc4);
	      wsheet.addCell(nc5);
	      wsheet.addCell(nc6);
	 
	      return writableWorkbook;
	    }
	  }
}

結語:請自行配置SpringMvc的運行環境;

發佈了39 篇原創文章 · 獲贊 9 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章