`

excel上传解析

阅读更多

private List<Map<String, Object>> check(Workbook workBook) {
		List<Map<String, Object>> excelValueList = null;
		// 待导入的数据
		int import_wb_sheetNos = workBook.getNumberOfSheets();

		if (import_wb_sheetNos == 0) {
			throw new ServiceException("NumberOfSheets 数据为0,无数据可导入");
		}
		excelValueList = new ArrayList<>();
		// 创建人工号
		String EMP_CODE = UserUtil.getCurrentUser().getEmpCode();
		// 查询网点信息
		List<UmUserBranch> umUserBranchList = umUserBranchDao
				.queryUmUserBranchByCorpCode(null, EMP_CODE);
		if (umUserBranchList == null || umUserBranchList.size() == 0) {
			throw new ServiceException("没有网点权限");
		}
		UmUserBranch umUserBranch = umUserBranchList.get(0);

		for (int i = 0; i < import_wb_sheetNos; i++) {
			// 获取sheet
			Sheet import_sheet = workBook.getSheetAt(i);

			for (int heigth = 1, count = import_sheet.getLastRowNum() + 1; heigth < count; heigth++) {
				Row row = import_sheet.getRow(heigth);
				int FACE_AMT = 0;
				Cell FACE_AMT_CELL = row.getCell(0);
				try {
					FACE_AMT_CELL.setCellType(Cell.CELL_TYPE_STRING);
					FACE_AMT = Integer.valueOf(FACE_AMT_CELL.getStringCellValue());
				} catch (Exception e) {
					String errorMessage = workBook.getSheetName(i) + "的第"
							+ heigth + "行的面额不是数字";
					throw new ServiceException(errorMessage);
				}
				if(FACE_AMT <= 0) {
					String errorMessage = workBook.getSheetName(i) + "的第"
							+ heigth + "行的面额小于等于0";
					throw new ServiceException(errorMessage);
				}
				int BEN = 0;
				Cell BEN_CELL = row.getCell(1);
				try {
					BEN_CELL.setCellType(Cell.CELL_TYPE_STRING);
					BEN = Integer.valueOf(BEN_CELL.getStringCellValue());
				} catch (Exception e) {
					String errorMessage = workBook.getSheetName(i) + "的第"
							+ heigth + "行的数量不是数字";
					throw new ServiceException(errorMessage);

				}
				int SPEC = 0;
				Cell SPEC_CELL = row.getCell(2);
				try {
					SPEC_CELL.setCellType(Cell.CELL_TYPE_STRING);
					SPEC = Integer.valueOf(SPEC_CELL.getStringCellValue());
				} catch (Exception e) {
					String errorMessage = workBook.getSheetName(i) + "的第"
							+ heigth + "行的规格不是数字";
					throw new ServiceException(errorMessage);
				}
				if(!validateSpec(String.valueOf(SPEC))) {
					String errorMessage = workBook.getSheetName(i) + "的第"
							+ heigth + "行的规格不存在";
					throw new ServiceException(errorMessage);
				}
				Cell APPLYER_ID_CELL = row.getCell(3);
				String APPLYER_ID = null;
				if(null == APPLYER_ID_CELL) {
					String errorMessage = workBook.getSheetName(i) + "的第"
							+ heigth + "行的申请人不能为空";
					throw new ServiceException(errorMessage);
				}else{
					APPLYER_ID_CELL.setCellType(Cell.CELL_TYPE_STRING);
					if (StringUtils.isBlank(APPLYER_ID = APPLYER_ID_CELL.getStringCellValue())) {
						String errorMessage = workBook.getSheetName(i) + "的第"
								+ heigth + "行的申请人不能为空";
						throw new ServiceException(errorMessage);
						
					}
				}
				//新增申请人姓名
				Cell APPLYER_NAME_CELL = row.getCell(4); 
				String APPLYER_NAME = null;
				if(null == APPLYER_NAME_CELL) {
					String errorMessage = workBook.getSheetName(i) + "的第"
							+ heigth + "行的申请人姓名不能为空";
					throw new ServiceException(errorMessage);
				}else{
					APPLYER_NAME_CELL.setCellType(Cell.CELL_TYPE_STRING);
					if (StringUtils.isBlank(APPLYER_NAME = row.getCell(4).getStringCellValue())) {
						String errorMessage = workBook.getSheetName(i) + "的第"
								+ heigth + "行的申请人姓名不能为空";
						throw new ServiceException(errorMessage);
						
					}
				}
				Map<String, Object> value = new HashMap<>();
				value.put("FACE_AMT", FACE_AMT);
				value.put("NEED_BEN", BEN);
				value.put("SPEC", SPEC);
				value.put("APPLYER_ID", APPLYER_ID);
				value.put("APPLYER_NAME", APPLYER_NAME);
				value.put("createId", EMP_CODE);
				value.put("BUKRS", umUserBranch.getCorpCode());
				value.put("TOTAL_AMT", FACE_AMT * BEN * SPEC);
				value.put("CREATE_ID", EMP_CODE);
				value.put("BRANCH_CODE", umUserBranch.getBranchCode());
				value.put("BRANCH_NAME", umUserBranch.getBranchName());
				value.put("ZDISNUM", umUserBranch.getZDISNUM());
				// 待汇总状态
				value.put("EXTEND_STATUS",
						InvoiceDtlApplyExtendStatusEnum.WAIT_COLLECT.getValue());
				// 收派员待网点分配状态
				value.put("STATUS",
						InvoiceApplyStatusEnum.PEOPLE_WAIT_BRANCH_ALLOT
								.getValue());
				value.put("TYPE", InvoiceInputTypeEnum.FIXED_INVOICE.getValue());
				excelValueList.add(value);
			}
		}

		return excelValueList;
	}



package com.sf.novatar.tpl.util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.lang3.StringUtils;
import org.apache.poi.POIXMLDocument;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper;

import com.sf.novatar.tpl.enums.FileType;
import com.sf.novatar.tpl.servlet.HttpServletHolder;
import com.sfpay.framework.base.exception.ServiceException;

/**
 * 描述:
 */
public abstract class AbstractExcelReader {

	public abstract void doParse(Workbook workbook);

	public void Reader() throws Exception {

		Reader((InputStream inputStream) -> {

			String fileType = getType(inputStream);
			if (StringUtils.isBlank(fileType)
					|| (!FileType.XLSX.getValue().equals(fileType)
							&& !FileType.XLS_DOC.getValue().equals(fileType) && !FileType.XLSX_DOCX
							.getValue().equals(fileType))) {
				throw new ServiceException("上传失败,请选择Excel类型文件! ");
			}

		});
	}

	public void Reader(Validate validate) throws Exception {
		MultiPartRequestWrapper mpRequest = (MultiPartRequestWrapper) HttpServletHolder
				.getCurrentRequest();

		// 导入的文件
		File files = mpRequest.getFiles("excel")[0];
		if (null == files) {
			throw new FileNotFoundException("解析的文件不存在");
		}
		try (InputStream fileInputStream = new FileInputStream(files);) {
			validate.doValidate(fileInputStream);

			if (!fileInputStream.markSupported()) {
				try (BufferedInputStream bufferedInputStream = new BufferedInputStream(
						fileInputStream);) {
					Workbook workbook = null;
					if (POIFSFileSystem.hasPOIFSHeader(bufferedInputStream)) {
						workbook = new HSSFWorkbook(bufferedInputStream);
					} else if (POIXMLDocument
							.hasOOXMLHeader(bufferedInputStream)) {
						workbook = new XSSFWorkbook(
								OPCPackage.open(bufferedInputStream));
					} else {
						throw new ServiceException("没有获得相应的workbook");
					}
					doParse(workbook);
				}
			}
		}
	}

	/**
	 * * 判断文件类型
	 * 
	 * @param inputStream
	 * 
	 * @return 文件类型
	 * 
	 */
	private static String getType(InputStream inputStream) throws IOException {
		if (inputStream == null) {
			return null;
		}
		String fileHead = getFileContent(inputStream);
		if (fileHead == null || fileHead.length() == 0) {
			return null;
		}
		fileHead = fileHead.toUpperCase();
		FileType[] fileTypes = FileType.values();
		for (FileType type : fileTypes) {
			if (fileHead.startsWith(type.getValue())) {
				return type.getValue();
			}
		}
		throw new ServiceException("没有获取到响应的文件类型");
	}

	/**
	 * 得到文件头
	 * 
	 * @param filePath
	 *            文件路径
	 * @return 文件头
	 * @throws IOException
	 */
	private static String getFileContent(InputStream inputStream)
			throws IOException {
		int length = 28;
		byte[] b = null;
		if (inputStream != null) {
			inputStream.read(b = new byte[length], 0, length);
			inputStream.skip(-length);
		}
		return FileTypeJudge.bytesToHexString(b);
	}

	public interface Validate {

		public void doValidate(InputStream inputStream) throws Exception;
	}
}

分享到:
评论

相关推荐

    Excel上传解析组件

    "Excel上传解析组件"是一种专为处理Excel文件上传和解析任务设计的技术组件。它简化了在应用程序中处理Excel数据的过程,使得开发人员可以快速、高效地读取、写入或操作Excel表格数据,而无需深入了解Excel文件格式...

    java上传excel并且解析入库

    在Java开发中,上传并解析Excel文件是一种常见的需求,特别是在数据处理、报表导入或系统集成等场景。本篇文章将深入探讨如何实现这个功能,主要涉及的技术包括文件上传、Excel解析以及数据库操作。 首先,我们需要...

    文件上传Excel解析相关的jar

    在Java开发中,文件上传和Excel解析是常见的需求,特别是在数据处理、报表生成或系统集成等场景。SpringMVC框架提供了强大的支持,使得这些任务变得简单。本资源中提到的"文件上传Excel解析相关的jar"是针对使用Java...

    SpringBoot实现Excel文件解析

    这可以通过创建一个`@RestController`,定义一个接收文件上传的`@PostMapping`方法,并调用`ExcelService`进行解析。 总的来说,Spring Boot结合Apache POI提供了一种高效且灵活的方式来处理Excel文件解析任务,...

    上传下载EXCEL与解析

    标题中的“上传下载EXCEL与解析”涉及到的IT知识点主要集中在Excel文件的处理,这通常包括文件的上传、下载操作以及对Excel数据的解析。在Web应用开发中,这些功能非常常见,例如在数据分析、报表生成或者用户交互...

    vue + element基于xlsx插件实现excel解析

    3 设置header和解析完成后上传方法: importExcel ref="import_excel" :import-methods="handleYcExcelImport" :max="100" :fields="fields" 注: fields : 解析数组的key import-methods:点击上传按钮时执行的...

    springboot整合easyexcel实现excel文件上传解析,下载导出简单实例.zip

    best20182022-10-17 14:55:20原证springboot整合easyexcel实现excel文件上传解析,下载导出简单实例 项目描述 springboot整合easyexcel,上传解析Excel,下载导出Excel 运行环境 jdk8+tomcat9+IntelliJ IDEA+...

    Java上传下载excel、解析Excel、生成Excel的问题.pdf

    Java上传下载excel、解析Excel、生成Excel的问题.pdf

    小项目上传解析excel文件

    在这个名为"小项目上传解析excel文件"的实践中,我们将探讨如何使用JavaWeb技术来实现Excel文件的上传、解析以及将数据存储到数据库中。以下是对这一主题的详细阐述: 1. **文件上传**: - 在JavaWeb应用中,文件...

    springboot实现上传并解析Excel过程解析

    SpringBoot 实现上传并解析 Excel 过程解析 SpringBoot 是一个流行的 Java 框架,用于快速构建基于 Spring 的应用程序。Excel 是一个广泛使用的电子表格软件,用于存储和分析数据。本文将介绍如何使用 SpringBoot ...

    Excel上传并解析java对象

    在IT行业中,Excel上传并解析Java对象是一项常见的数据处理任务,尤其在数据分析、报表生成以及数据导入导出等场景中尤为常见。这个过程涉及到的主要技术包括文件上传、Excel读取、数据转换以及Java对象映射。下面将...

    Excel文件上传,获取Excel文件并解析

    Excel文件上传,获取Excel文件并解析

    js对excel导入解析与导出

    在JavaScript(JS)环境中,对Excel文件的导入与导出是一项常见的需求,特别是在Web应用程序中,用户可能需要上传Excel文件来分析数据或者下载经过处理的数据为Excel格式。本篇文章将详细探讨JS如何实现Excel的导入...

    java版excel解析,并上传至mysql数据库

    在Java编程环境中,将Excel数据解析并上传到MySQL数据库是一项常见的任务,特别是在数据处理和导入导出场景下。本项目提供了完整的解决方案,包括所需的jar包、数据库SQL语句以及一个可直接在Eclipse环境中运行的...

    前端js解析/读取excel文件

    在前端开发中,有时我们需要处理用户上传的Excel文件,例如从Excel中提取数据进行展示或者进一步的处理。本文将深入探讨如何使用JavaScript在浏览器端解析和读取Excel文件,主要基于开源库`js-xlsx`。 `js-xlsx`是...

    excel导入导出,包括纯前端解析,后端解析导入导出方式

    用户上传Excel文件后,后端解析数据,然后返回结果或者保存到数据库。这种方式对服务器资源要求较高,但能提供更好的稳定性和安全性。 接下来,我们讨论导出过程。当用户请求导出数据时,前端可以向后端发送请求,...

    前端解析EXCEL.zip

    在前端开发中,有时我们需要处理用户上传的Excel文件,例如读取数据进行分析或展示。本文将详细探讨如何使用纯JavaScript在前端解析Excel文件,不依赖后端服务,且兼容各大主流浏览器。我们将主要关注以下几个关键...

    java文件上传和上传excel后并解析出来的小工具

    在这个“java文件上传和上传excel后并解析出来的小工具”中,我们可以探讨以下几个核心知识点: 1. **MultipartFile接口**:在Spring框架中,`MultipartFile`接口用于处理HTTP请求中的多部分文件数据。它提供了读取...

    java 解析Excel 并判断解析的数据类型__Eclipse工程

    在Java编程环境中,解析Excel文件是一项常见的任务,特别是在数据处理、数据分析或自动化测试等领域。Eclipse作为Java开发的主流IDE,提供了丰富的工具和支持来完成这项工作。本项目名为"java 解析Excel 并判断解析...

Global site tag (gtag.js) - Google Analytics