BS架构实现Excel文件的导入

本文介绍了一个Java后台Excel工具类,用于处理Excel文件的导入导出操作,包括对不同版本Excel文件的支持,以及将Excel数据转换为实体类集合的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码参考了其他博主的文章,自己加以修改而成。
注:目前阶段没有时间对代码优化,类型的判断并没有做,有需要的时候来更新。

后台excel工具类

package com.zbmes.common.util;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.io.FileUtils;
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.commons.CommonsMultipartFile;

/**
 * Excel工具类
 * @author DBQ
 */
public class ExcelUtils {

	private final static String excel2003L = ".xls"; // 2003- 版本的excel
	
	private final static String excel2007U = ".xlsx"; // 2007+ 版本的excel

	/**
	 * 获取实体对象返回属性名称
	 * @param obj 实体对象
	 * @return
	 * @throws Exception
	 */
	public java.lang.reflect.Field[] findEntityAllTypeName(Object obj)
			throws Exception {
		Class<? extends Object> cls = obj.getClass();
		return cls.getDeclaredFields();
	}

	/**
	 * 根据文件选择excel版本
	 * @return
	 * @throws Exception
	 */
	public Workbook chooseWorkbook(MultipartFile file) throws Exception {
		Workbook workbook = null;
		// 把MultipartFile转化为File
		CommonsMultipartFile cmf = (CommonsMultipartFile) file;
		DiskFileItem dfi = (DiskFileItem) cmf.getFileItem();
		File fo = dfi.getStoreLocation();

		String filename = file.getOriginalFilename();
		String fileType = (filename.substring(filename.lastIndexOf("."),
				filename.length())).toLowerCase();

		if (excel2003L.equals(fileType)) {
			workbook = new HSSFWorkbook(FileUtils.openInputStream(fo)); // 2003-
		} else if (excel2007U.equals(fileType)) {
			workbook = new XSSFWorkbook(FileUtils.openInputStream(fo)); // 2007+
		} else {
			throw new Exception("解析的文件格式有误!");
		}
		return workbook;
	}

	/**
	 * 公共的导入excel方法
	 * @param file 文件
	 * @param obj 实体类
	 * @return 实体类集合
	 * @throws IOException
	 */
	public List<Object> importBaseExcel(MultipartFile file,
			Object obj) throws IOException {
		Workbook workbook = null;
		try {
			// 读取文件内容
			workbook = this.chooseWorkbook(file);
			// 获取工作表
			Sheet sheet = workbook.getSheetAt(0);
			// 获取sheet中第一行行号
			int firstRowNum = sheet.getFirstRowNum();
			// 获取sheet中最后一行行号
			int lastRowNum = sheet.getLastRowNum();
			
			Row firstRow = sheet.getRow(0);
			
			short lastCellNum = firstRow.getLastCellNum();
			// 获取表头中的属性列 返回Field数组
			Field[] fa = new Field[lastCellNum]; 
			String classname = obj.getClass().getName();
			Class<?> clazz = Class.forName(classname);
			for (int i = 0; i < lastCellNum; i++) {
				Cell cell = firstRow.getCell(i);
				String fieldName = cell.getStringCellValue();
				Field field = clazz.getDeclaredField(fieldName);
				fa[i] = field ;
			}
			List<Object> list = new ArrayList<Object>();
			// 遍历表格数据
			for (int i = firstRowNum + 1; i <= lastRowNum; i++) {
				Row row = sheet.getRow(i);
				// 可以根据该类名生成Java对象
				Object pojo = clazz.newInstance();
				// 实体字段匹配sheet列
				for (int j = 0; j < lastCellNum; j++) {
					Cell cell = row.getCell(j);
					String val = cell.getStringCellValue();
					fa[j].setAccessible(true);
					fa[j].set(pojo, val);
				}
				list.add(pojo);
			}
			return list;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			workbook.close();
		}
		return null;
	}

}

处理导入请求:

	@RequestMapping("doImport")
	public String doImport(HttpServletRequest request) throws IOException{
		ShiroHttpServletRequest shiroRequest = (ShiroHttpServletRequest) request;
        CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();  
        MultipartHttpServletRequest mr = commonsMultipartResolver.resolveMultipart((HttpServletRequest) shiroRequest.getRequest());  
        Iterator<String> iter = mr.getFileNames();
		String inputName = iter.next();
		//获得文件
		MultipartFile mf = mr.getFile(inputName);
		List<Object> list = new ExcelUtils().importBaseExcel(mf, new ProcessInfo());
		service.saveAll(list);
		return "redirect:Index";
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值