`
TableMiao
  • 浏览: 75558 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

文件上传、excel导入

阅读更多

文件上传到服务器

      java实现本地文件上传到服务器。

      实现方式:

            rest接口模式提供上传服务

      头文件:

         

        @POST       
	@Path("/upload")    
	@Consumes("multipart/form-data")
	@Produces("text/plain; charset=utf-8")

 

 

     

public synchronized String uploadDoc(MultipartFormDataInput input,
			@Context ServletContext servletContext) {
		logger.info("Began To Upload");
		Map<String, List<InputPart>> uploadForm = input.getFormDataMap();
		List<InputPart> inputParts = uploadForm.get("Filedata");
		
		 //上传文件的web路径
		 String webPath = "/home/jike/tomcat-res1/webapps/shjkws";  
		 // 获取Web应用的路径	(也可以通过这种方式来获取)
		 //	final String realPath = servletContext.getRealPath(updatePath); 
		for (InputPart inputPart : inputParts) {
			try {
				//由于传输文件是以2进制的形式传输,所以通过流的方式读取文件名,避免中文名字乱码
				 InputPart a = uploadForm.get("Filename").get(0);
				 InputStream is = a.getBody(InputStream.class,
							null);
				//读取一遍名字
				ByteArrayOutputStream baos = new ByteArrayOutputStream();
				int i = -1;
				while ((i = is.read()) != -1) {
					baos.write(i);
				}
				String fileName = baos.toString("UTF-8");
				
				//也可以通过如下方式直接获取,不支持中文
				//String fileName = uploadForm.get("Filename").get(0)
				//		.getBodyAsString();
				logger.debug("上传文件的名字:{}",fileName);
				
				//截取上传文件后缀
				int pos = fileName.lastIndexOf('.');
				String fileTitle = fileName.substring(0, pos);//文件名字
				String fileHz = fileName.substring(pos);//文件后缀
				logger.debug("上传文件名称:{}  文件后缀:{}",fileTitle,fileHz);
				
				//自定义上传到服务器的文件格式,此处我定义的格式为
				//eg:知识库_故障报表20150428^20150428173419^.txt  
                                  //便于servlrt导出中文文件,详见文件下载、excel导出
				if (pos > 0) {
					fileName = "export" + File.separator + "知识库_"+fileTitle
							+ dayFormat.format(System.currentTimeMillis())
							+ fileHz;
				} else {
					fileName = "export" + File.separator + "知识库_"+fileTitle
					+ dayFormat.format(System.currentTimeMillis());
				}
				String realFile = webPath + File.separator + fileName;
				//查看文件是否存在,如果有就删掉,避免重复,根据需要使用
				fileOperate(realFile);
				//复制文件到服务器的另外位置,比如说部署了tomcat集群,挂了一个  
                                   //下载就找不到相应的路径,根据需要使用
				copyFile(realFile);
				
				//生成文件
				InputStream inputStream = inputPart.getBody(InputStream.class,
						null);
				File file = new File(realFile);
				FileUtils.copyInputStreamToFile(inputStream, file);
				logger.info("上传保存文件成功 返回生成的文件名:{}  , 真实路径 :{}", fileName,
						realFile);
				return fileName;
			} catch (Exception e) {
				throw new RuntimeException("上传文件异常!");
			}
		}
		return "没有上传文件!";
	}

 

   

      public void fileOperate(String realFile) {
		File file = new File(realFile);
		if (file.exists()) {
			logger.info("文件已经存在, 执行文件删除操作");
			file.delete();
			logger.info("删除已经存在的文件, 文件名称: {}", realFile);
		}
	}

	public void copyFile(String realFileName) {
		String webp = realFileName;
		if (!StringUtils.isEmpty(webPath2)) {
			logger.info("copying file: {}", realFileName);
			webp = webp.replace(webPath, webPath2);
			File file = new File(webp);
			if (file.exists())
				file.delete();
			try {
				FileUtils.copyFile(new File(realFileName), new File(webp));
			} catch (IOException e) {
				e.printStackTrace();
			}
			logger.info("file copied: {}", webp);
		}
	}

    前台界面,调用接口实现即可。

 

    excel数据导入到数据库

      比如把

 导入到



 

       界面上传一个excel拿到之后解析数据,可解析成一行一个map即数据为List<Map> 方式,也可解析成一行为一个实体bean即List<Bean>方式,解析模板不同而已……以下采取bean方式,更易于控制格式和理解。

       由于excel格式多样,所以解析映射bean的实体全部统一用String操作,当然也可以excel提供的cell.getCellType()来判断,时间转成数字格式也可以由DateUtil.isCellDateFormatted(cell)来判断,进行format。此处本人采用String格式,保证一系列的转码错误减少。

     1.excel解析的工具类

 

import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
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.ss.usermodel.WorkbookFactory;

/***
 * 修改上传方式
 *    兼容 07和03 的excel
 * @author tablemiao
 *
 */
public class PoiExcelReader2 {
	
	public static <T> List<T> readExcelData(InputStream is, Class<T> clazz, Map<String, String> propMapper) {
		List<T> beans = new ArrayList<>();
		try {
			Workbook wbs = WorkbookFactory.create(is); 
	        Sheet sheet0 = wbs.getSheetAt(0);
			int rowCount = sheet0.getLastRowNum();

			if (rowCount > 0) {
				Row row0 = sheet0.getRow(0);
				Map<Integer, String> colMapper = createColMapper(row0, propMapper);
				for (int j = 1; j <= rowCount; j++) {
					Row row = sheet0.getRow(j);
					if (row == null)
						continue;
					T bean = rowToBean(row, colMapper, clazz);
					if (bean != null)
						beans.add(bean);
				}

			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return beans;
	}
	
	private static <T> T rowToBean(Row row, Map<Integer, String> colMapper, Class<T> clazz){
		
	 SimpleDateFormat adf = new SimpleDateFormat("yyyy-MM-dd");
		
		try {
			T bean = clazz.newInstance();
			for(int i : colMapper.keySet()){
				Cell cell = row.getCell(i);
				Object value;				
				switch (cell.getCellType()) {
				case Cell.CELL_TYPE_STRING:
					value = cell.getRichStringCellValue().getString();
					break;
				case Cell.CELL_TYPE_NUMERIC:
					if (DateUtil.isCellDateFormatted(cell)) {
						value = adf.format(cell.getDateCellValue());
					} else {
						value = cell.getNumericCellValue();
					}
					break;
				case Cell.CELL_TYPE_BOOLEAN:
					value = cell.getBooleanCellValue();
					break;
				case Cell.CELL_TYPE_BLANK:
					value = "";
					break;
				default:
					value = "";
				}
				BeanUtils.setProperty(bean, colMapper.get(i), value);
			}
			return bean;
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}catch(Exception e){
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 分析第一行,确定对应关系
	 * @param row0 第一行,  保存对应列的意义
	 * @param propMapper  列的意义到bean属性的映射
	 * @return
	 */
	private static Map<Integer, String> createColMapper(Row row0, Map<String, String> propMapper){
		Map<Integer, String> colMapper = new HashMap<Integer, String>();
		int colCountR0 = row0.getLastCellNum();
		for (int i = 0; i < colCountR0; i++) {
			Cell cell = row0.getCell(i);
			if (propMapper.containsKey(cell.getStringCellValue())) {
				colMapper.put(cell.getColumnIndex(), propMapper.get(cell.getStringCellValue()));
			}
		}
		return colMapper;
	}
}

    通过

BeanUtils.setProperty(bean, colMapper.get(i), value);

 

     把excel中的数据一行转成一个实体bean,其中表头的列需要与数据库中字段一一对应,这是通过
propMapper  这个条件map来进行处理的

       excel数据解析完导入数据库方法

     

       Map<String, String> propMapper = new HashMap<String, String>();
	
	private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
	@PostConstruct//初始化 表头与数据库表字段对应的map
	private void initPropMapper() {
		propMapper.put("月份", "saveDate");
		propMapper.put("属地分公司", "dependency");
		propMapper.put("及时率(%)", "ratio");
	}

	@POST
	@Path("/upload")
	@Consumes("multipart/form-data")
	@Produces("text/plain; charset=utf-8")
	public synchronized Map<String, Object> uploadDoc(
			MultipartFormDataInput input, @Context ServletContext servletContext) throws Exception{
		logger.info("Began To Upload Excel Data!");
		Map<String, List<InputPart>> uploadForm = input.getFormDataMap();
		List<InputPart> inputParts = uploadForm.get("Filedata");
		for (InputPart inputPart : inputParts) {
				InputStream inputStream = inputPart.getBody(InputStream.class,
						null);
                                //拿到excel中解析的数据,KpiIndexSZ.class为数据库表实体  字段类型全为String格式
				List<KpiIndexSZ> raas = PoiExcelReader2.readExcelData(
						inputStream, KpiIndexSZ.class, propMapper);

                             //到这里为止 就解析了上传excel中的数据,根据拿到的list再做新增,此时数据格式全部由String转码即可。根据具体需求新增

                      
				logger.debug("上传的excel数据为:{}",raas);
				if(raas.size()<=0||raas.isEmpty()||raas.get(0).getSaveDate()==null){
					throw new Exception("上传数据不能为空,上传失败");
				}
				for(KpiIndexSZ sz:raas){
					if(sz.getRatio()!=null&&!("".equals(sz.getRatio()))){
						if(!(NumberUtils.isNumber(sz.getRatio()))){
							throw new Exception("开通及时率必须为数字,上传失败");
						}
					}
					if(sz.getSaveDate()==null){
						throw new Exception("月份不能为空,上传失败");
					}		
					try{
						sdf.parse(sz.getSaveDate());
					}catch(Exception e){
						throw new Exception("月份不符合yyyy-MM格式,上传失败");
					}
				}
				// 得到excel上传数据的月份,去重,查库
				Map<String,String> monthMap = new HashMap<String, String>();
				for(KpiIndexSZ k:raas){
					monthMap.put(k.getSaveDate(), sdf.format(sdf.parse(k.getSaveDate())));
				}
				ArrayList<String> monthList = new ArrayList<String>(monthMap.values());
				
				KpiIndexSZExample example = new KpiIndexSZExample();
				example.createCriteria().andSaveDateIn(monthList);
				List<KpiIndexSZ> isEx = kpiIndexSZDao.selectByExample(example);
				Map<String, Object> resultMap = new HashMap<>();
				if(isEx.size()>0){
					//数据库存在,返回excel数据
					resultMap.put("isSuc", raas);
					logger.debug("excel中的数据:{}",raas);
				}else{
					//不存在,入库
					insert(raas);
					resultMap.put("isSuc", "上传成功");
				}
				return resultMap;
			}
		return null; 
	}
 

 记录一下上传接口 方便温习

  • 大小: 64 KB
  • 大小: 37.5 KB
1
0
分享到:
评论

相关推荐

    asp上传并导入EXCEL文件

    在ASP(Active Server Pages)开发中,经常需要处理文件上传和数据导入的功能,特别是与Excel文件交互时。本文将深入探讨如何使用ASP实现Excel文件的上传,并将其数据导入到Access数据库中。 首先,我们需要理解ASP...

    前端-HTML-Web Excel导入

    在前端开发中,Web Excel导入是一项常见的需求,它允许用户在网页上直接上传Excel文件,以便进行数据的读取、处理或展示。这项技术对于数据分析、报表制作等场景尤为重要。以下将详细介绍实现Web Excel导入涉及的...

    SpringBoot+AntDesignVue实现excel导入功能

    在这里,我们使用 change 事件来监控文件上传的状态,并在上传完成或失败时执行相应的操作。 自定义上传方法 在这里,我们定义了一个自定义的上传方法 customRequest,该方法将文件上传到服务器。在这个方法中,...

    springboot上传excel导入到数据库完整demo(后端代码)

    可以使用SpringBoot的`@SpringBootTest`注解和JUnit进行单元测试,模拟HTTP请求,验证Excel导入功能是否按预期工作。 6. **项目结构**: - 一个标准的SpringBoot项目通常包括`src/main/java`下的`main`和`test`...

    上传Excel文件并导入数据库

    在IT行业中,将Excel文件上传并导入到数据库是一项常见的任务,尤其在数据处理、数据分析以及报表生成等场景中。在本篇文章中,我们将探讨如何在Visual Studio 2008环境下实现这一功能。 首先,我们需要了解Excel...

    文件上传下载 excel导入导出 及http 传输

    在IT行业中,文件上传下载、Excel导入导出以及HTTP传输是常见的操作,广泛应用于各种Web应用和服务中。本文将深入探讨这些技术的核心概念、实现方式及其在实际开发中的应用。 首先,我们来看文件上传下载。在Web...

    一个按钮搞定excel文件上传和导入[完美方案]

    运用apache的fileupload库实现文件上传,运用jxl分析导入的excel数据。 只需在现有页面上添加一个“导入”按钮就可实现excel导入数据库的功能,点击“导入”按钮,选择要上传的文件后会立即开始上传。 采用iframe的...

    C#.NET中导入Excel文件

    在C#.NET环境中,导入Excel文件是一项常见的任务,特别是在数据处理、数据分析或应用程序集成的场景中。本篇文章将深入探讨如何使用C#.NET来实现这一功能,并提供相关的知识点。 首先,C#.NET导入Excel文件主要涉及...

    jeecg导入Excel

    1. **Excel导入原理**: Jeecg框架提供了对Excel数据导入的支持,其工作原理通常是读取Excel文件中的数据,然后按照预定义的映射规则,将这些数据存储到数据库中。这一过程涉及到了文件读取、数据解析、数据验证...

    pb9excel导入

    本文将深入解析这一操作的具体步骤、注意事项以及潜在的错误处理机制,为IT专业人士提供一个全面的PB9 Excel导入指南。 ### 一、PB9与Excel交互原理 在PB9中实现Excel文件导入主要依赖于OLE (Object Linking and ...

    .net的Excel导入

    - **用户体验**:提供清晰的反馈,告知用户文件上传的状态和结果。 总之,.NET中的Excel导入功能可以通过各种库实现,例如EPPlus和NPOI。根据项目的具体需求选择合适的库,并确保处理好数据的读取、验证和存储,以...

    Excel文件导入导出

    在IT行业中,Excel文件的导入和导出是一个常见的任务,特别是在数据分析、报表生成以及数据交换等领域。Excel由于其直观易用的界面和强大的表格处理功能,成为企业和个人处理数据的首选工具之一。以下是对"Excel文件...

    用asp把Excel导入到MSSQL

    在本场景中,我们讨论的是如何使用ASP将Excel数据导入到MSSQL(Microsoft SQL Server)数据库。这个过程通常涉及读取Excel文件、处理数据并执行SQL插入语句将数据写入数据库。 首先,我们需要在ASP页面中引用必要的...

    C# 文件上传下载(Excel导入,多线程下载)功能的实现代码

    C# 文件上传下载(Excel 导入,多线程下载)功能实现代码 C# 文件上传下载功能是许多软件系统中常见的功能之一,而 Excel 导入和多线程下载则是其重要组成部分。下面将详细介绍 C# 文件上传下载(Excel 导入,多线程下载...

    完整的上传,excel 导入mysql 数据库

    综上所述,实现“完整的上传,excel导入mysql数据库”涉及到一系列技术步骤,包括使用POI处理Excel文件,SpringMVC处理文件上传请求,分批导入和性能优化,以及数据库操作和错误处理。掌握这些技能对于构建高效且...

    Excel文件的导入(异步线程)

    本知识点主要探讨如何高效地实现Excel文件的导入,特别是利用异步线程技术来提升性能。异步线程在多任务环境中,能够使得程序在等待IO操作完成时,不会阻塞主线程,从而提高用户体验。 首先,我们需要了解Excel文件...

    纯前端:luckysheet在线编辑Excel导出,Excel文件导入

    用户可以通过选择文件或者拖拽的方式,将本地的Excel文件上传到网页上,然后在Luckysheet中进行查看和编辑。反之,编辑后的数据也可以导出为Excel文件,方便用户在离线环境下继续处理。这一特性使得Luckysheet能够...

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

    在IT行业中,Excel导入导出是一项常见的数据处理任务,尤其在数据分析、报表生成以及用户交互等场景中。这里我们将深入探讨“excel导入导出”的两种主要实现方式:纯前端解析和后端解析,以及如何在前后端之间进行...

    jfinal下的多文件上传以及对excel的导入导出demo

    本示例“jfinal下的多文件上传以及对excel的导入导出demo”聚焦于如何利用JFinal框架实现这两个核心功能。JFinal是一款基于Java的轻量级Web开发框架,它以其高效、简洁的特性受到开发者欢迎。 首先,让我们深入理解...

    C# excel导入出错解决办法

    "C# Excel导入出错解决办法" 在ASP.NET项目开发过程中,经常需要进行数据处理,Oracle数据库和Microsoft Excel在数据处理过程中经常使用到。Oracle数据库可以处理大量数据,无论性能和坚固性都是非常好的数据库...

Global site tag (gtag.js) - Google Analytics