strus2与poi 批量导入

本文分享了使用Struts2框架进行文件导入导出的实际经验,包括解决路径配置错误、处理不同文件类型及版本兼容性问题等。通过调整配置与采用特定方法,成功实现了批量导入功能。

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

项目场景:

提示:这里简述项目相关背景:
公司使用Strus2进行二次开发,因为之前没有人做导入导出,所以在这次的二次开发属于从0到1的过程,具体有很多的坑所以需要记录一下


问题描述:

首先是文件传不过去,测试了一下input type=“text” 就没问题。说明这就不是前后台对接的问题,这次主要是Strus.xml配置问题,这个坑一直报系统找不到路径的错误,因为是从0到1的过程(我太菜),不知道那个大神做的,把文件路径写死了,卧槽(忍不住爆粗口,不用就不要写好吗…)

 <!-- 系统常量定义,定义上传文件临时存放路径 -->
	    <!-- <constant name="struts.multipart.saveDir" value="e:\"></constant> -->
	<constant name="struts.multipart.saveDir"  value="/temp"  ></constant>
	<constant name="struts.multipart.maxSize"  value="10240000"  ></constant>

这个写在action外面就行

还有点前端如何拒绝提交的问题,我觉得这篇博客写的就很好,推荐一下:
前端如何拒绝提交
https://blog.youkuaiyun.com/whd526/article/details/78178451


原因分析:

首次接触strus框架,啥年代了,要不是二次开发我都不稀罕,哈哈,还是老实敲代码吧,springmvc多香呀,这个strus传参都费劲。还有就是刚毕业其实批量导入几乎都是网上的快捷方式,没接触到那么底层


第二大坑:

本来我想去使用hutool的工具的,结果,1.7的jdk使得我无能为力,不是这个版本低了就是那个版本高了,最后实在是受不了,搞了一上午到下午两点,想想还是算了,用low的吧,这个jdk他不配
一开始hutool上使用的MultipartFil,后来发现取不到文件,报get还是set异常吧。于是我就换成file,我也曾尝试File转MultipartFile

public static void main(String[] args) throws Exception {
        String filePath = "F:\\test.txt";
        File file = new File(filePath);
        FileInputStream fileInputStream = new FileInputStream(file);
        // MockMultipartFile(String name, @Nullable String originalFilename, @Nullable String contentType, InputStream contentStream)
        // 其中originalFilename,String contentType 旧名字,类型  可为空
        // ContentType.APPLICATION_OCTET_STREAM.toString() 需要使用HttpClient的包
        MultipartFile multipartFile = new MockMultipartFile("copy"+file.getName(),file.getName(),ContentType.APPLICATION_OCTET_STREAM.toString(),fileInputStream);
        System.out.println(multipartFile.getName()); // 输出copytest.txt
    }

MultipartFile是spring类型,代表HTML中form data方式上传的文件,包含二进制数据+文件名称。【来自百度知道】结果不是很如意,没取到。以后有时间在研究吧,我怀疑是jdk的问题。
还有就是enctype=“multipart/form-data”

这个东西加进去,如果Strus2没有配置好,就会一直报错,因为这代表二进制传文件

<%@ page contentType="text/html; charset=utf-8" language="java"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="security"%>
<%@page import="java.text.*,java.util.*"%>


<script type="text/javascript">

</script>
<div class="contain_table addtb" style="width:300px;height:100px;">
	<!--  action="${ctx}/cldj/cldj_plDR.action" -->
	<form name="readExcel" method="post" enctype="multipart/form-data" id="importForm">   
					        请选择需要导入的Excel文件:
					         <br />
					        &nbsp;
					        <br />
			<input type="file" name="uploadFile" id="uploadFile"><br> 
				<!--  <input type="submit" style="color: blue" value="批量导入" /> -->
	</form>
</div> 
<style>
#tb tr{
	height:38px;
}

</style>

第三大坑

接下来就是取cell的type
type=1为String
type=0为numerical
所以有些,第一行取得是表面的样子,第二行取得时候就报错,说类型不对
那没办法,只能加if判断了。
后来老大让再加两列 数字类型的标志,所以就一直取为0
我就纳了闷了,咋就取不到呢,
后来直接row.getcell(i).setcelltype(String)解决,具体看代码

写到这里我都懒得去再把if else去掉了


