這篇文章給大家介紹利用Java怎么上傳與下載Excel表格,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
猇亭網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,猇亭網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為猇亭近千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的猇亭做網(wǎng)站的公司定做!
Excel表格文件的上傳和下載,java中涉及到文件肯定會有io流的知識。
而excel文件就要涉及到poi技術(shù),而excel的版本包括:2003-2007和2010兩個版本, 即excel的后綴名為:xls和xlsx。
這里我是按照正規(guī)的項目流程做的案例,所以可能會比網(wǎng)上的一些Demo復(fù)雜一些。不過文件的上傳和下載基本都是一套固定的流程,只是每個人的實現(xiàn)方式不太相同。
數(shù)據(jù)庫我用的是MySQL。
下面是我的項目目錄:
按照正常的項目做了分層處理,文件上傳的業(yè)務(wù)我放到了service處理,而文件下載業(yè)務(wù)還在controller層。
對前端請求處理,我分成了兩個方法都放在HandleExcelController里面,這個類繼承了BaseExcelController,基本的文件操作處理在BaseExcelController里面。
BaseExcelController繼承了BaseController,BaseController類是所有controller的父類,這里用到的不太多,這個類封裝了response返回值等的處理等一些方法。
項目中除了springMVC和mybatis的jar包之外還引入了:
上傳和下載excel文件:
1、創(chuàng)建需要上傳的excel文件,為了簡化,我這里只寫了四列,即四個字段
2、創(chuàng)建jsp頁面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>Excel文件處理 ">
3、依次創(chuàng)建controller、service、domain、mapper層,注意它們的依賴關(guān)系
1)、controller層的處理,在HandleExcelController里面注入BaseExcelService。因為只是做個示范,所欲我這里將泛型固定為Students類
BaseExcelController代碼:
package cn.wangze.controller; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; import java.util.Iterator; import java.util.List; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFPalette; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.CellRangeAddress; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.web.multipart.MultipartFile; import cn.wangze.domain.Students; public class BaseExcelController extends BaseController{ //獲取文件的路徑 String separator = System.getProperty("file.separator"); //驗證元素是否為空 @SuppressWarnings("all") public boolean isEmpty(Object obj){ if(obj instanceof Object[]){ if(((Object[]) obj).length==0){ return true; } if(obj == null) return true; if((String.valueOf(obj).trim()).length() == 0){ return true; } if(obj instanceof List){ if(((List) obj) == null || ((List)obj).size() == 0){ return true; } } } return false; } /** * 文件上傳部分 * */ //驗證文件 protected boolean checkPathName(String fileName,HttpServletResponse response){ //驗證文件是否存在 if(isEmpty(fileName)){ sendError("上傳文件不存在",response); return false; } //驗證文件是否是以xls或者xlsx做后綴的文件,如果不是就返回錯誤信息 if(!(StringUtils.endsWithIgnoreCase(fileName,".xls")||StringUtils.endsWithIgnoreCase(fileName, ".xlsx"))){ sendError("上傳文件類型錯誤,請核對后重新上傳?",response); } return true; } //獲取文件的sheet protected Sheet getSheet(MultipartFile file,String path,String fileName) throws IllegalStateException, IOException{ //找到要存放到項目里面的路徑,新建文件 File targetFile = new File(path, fileName); targetFile.mkdirs(); if (targetFile.exists()) { targetFile.delete(); file.transferTo(targetFile); } else { file.transferTo(targetFile); } //封裝輸入流,封裝sheet里面的內(nèi)容 InputStream is = null; try{ is = new FileInputStream(path+separator+fileName); //判斷版本是否為Excel加強版 if(StringUtils.endsWithIgnoreCase(fileName, ".xls")){ return new HSSFWorkbook(is).getSheetAt(0); }else if(StringUtils.endsWithIgnoreCase(fileName, ".xlsx")){ return new XSSFWorkbook(is).getSheetAt(0); } return null; } finally{ if(is != null){ is.close(); } } } /** * 文件下載部分 * */ //根據(jù)傳入的Sting值,判斷生成在excel表的位置 private HSSFCellStyle getPublicStyle(HSSFWorkbook workbook,String key){ HSSFFont font = workbook.createFont(); HSSFCellStyle style = workbook.createCellStyle(); HSSFPalette customPalette = workbook.getCustomPalette(); customPalette.setColorAtIndex(HSSFColor.TEAL.index, (byte) 64, (byte) 148, (byte) 160); customPalette.setColorAtIndex(HSSFColor.ORANGE.index, (byte) 170, (byte) 204, (byte) 204); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); if(key=="head"){ style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); font.setFontHeightInPoints((short)12); font.setColor(HSSFColor.TEAL.index); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); style.setFont(font); } if(key=="title"){ font.setColor(HSSFColor.WHITE.index); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setLeftBorderColor(HSSFColor.WHITE.index); style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setRightBorderColor(HSSFColor.WHITE.index); style.setFont(font); style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); style.setFillForegroundColor(HSSFColor.ORANGE.index); style.setFillBackgroundColor(HSSFColor.ORANGE.index); } return style; } //創(chuàng)建head頭信息 private void createHead(HSSFSheet sheet,HSSFCellStyle style,String[] title){ HSSFRow row1 = sheet.createRow(0); HSSFCell cellTitle = row1.createCell(0); cellTitle.setCellValue(new HSSFRichTextString(title[0])); sheet.addMergedRegion(new CellRangeAddress(0,0,0,title.length-2)); cellTitle.setCellStyle(style); } //創(chuàng)建title信息 private void createTitle(HSSFSheet sheet,HSSFCellStyle style,String[] label,int columnNum){ HSSFRow row2 = sheet.createRow(1); HSSFCell cell1 = null; for(int n=0;nlist,int columnNum,String[] parameters){ int index= 0; Iterator it = list.iterator(); while(it.hasNext()){ index++; Students cash = it.next(); int num2 = parameters.length; HSSFRow row = sheet.createRow(index+1); initCells(style, num2,cash, parameters,row); } } //驗證是否為中文 public boolean checkChinese(String s){ int n=0; boolean flag =false; for(int i=0; i list, String path, String[] title, String[] parameters, Students t, String[] endContent) throws IOException{ //根據(jù)傳入的title數(shù)組的第一個值,設(shè)置文件名稱 String filename = title[0]+"_"+ new SimpleDateFormat("yyyyMMdd").format(new Date())+".xls"; //輸出流放到文件的本地位置 FileOutputStream fos = new FileOutputStream(path+separator+filename); //列數(shù),根據(jù)title的個數(shù),除去第一個就是每列title的信息 int columnNum = title.length-1; int numText = list.size(); HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet(); sheet.setDefaultColumnWidth (20); sheet.setDefaultRowHeight((short)400); HSSFCellStyle contentStyle = this.getPublicStyle(workbook,""); HSSFCellStyle titleStyle = this.getPublicStyle(workbook,"title"); HSSFCellStyle headerStyle = this.getPublicStyle(workbook,"head"); createHead(sheet,headerStyle,title); createTitle(sheet,titleStyle,title,columnNum); createContent(sheet,contentStyle,list,columnNum,parameters); //createEnd(sheet,contentStyle,numText,columnNum,t,endContent); workbook.write(fos); fos.flush(); fos.close(); return filename; } }
HandleExcelController用來處理前端請求,代碼如下:
package cn.wangze.controller; import java.io.File; import java.util.List; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.io.FileUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.multipart.MultipartFile; import cn.wangze.domain.Students; import cn.wangze.service.BaseExcelService; @Controller @RequestMapping("/File") public class HandleExcelController extends BaseExcelController{ @Autowired private BaseExcelService baseExcelService; @RequestMapping("/UploadExcel") public void UploadExcel(MultipartFile file,HttpSession session,HttpServletResponse response) throws Exception{ //如果上傳的文件不存在,拋出異常 if(file == null){ throw new Exception("文件不存在"); } //獲取文件名 String fileName = file.getOriginalFilename(); //選擇上傳的文件存放到項目的路徑 String path = session.getServletContext().getRealPath(separator+"res"+separator+"upload"); if(!checkPathName(fileName,response)) return ; String msg = baseExcelService.loadExcel(getSheet(file, path, fileName)); sendMsg(true,msg,response); } @RequestMapping("/DownLoadExcel") public void UpdownExcel(Students student,HttpServletResponse res,HttpSession session,HttpServletResponse response) throws Exception{ Liststus = baseExcelService.queryList(student); if(stus.size()==0){ res.sendRedirect("/index.jsp"); return; } //下載的excel文件存放的本地路徑 String path = session.getServletContext().getRealPath(separator+"res"+separator+"exportExcel"+separator); ServletOutputStream os = res.getOutputStream(); Students t = baseExcelService.queryTotal(student); //標題文字,數(shù)值中的第一個值+當前日期為文件名稱,以后的每個元素為每列的標題 String[] title={"studets04","id","名字","年齡","性別"};//標題文字 //對應(yīng)實體類的屬性值 String[] parameters ={"id","name","age","sex"}; String[] endContent = {"","","",""}; //調(diào)用父類的處理方法,生成excel文件 String filename = getOutputName(stus,path,title,parameters,t,endContent); try { res.reset(); res.setCharacterEncoding("utf8"); res.setContentType("application/vnd.ms-excel;charset=utf8"); res.setHeader("Content-Disposition", "attachment;fileName=" +new String(filename.getBytes("utf-8"),"iso-8859-1")); os.write(FileUtils.readFileToByteArray(new File(path+separator+filename))); sendResult(true,response); os.flush(); } finally { if (os != null) { os.close(); } } } }
2)、service層的處理,把StudentsMapper注入到BaseExcelService
BaseExcelService代碼:
package cn.wangze.service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpSession; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import cn.wangze.domain.Students; import cn.wangze.mapper.StudentsMapper; @Service public class BaseExcelService { @Autowired private StudentsMapperstudentsMapper; //判斷字符串是否為空 public boolean isEmpty(String str) { return str == null || str.length() == 0; } //獲取單個表格(字段)存放的信息 private String getValue(Cell cell,String cellLable,Map errMap){ cell.setCellType(Cell.CELL_TYPE_STRING); String value = cell.getStringCellValue().trim(); return value; } //通過這個方法將excel表的每行的數(shù)據(jù)放到info對象里面 private String addInfo(Row row,Students info){ Map errMap = new HashMap (); String id = getValue(row.getCell(0),"ID",errMap); String username = getValue(row.getCell(1),"姓名",errMap); String age = getValue(row.getCell(2),"年齡",errMap); String sex = getValue(row.getCell(3),"性別",errMap); String errMsg = errMap.get("errMsg"); if(!isEmpty(errMsg)){ return errMsg; } info.setId(id); info.setName(username); info.setAge(age); info.setSex(sex); return null; } public String loadExcel(Sheet sheet) throws Exception{ //新建一個List集合,用來存放所有行信息,即每行為單條實體信息 List infos = new ArrayList (); //獲取到數(shù)據(jù)行數(shù),第一行是title,不需要存入數(shù)據(jù)庫,所以rowNum從1開始 for (int rowNum = 1; rowNum <= sheet.getLastRowNum(); rowNum++) { Students info = new Students(); String errMsg2 = addInfo(sheet.getRow(rowNum),info); if(errMsg2 != null) return errMsg2; infos.add(info); } if(infos.isEmpty()){ return "沒有解析到學(xué)生數(shù)據(jù),請查驗EXCEL文件"; } //通過studentsMapper的insertSheetData方法,將實體類存放的數(shù)據(jù)插入到數(shù)據(jù)庫 int result = studentsMapper.insertSheetData(infos); //若插入成功會返回大于1的整數(shù),返回success if(result >= 1){ return "success"; } return "error"; } //查詢所有數(shù)據(jù)庫存放的學(xué)生信息 public List queryList(Students students){ return studentsMapper.queryList(students); } //獲取到的學(xué)生實體信息 public Students queryTotal(Students students){ return studentsMapper.queryTotal(students); } public void downExcel(HttpSession session,String separator){ } }
3)、實體層的處理,字段要對應(yīng)excel表的字段
package cn.wangze.domain; public class Students { String id; String name; String age; String sex; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
4)、dao層處理:StudentsMapper.java是一個接口,業(yè)務(wù)到數(shù)據(jù)庫需要執(zhí)行的方法在這里聲明,StudentsMapper.xml相當于接口的實現(xiàn)類,用來連接java和數(shù)據(jù)庫的操作。
StudentsMapper.java代碼:
package cn.wangze.mapper; import java.util.List; public interface StudentsMapper{ public int insertSheetData(List list); public List queryList(T t); public T queryTotal(T t); }
StudentsMapper.xml代碼:
id,name,age,sex t.id,t.name,t.age,t.sex #{id},#{name},#{age},#{sex} where 1=1 and id=#{id} and name=#{name} and age=#{age} and sex=#{sex} where 1=1 and id=#{t.id} and name=#{t.name} and age=#{t.age} and sex=#{t.sex} set id=#{id}, name=#{name}, age=#{age}, sex=#{sex}, insert into students (id,name,age,sex) values (#{item.id},#{item.name},#{item.age},#{item.sex})
所有的代碼就是這些了,操作的時候需要注意的多是路徑的問題。最復(fù)雜的就是BaseExcelController的操作,它做的事情就是解析上傳和創(chuàng)建下載excel文件。
執(zhí)行完之后的結(jié)果圖是這樣:
在數(shù)據(jù)庫查看上傳的excel表:
下載到D:\tomcat\tomcat6.0.32\webapps\ExcelHandleDemo\res\exportExcel文件夾下的excel表:
這里有一點不足的地方,我相信你已經(jīng)發(fā)現(xiàn)了,就是下載完excel表格之后,前端還沒有和業(yè)務(wù)對接上,沒有相應(yīng)的提示來告訴操作人執(zhí)行結(jié)果,只能通過代碼設(shè)置好的路徑去查看文件夾下是否有下載的excel文件,
關(guān)于利用Java怎么上傳與下載Excel表格就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。