使用到的jar包【注】POI jar版本要一致,不然有类找不到的报错
JSP: client.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <% String importMsg = ""; if (request.getSession().getAttribute("msg") != null) { importMsg = request.getSession().getAttribute("msg").toString(); } request.getSession().setAttribute("msg", ""); %> <head> <title>批量导入客户</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script src="${pageContext.request.contextPath}/js/jquery-1.11.0.min.js"></script> <script type="text/javascript"> function check() { var excel_file = $("#excel_file").val(); if (excel_file == "" || excel_file.length == 0) { alert("请选择文件路径!"); return false; } else { return true; } } $(document).ready(function() { var msg = ""; if ($("#importMsg").text() != null) { msg = $("#importMsg").text(); } if (msg != "") { alert(msg); } }); </script> <body> <a href="download.htm?fileName=muban.xls">下载Exel模板</a> <div> <font color="bule">批量导入客户</font> </div> <form action="batchimport.htm" method="post" enctype="multipart/form-data" onsubmit="return check();"> <div style="margin: 30px;"> <input id="excel_file" type="file" name="filename" accept="xlsx" size="80" /> <input id="excel_button" type="submit" value="导入Excel" /> </div> <font id="importMsg" color="red"><%=importMsg%></font><input type="hidden" /> </form> </body> </html>
controller: ClientController.java
package com.shiliu.game.controller; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import com.shiliu.game.domain.bean.Customer; import com.shiliu.game.utils.ReadExcel; import com.shiliu.game.utils.WDWUtil; /** * @author wkr * @Date 2016-11-18 */ @Controller @RequestMapping("/client") public class ClientController { private static Log log = LogFactory.getLog(ClientController.class); /** * 访问controller进入操作页面 * @return */ @RequestMapping(value="/init") public String init(){ System.out.println("控制台输出:初始化页面信息"); return "client/client"; } /** * 上传Excel,读取Excel中内容 * @param file * @param request * @param response * @return * @throws IOException */ @RequestMapping(value = "/batchimport",method = RequestMethod.POST) public String batchimport(@RequestParam(value="filename") MultipartFile file, HttpServletRequest request,HttpServletResponse response) throws IOException{ log.info("ClientController ..batchimport() start"); String Msg =null; boolean b = false; //判断文件是否为空 if(file==null){ Msg ="文件是为空!"; request.getSession().setAttribute("msg",Msg); return "client/client"; } //获取文件名 String name=file.getOriginalFilename(); //进一步判断文件是否为空(即判断其大小是否为0或其名称是否为null)验证文件名是否合格 long size=file.getSize(); if(name==null || ("").equals(name) && size==0 && !WDWUtil.validateExcel(name)){ Msg ="文件格式不正确!请使用.xls或.xlsx后缀文档。"; request.getSession().setAttribute("msg",Msg); return "client/client"; } //创建处理EXCEL ReadExcel readExcel=new ReadExcel(); //解析excel,获取客户信息集合。 List<Customer> customerList = readExcel.getExcelInfo(file); if(customerList != null && !customerList.toString().equals("[]") && customerList.size()>=1){ b = true; } if(b){ //迭代添加客户信息(注:实际上这里也可以直接将customerList集合作为参数,在Mybatis的相应映射文件中使用foreach标签进行批量添加。) for(Customer customer:customerList){ //这里可以做添加数据库的功能 System.out.println("第一个值:"+customer.getCustomer1()+"\t第二个值:"+customer.getCustomer2()+"\t第三个值:"+customer.getCustomer3()); } Msg ="批量导入EXCEL成功!"; request.getSession().setAttribute("msg",Msg); }else{ Msg ="批量导入EXCEL失败!"; request.getSession().setAttribute("msg",Msg); } return "client/client"; } /** * 下载Excel模板 * @param fileName * @param request * @param response * @return */ @RequestMapping("/download") public String download(String fileName, HttpServletRequest request, HttpServletResponse response) { System.out.println("控制台输出:走入下载"); response.setCharacterEncoding("utf-8"); response.setContentType("multipart/form-data"); response.setHeader("Content-Disposition", "attachment;fileName="+ fileName); try { /*String path = Thread.currentThread().getContextClassLoader() .getResource("").getPath() + "download";//这个download目录为啥建立在classes下的 */ String path="D:\\upload"; InputStream inputStream = new FileInputStream(new File(path+ File.separator + fileName)); OutputStream os = response.getOutputStream(); byte[] b = new byte[2048]; int length; while ((length = inputStream.read(b)) > 0) { os.write(b, 0, length); } // 这里主要关闭。 os.close(); inputStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // 返回值要注意,要不然就出现下面这句错误! //java+getOutputStream() has already been called for this response return null; } }
utils: WDWUtil.java
package com.shiliu.game.utils; /** * @author wkr * @Date 2016-11-18 * 工具类验证Excel文档 */ public class WDWUtil { /** * @描述:是否是2003的excel,返回true是2003 * @param filePath * @return */ public static boolean isExcel2003(String filePath) { return filePath.matches("^.+\\.(?i)(xls)$"); } /** * @描述:是否是2007的excel,返回true是2007 * @param filePath * @return */ public static boolean isExcel2007(String filePath) { return filePath.matches("^.+\\.(?i)(xlsx)$"); } /** * 验证是否是EXCEL文件 * @param filePath * @return */ public static boolean validateExcel(String filePath){ if (filePath == null || !(isExcel2003(filePath) || isExcel2007(filePath))){ return false; } return true; } }
utils: ReadExcel.java
package com.shiliu.game.utils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.commons.CommonsMultipartFile; import com.shiliu.game.domain.bean.Customer; /** * @author wkr * @Date 2016-11-18 * 工具类读取Excel类中内容 */ public class ReadExcel { //总行数 private int totalRows = 0; //总条数 private int totalCells = 0; //错误信息接收器 private String errorMsg; //构造方法 public ReadExcel(){} //获取总行数 public int getTotalRows() { return totalRows;} //获取总列数 public int getTotalCells() { return totalCells;} //获取错误信息-暂时未用到暂时留着 public String getErrorInfo() { return errorMsg; } /** * 读EXCEL文件,获取客户信息集合 * @param fielName * @return */ public List<Customer> getExcelInfo(MultipartFile Mfile){ //把spring文件上传的MultipartFile转换成CommonsMultipartFile类型 CommonsMultipartFile cf= (CommonsMultipartFile)Mfile; //获取本地存储路径 File file = new File("D:\\fileupload"); //创建一个目录 (它的路径名由当前 File 对象指定,包括任一必须的父路径。) if (!file.exists()) file.mkdirs(); //新建一个文件 File file1 = new File("D:\\fileupload\\" + new Date().getTime() + ".xls"); //将上传的文件写入新建的文件中 try { cf.getFileItem().write(file1); } catch (Exception e) { e.printStackTrace(); } //初始化客户信息的集合 List<Customer> customerList=new ArrayList<Customer>(); //初始化输入流 FileInputStream is = null; Workbook wb = null; try{ //根据新建的文件实例化输入流 is = new FileInputStream(file1); //根据excel里面的内容读取客户信息 //当excel是2003时 wb = new HSSFWorkbook(is); //当excel是2007时 //wb = new XSSFWorkbook(is); //读取Excel里面客户的信息 customerList=readExcelValue(wb); is.close(); }catch(Exception e){ e.printStackTrace(); } finally{ if(is !=null) { try{ is.close(); }catch(IOException e){ is = null; e.printStackTrace(); } } } return customerList; } /** * 读取Excel里面客户的信息 * @param wb * @return */ private List<Customer> readExcelValue(Workbook wb){ //得到第一个shell Sheet sheet=wb.getSheetAt(0); //得到Excel的行数 this.totalRows=sheet.getPhysicalNumberOfRows(); //得到Excel的列数(前提是有行数) if(totalRows>=1 && sheet.getRow(0) != null){//判断行数大于一,并且第一行必须有标题(这里有bug若文件第一行没值就完了) this.totalCells=sheet.getRow(0).getPhysicalNumberOfCells(); }else{ return null; } List<Customer> customerList=new ArrayList<Customer>();//声明一个对象集合 Customer customer;//声明一个对象 //循环Excel行数,从第二行开始。标题不入库 for(int r=1;r<totalRows;r++){ Row row = sheet.getRow(r); if (row == null) continue; customer = new Customer(); //循环Excel的列 for(int c = 0; c <this.totalCells; c++){ Cell cell = row.getCell(c); if (null != cell){ if(c==0){ customer.setCustomer1(getValue(cell));//得到行中第一个值 }else if(c==1){ customer.setCustomer2(getValue(cell));//得到行中第二个值 }else if(c==2){ customer.setCustomer3(getValue(cell));//得到行中第三个值 } } } //添加对象到集合中 customerList.add(customer); } return customerList; } /** * 得到Excel表中的值 * * @param cell * Excel中的每一个格子 * @return Excel中每一个格子中的值 */ @SuppressWarnings({ "static-access", "unused" }) private String getValue(Cell cell) { if (cell.getCellType() == cell.CELL_TYPE_BOOLEAN) { // 返回布尔类型的值 return String.valueOf(cell.getBooleanCellValue()); } else if (cell.getCellType() == cell.CELL_TYPE_NUMERIC) { // 返回数值类型的值 return String.valueOf(cell.getNumericCellValue()); } else { // 返回字符串类型的值 return String.valueOf(cell.getStringCellValue()); } } }
entity: Customer.java
package com.shiliu.game.domain.bean; /** * @author wkr * @Date 2016-11-18 * 实体类 */ public class Customer { private Integer id; private String Customer1; private String Customer2; private String Customer3; public Customer() { super(); } public Customer(Integer id, String customer1, String customer2, String customer3) { super(); this.id = id; Customer1 = customer1; Customer2 = customer2; Customer3 = customer3; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getCustomer1() { return Customer1; } public void setCustomer1(String customer1) { Customer1 = customer1; } public String getCustomer2() { return Customer2; } public void setCustomer2(String customer2) { Customer2 = customer2; } public String getCustomer3() { return Customer3; } public void setCustomer3(String customer3) { Customer3 = customer3; } }
效果页面:
===============
可能的报错:
Expected MultipartHttpServletRequest: is a MultipartResolver configured?
java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured?
at org.springframework.util.Assert.notNull(Assert.java:112)
at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.resolveName(RequestParamMethodArgumentResolver.java:151)
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:86)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:157)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:124)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1124)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:361)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:534)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:879)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:741)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:213)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:403)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:522)
解决:
spring mvc中上传附件,需要做两步操作
- 引入包commons-fileupload-*.jar,版本号可以根据项目情况调整;
- 在spring mvc配置文件中增加配置,文件大小限制可根据项目情况调整:
<!-- 上传文件拦截,设置最大上传文件大小 10M=10*1024*1024(B)=10485760 bytes --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="10485760" /> </bean>
这样就可以实现upload上传了。
相关推荐
Java POI 实现 Excel 导入导出 Java POI 是一个流行的 Java 库,用于处理 Microsoft Office 文件格式,包括 ...在本文中,我们已经详细介绍了如何使用 Java POI 实现 Excel 导入导出功能,包括读取和写入 Excel 文件。
Java的Apache POI库是一个强大的工具,用于读取、创建和修改Microsoft Office格式的文件,尤其是Excel(.xlsx)文档。在本示例中,我们将深入探讨如何利用POI库来生成Excel中的图表曲线,这对于数据可视化和报告生成...
首先,需要创建一个Workbook对象,然后使用Workbook对象的getSheet方法获取Excel文件的Sheet对象,最后使用Sheet对象的getRow方法读取Excel文件的数据。 总结 本文详细介绍了如何使用Java POI将图片导出到Excel中,...
// 假设我们有一个Map, String> excelData存储了从Excel读取的数据 Map, String> excelData = ...; for (Map.Entry, String> entry : excelData.entrySet()) { String key = entry.getKey(); String value = entry...
java读写Excel,POI.JAR,Word内容读取
本篇文章将深入探讨如何利用POI技术在Java中实现Excel的上传、导出以及将数据保存至数据库。 首先,我们需要了解Apache POI的基本用法。POI提供了HSSF(用于.xls文件)和XSSF(用于.xlsx文件)API,它们允许我们...
Apache POI是一个流行的库,它允许开发者使用Java来读取、写入和修改Microsoft Office格式的文件,包括Excel(.xlsx, .xls)。在本项目中,我们结合了POI库和XML技术来实现Excel数据的验证与导入数据库。 首先,...
在“java poi excel上传下载”这个场景中,我们可以讨论以下几个关键知识点: 1. **Java POI API**:POI 提供了一套完整的API,允许开发者创建、修改和显示Excel工作簿、工作表、单元格等。主要类包括`HSSFWorkbook...
在Java编程中,处理Excel文件是一项常见的任务,特别是在数据导入导出、数据分析或者报表生成等场景。本篇文章将深入探讨如何使用Java...通过熟练掌握这些技术,你可以高效地在Java应用中实现Excel的上传和读取功能。
JAVA POI Excel转Html,代码和所需的jar都在压缩包,项目在线预览需求,实现后分享下
在这个场景中,我们将详细探讨如何使用Java POI读取Excel文件中的数据,包括获取总行数、列数、单元格内容、合并单元格、行高、列宽以及图片等信息。 首先,确保在项目中已经引入了Apache POI的依赖库。如果你使用...
Java POI项目由Apache软件基金会维护,支持读取和写入Microsoft Office的多种文件格式,如XLS(Excel 97-2003)、XLSX(Excel 2007以上版本)以及Word、PowerPoint等。对于Excel,POI提供了一个高级用户模型(HSSF)...
JAVA POI 4.0 是一个强大的库,用于在Java应用程序中处理Microsoft Office格式的文件,特别是Excel。这个库允许开发者以编程方式创建、修改和读取Excel文档,极大地拓展了Java在电子表格处理上的能力。POI 4.0是该库...
在Java开发中,当你需要处理Excel数据时,POI库是一个强大的工具。本压缩包包含了一些关键资源,帮助你理解和使用Java POI处理Excel数据。 首先,`问题.docx`可能是你在使用POI过程中遇到的问题汇总,它可能包含了...
模板中的单元格、公式、样式、图表等元素都以XML的形式存在,Java POI通过解析这些XML来操作Excel内容。 在使用Java POI处理模板时,我们需要做以下步骤: 1. **读取模板**:使用`XSSFWorkbook`类打开模板文件,它...
有时候,我们需要在 Java 程序中读取 Excel 文件的内容,例如将 Excel 表格中的数据导入到数据库中或者进行数据分析。这时候,我们可以使用 Apache 的 POI 工具包来读取 Excel 文件。 POI(Poor Obfuscation ...
在Java世界中,如果你想对Excel进行读写操作,POI库是不可或缺的工具。下面将详细介绍如何使用Java POI来操作Excel以及相关的知识点。 1. **基本概念** - HSSF(Horrible Spreadsheet Format):这是POI库处理...
4. **写入数据**:从Excel读取的数据可以写入到Word的段落或运行中。你可以根据需要格式化文本,如设置字体、大小、颜色等。 ```java run.setFontFamily("Arial"); run.setFontSize(12); run.setColor("000000")...
在Java环境中,Apache POI库是处理Excel数据的首选工具,它提供了丰富的API来读取、写入和操作Excel文件。在这个“poi-3.9”包中,你将获得Apache POI 3.9版本的所有组件,这个版本发布于2012年,虽然相对较旧,但...
Java 使用 Apache POI 读取 Excel 是一个常见的任务,在处理数据导入、导出或数据分析时非常有用。Apache POI 是一个流行的开源库,它允许 Java 开发者创建、修改和显示 Microsoft Office 格式的文件,其中包括 ...