项目场景:
提示:这里简述项目相关背景:
公司使用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 />
<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');
}
});
}