//批量导入
	public String plDR() throws Exception{
		System.out.println("我进入批量导入了------》》》》");
		 System.out.println(uploadFileFileName);
		 List<CldjModel> cldjModels = new ArrayList<>();
		 
	            FileInputStream fs = new FileInputStream(uploadFile); 
	            
	            Workbook workbook = new HSSFWorkbook(fs);  
	            //讀取Excel Sheet頁  
	            Sheet sheet = workbook.getSheetAt(0);  
	            int rowNum = sheet.getLastRowNum() + 1;//行數  
	            //讀取每一行  
	            System.out.println("rowNum--->>"+rowNum);
	            for(int i = 4 ; i < rowNum ; i++){ 
	            	CldjModel cm=new CldjModel();
	                Row row = sheet.getRow(i);//當前行  
			/*
			 * for(int k=0;k<17;k++) {
			 * System.out.println("getCellType"+row.getCell(k).getCellType());
			 * 
			 * }
			 * 
			 */
	             // 将区域编号的cell中的内容当做字符串处理
	                row.getCell(0).setCellType(HSSFCell.CELL_TYPE_STRING);
	                    	 if("出口".equals(row.getCell(0).getStringCellValue().toString())) {
	                    		 cm.setZxbz("0");
	         	            }else if("进口".equals(row.getCell(0).getStringCellValue().toString())) {
	         	            	cm.setZxbz("1");
	         	            }
	                    	// 将区域编号的cell中的内容当做字符串处理
	     	                row.getCell(1).setCellType(HSSFCell.CELL_TYPE_STRING);
	                    	 if(row.getCell(1).getCellType()==1) {
	                    		 cm.setYlmc(row.getCell(1).getStringCellValue().toString());
	                    	 }else {
	                    		 cm.setYlmc(String.valueOf(row.getCell(1).CELL_TYPE_NUMERIC));
	                    	 }
	                    	// 将区域编号的cell中的内容当做字符串处理
	     	                row.getCell(2).setCellType(HSSFCell.CELL_TYPE_STRING);
	                    	 if(row.getCell(2).getCellType()==1) {
	                    		 cm.setPcdh(row.getCell(2).getStringCellValue().toString());
	                    	 }else {cm.setPcdh(String.valueOf(row.getCell(2).CELL_TYPE_NUMERIC));}
	                    	// 将区域编号的cell中的内容当做字符串处理
	     	                row.getCell(3).setCellType(HSSFCell.CELL_TYPE_STRING);
	                    	 if(row.getCell(3).getCellType()==1) {
	                    		 cm.setCph(row.getCell(3).getStringCellValue().toString());
	                    	 }else {cm.setCph(String.valueOf(row.getCell(3).CELL_TYPE_NUMERIC));}
	                    	// 将区域编号的cell中的内容当做字符串处理
	     	                row.getCell(4).setCellType(HSSFCell.CELL_TYPE_STRING);
	                    	 if(row.getCell(4).getCellType()==1) {
	                    		 cm.setCxh(row.getCell(4).getStringCellValue().toString());
	                    	 }else {cm.setCxh(String.valueOf(row.getCell(4).CELL_TYPE_NUMERIC));}
	                    	// 将区域编号的cell中的内容当做字符串处理
	     	                row.getCell(5).setCellType(HSSFCell.CELL_TYPE_STRING);
	                    	 if(row.getCell(5).getCellType()==1) {
	                    		 cm.setCxm(row.getCell(5).getStringCellValue().toString());
	                    	 }else {cm.setCxm(String.valueOf(row.getCell(5).CELL_TYPE_NUMERIC));}
	                    	// 将区域编号的cell中的内容当做字符串处理
	     	                row.getCell(6).setCellType(HSSFCell.CELL_TYPE_STRING);
	                    	 if(row.getCell(6).getCellType()==1) {
	                    		 cm.setFcm(row.getCell(6).getStringCellValue().toString());
	                    	 }else { cm.setFcm(String.valueOf(row.getCell(6).CELL_TYPE_NUMERIC));}
	                    	// 将区域编号的cell中的内容当做字符串处理
	     	                row.getCell(7).setCellType(HSSFCell.CELL_TYPE_STRING);
	                    	 if(row.getCell(7).getCellType()==1) {
	                    		 cm.setLdlsh(row.getCell(7).getStringCellValue().toString());
	                    	 }else {cm.setLdlsh(String.valueOf(row.getCell(7).CELL_TYPE_NUMERIC));}
	                    	// 将区域编号的cell中的内容当做字符串处理
	     	                row.getCell(8).setCellType(HSSFCell.CELL_TYPE_STRING);
	                    	 if(row.getCell(8).getCellType()==1) {
	                    		 cm.setTotal(row.getCell(8).getStringCellValue().toString());
	                    	 }else {cm.setTotal(String.valueOf(row.getCell(8).CELL_TYPE_NUMERIC));}
	                    	// 将区域编号的cell中的内容当做字符串处理
	     	                row.getCell(9).setCellType(HSSFCell.CELL_TYPE_STRING);
	                    	 if(row.getCell(9).getCellType()==1) {
	                    		 cm.setDai(row.getCell(9).getStringCellValue().toString());
	                    	 }else {cm.setDai(String.valueOf(row.getCell(9).CELL_TYPE_NUMERIC));}
	                    	// 将区域编号的cell中的内容当做字符串处理
	     	                row.getCell(10).setCellType(HSSFCell.CELL_TYPE_STRING);
	                    	 if(row.getCell(10).getCellType()==1) {
	                    		 cm.setJian(row.getCell(10).getStringCellValue().toString());
	                    	 }else {cm.setJian(String.valueOf(row.getCell(10).CELL_TYPE_NUMERIC));}
	                    	// 将区域编号的cell中的内容当做字符串处理
	     	                row.getCell(11).setCellType(HSSFCell.CELL_TYPE_STRING);
	                    	 if(row.getCell(11).getCellType()==1) {
	                    		 cm.setZl(row.getCell(11).getStringCellValue().toString());
	                    	 }else {cm.setZl(String.valueOf(row.getCell(11).CELL_TYPE_NUMERIC));}
	                    	// 将区域编号的cell中的内容当做字符串处理
	     	                row.getCell(12).setCellType(HSSFCell.CELL_TYPE_STRING);
	                    	 if(row.getCell(12).getCellType()==1) {
	                    		 cm.setGkppl(row.getCell(12).getStringCellValue().toString());
	                    	 }else {cm.setGkppl(row.getCell(12).getStringCellValue().toString());}
	                    	// 将区域编号的cell中的内容当做字符串处理
	     	                row.getCell(13).setCellType(HSSFCell.CELL_TYPE_STRING);
			                    	 if("未进局".equals(row.getCell(13).getStringCellValue().toString())) {
			                    		 cm.setClstatus("0");
			         	            }else {
			         	            	cm.setClstatus("1");
			         	            }
			                    	// 将区域编号的cell中的内容当做字符串处理
			     	                row.getCell(14).setCellType(HSSFCell.CELL_TYPE_STRING);
	                    	 if(row.getCell(14).getCellType()==1) {
	                    		 cm.setFctime(row.getCell(14).getStringCellValue().toString());
	                    	 }else {cm.setFctime(String.valueOf(row.getCell(14).CELL_TYPE_NUMERIC));}
	                    	// 将区域编号的cell中的内容当做字符串处理
	     	                row.getCell(15).setCellType(HSSFCell.CELL_TYPE_STRING);
	                    	 if(row.getCell(15).getCellType()==1) {
	                    		 cm.setCllx(row.getCell(15).getStringCellValue().toString());
	                    		 
	                    	 }else {cm.setCllx(String.valueOf(row.getCell(15).CELL_TYPE_NUMERIC));
	                    	
	                    	 }
	                    	// 将区域编号的cell中的内容当做字符串处理
	     	                row.getCell(16).setCellType(HSSFCell.CELL_TYPE_STRING);
	                    	 //System.out.println("cllx--->"+cm.getCllx());
	                    	 if(row.getCell(16).getCellType()==1) {
	                    		 cm.setTccbh(row.getCell(16).getStringCellValue().toString());
	                    	 }else {cm.setTccbh(String.valueOf(row.getCell(16).CELL_TYPE_NUMERIC));}
	                    	 //System.out.println("tccbh--->"+cm.getTccbh());
	                    	 //cldjModels.add(cm);
	                    	 this.cldjService.plDRFromExcle(cm);
	                    }
	            	fs.close();
		 this.success = true;
			return AJAX;
	}
