Java解析導入Excel文件后台代碼實現


使用MultipartFile上傳Excel文件后端代碼實現:(springmvc下的spring-webmvc (MultipartFile )上傳)
  由於POST一個包含文件上傳的Form會以multipart/form-data請求發送給服務器,必須明確告訴轉發器(DispatcherServlet)如何處理MultipartRequest。首先,在配置文件中聲明一個MultipartResolver;
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
        <!-- 設置上傳文件的最大尺寸為1MB(也可以不配置而在代碼中限制上傳的文件大小) -->  
        <property name="maxUploadSize">  
            <value>1048576</value>  
        </property>  
    </bean>  

代碼所需jar包下載地址:

  https://files.cnblogs.com/files/Big-Boss/Java%E5%AF%BC%E5%85%A5Excel%E6%96%87%E4%BB%B6%E6%89%80%E9%9C%80jar%E5%8C%85.zip

  注:以下代碼只能滿足基本需求,需根據實際需求做代碼更改。

代碼:

import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;
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 org.springframework.web.multipart.MultipartHttpServletRequest;
/**
 * 解析導出的Excel文件
 * 注:需根據實際需求做代碼更改
 * @author 【】
 *
 */
public class ImportExcelUtil {
	/*
	 * 導入Excel文件
	 * @param obj	導入文件數據對應的實體類
	 * @param request	HttpServletRequest請求request
	 * @return	解析后數據集合
	 */
	public List<Object> importExcel(Object obj, HttpServletRequest request) {
		// 將請求轉化為多部件的請求
		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
		// 解析多部件請求文件
		MultipartFile mFile = multipartRequest.getFile("importFile");
		// 獲得上傳文件的文件名
		String fileName = mFile.getOriginalFilename();
		// 獲取文件擴展名
		String eName = fileName.substring(fileName.lastIndexOf(".")+1);
		InputStream inputStream = mFile.getInputStream();
		Workbook workbook = getWorkbook(inputStream, eName);
		// 獲取工作薄第一張表
		Sheet sheet = workbook.getSheetAt(0);
		// 獲取名稱
		String sheetName = sheet.getSheetName().trim();
		// 獲取第一行
		Row row = sheet.getRow(0);
		// 獲取有效單元格數
		int cellNum = row.getPhysicalNumberOfCells();
		// 表頭集合
		List<String> headList = new ArrayList<>();
		for (int i = 0; i < cellNum; i++) {
			Cell cell = row.getCell(i);
			String val = cell.getStringCellValue();
			headList.add(val);
		}
		Map<String, Field> map = getObjComment(obj);
		// 獲得有效行數
		int rowNum = sheet.getPhysicalNumberOfRows();
		// 定義導出文件中數據集合
		List<Object> objList = new ArrayList<>();
		for (int i = 1; i < rowNum; i++) {
			row = sheet.getRow(i);
			Object data = new Object();
			for (int j = 0; j < headList.size(); j++) {
				// 解析單元格
				Cell cell = row.getCell(j);
				// 根據字段給字段設值(根據實際需求更改代碼)
				Field field = map.get(headList.get(j));
				field.setAccessible(true);
				field.set(data, cell.getStringCellValue());
			}
			objList.add(data);
		}
		
		return objList;
	}
	
	/*
	 * 利用java反射機制獲取該類及父類的字段@Comment("")注解和字段信息Map集合
	 */
	public Map<String, Field> getObjComment(Object obj) {
		Map<String, Field> map = new HashMap<>();
		// 獲取該類所有字段信息
		Field[] fields = obj.getClass().getDeclaredFields();
		for (Field field : fields) {
			Comment comment = field.getAnnotation(Comment.class);
			if (null == comment) {
				continue;
			}
			if (StringUtils.isNotBlank(comment.value())) {
				map.put(comment.value(), field);
			}
		}
		// 獲取其父類所有屬性(字段信息)
		Field[] superFields = obj.getClass().getSuperclass().getDeclaredFields();
		for (Field field : superFields) {
			Comment comment = field.getAnnotation(Comment.class);
			if (null == comment) {
				continue;
			}
			if (StringUtils.isNotBlank(comment.value())) {
				map.put(comment.value(), field);
			}
		}
		return map;
	}

	/*
	 * 根據excel文件格式獲知excel版本信息
	 */
	public static Workbook getWorkbook(InputStream fs,String str){
		Workbook book = null;
		try{
			if ("xls".equals(str)) {
				// 2003
				book = new HSSFWorkbook(fs);
			} else { 
				// 2007
				book = new XSSFWorkbook(fs);
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
		return book;
	}

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM