strus2与poi 批量导入

项目场景:

提示:这里简述项目相关背景:
公司使用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.csdn.net/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');
				}
			});
			
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用poi实现批量导入,你可以按照以下步骤进行操作: 1. 在前端页面中添加一个文件上传的表单,可以使用HTML的<input type="file">标签。\[1\] 2. 在后端的控制器中添加一个处理文件上传的接口,使用@RequestParam注解获取上传的文件。然后使用poi库解析Excel文件,将数据保存到数据库中。\[1\] 3. 在Excel文件中,每一行代表一个数据记录,每一列代表一个字段。你可以根据需要定义Excel文件的格式,例如第一行可以是字段名,从第二行开始是数据记录。\[3\] 4. 使用poi库的API读取Excel文件中的数据,并将数据保存到数据库中。你可以使用poi的HSSFWorkbook或XSSFWorkbook类来读取Excel文件,然后使用Sheet类和Row类来遍历每一行和每一列的数据。\[3\] 5. 将读取到的数据保存到数据库中,可以使用数据库操作的相关API,例如使用JDBC或者使用ORM框架如MyBatis进行数据库操作。\[3\] 通过以上步骤,你就可以使用poi实现批量导入功能了。你可以根据具体的需求进行相应的调整和扩展。 #### 引用[.reference_title] - *1* *2* *3* [SpringBoot项目+Echart数据展示+poi 实现批量导入导出](https://blog.csdn.net/m0_60459789/article/details/128100521)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值