//批量导入
	function pldrAllow(){
			//$('#uploadWindow').window('open');
			var ad = $("<div/>").dialog({
				width:320,
				height:220,
				modal:true,
				title: '车辆登记批量导入',
				href:'${ctx}/cldj/load_pldrCldj.action',
				buttons:[{text:'导入',iconCls : 'icon-add', 
					handler:function() {
						$('#importForm').form('submit',{
							url : '${ctx}/cldj/cldj_plDR.action',
							data: $('#importForm').serialize(),
							onSubmit:function(){
							 var fileDir = document.getElementById("uploadFile").value;
								 console.log(fileDir);
							    var suffix = fileDir.substr(fileDir.lastIndexOf("."));
							    if("" == fileDir){
							    alert("选择需要导入的Excel文件!");
							    //$.messager.show({title : '提示', msg : "选择需要导入的Excel文件!"});
							    //e.preventDefault();
							        return false;
							    }
							    if(".xls" != suffix && ".xlsx" != suffix ){
							     alert("选择Excel格式的文件导入!!");
							    //$.messager.show({title : '提示', msg : "选择Excel格式的文件导入!"});
							     //e.preventDefault();
							        return false;
		    					} 
							},
							success : function(r) {
							
							ad.dialog('close');
								    /*添加成功, 把新添加的数据添加到列表前*/
									dfdjgrid.datagrid('reload');
									 dfdjgrid.datagrid('uncheckAll');
									 dfdjgrid.datagrid('unselectAll');
								/* var obj = jQuery.parseJSON(r);
								if (obj.success) {
									ad.dialog('close');
									dfdjgrid.datagrid('reload');
									 dfdjgrid.datagrid('uncheckAll');
									 dfdjgrid.datagrid('unselectAll');
								} */
								$.messager.show({title : '提示', 	msg : "添加成功"});
							}
						});
				}},{text:'取消',iconCls: 'icon-cancel', handler:function(){
						ad.dialog('close');
					}}],
				onClose: function() {  /*关闭的时候销毁相关的资源.*/
					ad.dialog('destroy');
				}
			});
			
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值