Javaweb中使⽤POI对Excel,word进⾏批量导⼊导出处理
⾸先对EXCEL或者Word处理我们要懂得使⽤原则:
之前使⽤过NPOI常见基本都是在或者C#中使⽤,感兴趣可以去了解⼀下,⼤致相同;
⾸先是导⼊操作:
1.我们要进⾏⽂件上传(需要使⽤jar包fileupload),那么我们需要对⽂件流进⾏⼀个保存,最后⾯我们只需要拿到⼀个特定的地址即可,所以我们⽂件上传过程中需要拿到的是,⽂件名称,⽂件流,如果设置其他标题内容也是可以拿到的;
2.保存好⽂件那么就需要对⽂件进⾏解析,所以需要包(POI),然后进⾏存储,存储过程中我们要对前端进⾏数据的显⽰,那么如果连接数据库可以存数据库,否则则进⾏存本地操作,那么就需要对⽂件上传内容的要求定义类进⾏内容的存储,存储在MAP,LIST中之后进⾏调⽤;
3.前端调⽤使⽤的是EL和JSTL进⾏前端的调⽤,⽤于简化前端的代码,变得规范性;
综上所诉,所有需要导⼊的jar包:
接下来就是进⾏处理:
⽂件上传处理:
上传⽂件前端表单必须是这个:
package com.java.util;
import com.java.dto.ParamDto;
import org.apachemons.fileupload.FileItem;
import org.apachemons.fileupload.FileUploadException;
import org.apachemons.fileupload.disk.DiskFileItemFactory;
import org.apachemons.fileupload.servlet.ServletFileUpload;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;
/**
* 做⼀个解析帮助类,⽤来对上传下载内容的解析操作
*/
public class RequestHelper {
/**
* 数据流解析对上传内容进⾏解析操作;
* @param request
*/
private static final String SAVE_PATH ="K:/JavawebExportDown/web/import/";
public static ParamDto parseParam(HttpServletRequest request){
ParamDto result =new ParamDto();
//需要知道导⼊的内容是普通表单内容,还是上传⽂件内容,具体看上次也就详细说明;
//ServletFileUpload.isMultipartContent 判断前端返回的类型是否是 enctype="multipart/form-data"
if(ServletFileUpload.isMultipartContent(request))
{
//是上传⽂件类型
ServletFileUpload upload =new ServletFileUpload(new DiskFileItemFactory());
upload.setHeaderEncoding("UTF-8");
try{
/*
进⾏请求的解析,传回数据是 ,
⾥⾯存储的是所有上传的内容
下⾯数据内容直接打印是不⾏的需要上传到⼀个map数组⾥⾯然后回发给前端进⾏使⽤,则使⽤dto进⾏数组内容封装; */
List<FileItem> fileItemList = upload.parseRequest(request);
//需要看拿到的是什么数据
for(FileItem fileItem:fileItemList){
if(fileItem.isFormField()){
//判断是否是普通表单,是⾛这⾥,getFieldName控件name
//System.out.FieldName() + ",标题内容:" + String("UTF-8"));
}else{
//System.out.println("⽂件名字:"+FieldName());
//进⾏⽂件内容存储,这是⽂件流,getName获取⽂件名;
fileItem.write(new File(SAVE_PATH + Name()));
}
}
}catch(FileUploadException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
}else{
//不是上传⽂件类型,普通表单使⽤Parameter();
//Parameter();
}
return result;
}
}
代码中有详细注释,如果是⽂件就进⾏存储否则就进⾏取值;
前端传回来的不只是⽂件,还有⼀些输⼊框内容,⽐如标题…那我们就需要进⾏这⼏个内容的存值,则就需要进⾏定义操作;
package com.java.dto;
import org.apachemons.fileupload.FileItem;
import java.util.HashMap;
import java.util.Map;
/**
* 对数据流进⾏存储的封装
*/
getsavefilenamepublic class ParamDto {
private Map<String,String> ParaMap;//数据流封装
private Map<String, FileItem> fileMap;//⽂件流存储
//编写构造⽅法⽅便直接调⽤
public ParamDto(){
ParaMap =new HashMap<>();
fileMap =new HashMap<>();
}
public Map<String, String>getParaMap(){
return ParaMap;
}
public void setParaMap(Map<String, String> paraMap){
ParaMap = paraMap;
}
public Map<String, FileItem>getFileMap(){
return fileMap;
}
public void setFileMap(Map<String, FileItem> fileMap){
this.fileMap = fileMap;
}
}
对数据流进⾏存储操作,如果是数据则存储数据,如果是⽂件流则存储⽂件;
这时候已经明确前端request⾥⾯发送过来⼏个什么值,也需要进⾏⼀个封装操作;我这边是⼀个标题和⽂件;便于后⾯的调⽤,然后就可以把ParamDto ⾥⾯的数据准确存储到⾥⾯⽤于调⽤;
package com.java.dto;
import org.apachemons.fileupload.FileItem;
/**
* 这边是做明确传⼊内容的模块化内容进⾏对象的存储
*/
public class ImportExcelParamDto {
private String title;
private FileItem fileItem;
public ImportExcelParamDto(){
}
public ImportExcelParamDto(String title, FileItem fileItem){
this.title = title;
this.fileItem = fileItem;
}
public String getTitle(){
return title;
}
public void setTitle(String title){
this.title = title;
}
public FileItem getFileItem(){
return fileItem;
}
public void setFileItem(FileItem fileItem){
this.fileItem = fileItem;
}
}
这边做存储演⽰,不管它;
//明确导⼊内容进⾏⼀个存储值操作
ImportExcelParamDto importExcelParamDto =new ImportExcelParamDto(); importExcelParamDto.ParaMap().get("title"));
importExcelParamDto.FileMap().get("excel"));
3.利⽤POI进⾏⽂件的解析读写操作
⽅法⼀:在本地⽣成⽂件,这种⽅式⽐较少
package com.java.Service;
import com.java.Model.ExcelDataList;
import com.java.dto.ImportExcelParamDto;
import com.java.dto.importExcelResult;
import com.java.util.FileHelper;
import org.apachemons.fileupload.FileItem;
import org.apache.ptions.InvalidFormatException;
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;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 对excel上次内容进⾏解析
*/
public class ExcelService {
/**
* 明确传⼊内容,进⾏⼀个数据模块存储操作,返回值是⼀个导⼊结果类;
* @param dto
*/
public importExcelResult imp(ImportExcelParamDto dto){
//需要使⽤POI进⾏操作,进⾏excel或word的读写操作;
//获取⽂件,⽂件保存地址也不应该是写死的,则需要⼀个⽂件保存帮助类来完成
importExcelResult result =new importExcelResult();//做⼀个导⼊结果返回值
result.Title());
String FileName =null;
//多个值存在List中
List<ExcelDataList> excelDataLists =new ArrayList<>();
result.setLists(excelDataLists);
try{
FileName = FileHelper.FileItem());
}catch(Exception ex){
ex.printStackTrace();
//发⽣错误的时候,通知页⾯
result.setMsg("保存上传⽂件失败");
}
if(FileName !=null){
try{
Workbook workbook = ate(new File(FileName));
Sheet sheet = SheetAt(0);//第⼏个⽂件夹
int rowNums = LastRowNum();//获取总共多少⾏
for(int i =1; i <= rowNums; i++){//不从第⼀⾏开始,从第⼆⾏开始,第⼀⾏⼀般为标题⾏
Row row = Row(i);
ExcelDataList ex =new ExcelDataList();
ex.Cell(0).getStringCellValue());
ex.setAge((Cell(1).getNumericCellValue());
ex.Cell(2).getDateCellValue());
excelDataLists.add(ex);
// System.out.println("姓名:" + Cell(0).getStringCellValue());//字符串值
// System.out.println("年龄:" + Cell(1).getNumericCellValue());//数字值
// System.out.println("时间:" + Cell(2).getDateCellValue());//时间值
}
}catch(IOException | InvalidFormatException iex){
iex.printStackTrace();
result.setMsg("解析Excel失败");
}
}
return result;
}
}
⽅法⼆:⽂件不落地,也就是解析⽂件内容,但是不在本地⽣成⽂件;其实没有什么特别之处就是利⽤NPO提供的fileItem进⾏⽂件流的读取这样不会在本地⽣成excel⽂件,也可以获取内容;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论