基于SSM框架实现EXCEL文件的上传下载

时间:2022-01-12 23:06:44

注意的导包:poi的几个包,dom4j,xmlbeans这个包(因为这个包没导入QB调试了6个多小时才找到错误,感觉亏了一个亿)

SpringMvc配置增加:

<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- set the max upload size100MB -->
		<property name="maxUploadSize">
			<value>104857600</value>
		</property>
		<property name="maxInMemorySize">
			<value>4096</value>
		</property>
		<property name="defaultEncoding">
			<value>utf-8</value>
		</property>
	</bean>



工具类:

创建一个ExcelBean实现数据的封装

ExcelBean.java

[java]  view plain  copy
  1. package cn.gsp.common.utils.excel;  
  2.   
  3. import org.apache.poi.xssf.usermodel.XSSFCellStyle;  
  4.   
  5. /** 
  6.  * @Description: 创建一个ExcelBean实现数据的封装 
  7.  * @author QB 
  8.  * @date 2017年10月17日 上午9:19:00 
  9.  */  
  10. public class ExcelBean implements java.io.Serializable {  
  11.     /** 
  12.      * @Fields serialVersionUID : TODO(用一句话描述这个变量表示什么) 
  13.      */  
  14.     private static final long serialVersionUID = 1L;  
  15.     private String headTextName;// 列头(标题)名  
  16.     private String propertyName;// 对应字段名  
  17.     private Integer cols;// 合并单元格数  
  18.     private XSSFCellStyle cellStyle;  
  19.   
  20.     public ExcelBean() {  
  21.   
  22.     }  
  23.   
  24.     public ExcelBean(String headTextName, String propertyName) {  
  25.         this.headTextName = headTextName;  
  26.         this.propertyName = propertyName;  
  27.     }  
  28.   
  29.     public ExcelBean(String headTextName, String propertyName, Integer cols) {  
  30.         super();  
  31.         this.headTextName = headTextName;  
  32.         this.propertyName = propertyName;  
  33.         this.cols = cols;  
  34.     }  
  35.   
  36.     public String getHeadTextName() {  
  37.         return headTextName;  
  38.     }  
  39.   
  40.     public void setHeadTextName(String headTextName) {  
  41.         this.headTextName = headTextName;  
  42.     }  
  43.   
  44.     public String getPropertyName() {  
  45.         return propertyName;  
  46.     }  
  47.   
  48.     public void setPropertyName(String propertyName) {  
  49.         this.propertyName = propertyName;  
  50.     }  
  51.   
  52.     public Integer getCols() {  
  53.         return cols;  
  54.     }  
  55.   
  56.     public void setCols(Integer cols) {  
  57.         this.cols = cols;  
  58.     }  
  59.   
  60.     public XSSFCellStyle getCellStyle() {  
  61.         return cellStyle;  
  62.     }  
  63.   
  64.     public void setCellStyle(XSSFCellStyle cellStyle) {  
  65.         this.cellStyle = cellStyle;  
  66.     }  
  67.   
  68. }  

excel的导入工具类(这里QB只采用了原博主的导入工具类,同时也进行了一些符合自己现状的修改)

ExcelUtil.java

[java]  view plain  copy
  1. package cn.gsp.common.utils.excel;  
  2.   
  3. import java.beans.IntrospectionException;  
  4. import java.beans.PropertyDescriptor;  
  5. import java.io.InputStream;  
  6. import java.lang.reflect.InvocationTargetException;  
  7. import java.lang.reflect.Method;  
  8. import java.text.DecimalFormat;  
  9. import java.text.SimpleDateFormat;  
  10. import java.util.ArrayList;  
  11. import java.util.List;  
  12. import java.util.Map;  
  13.   
  14. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  15. import org.apache.poi.ss.usermodel.Cell;  
  16. import org.apache.poi.ss.usermodel.Row;  
  17. import org.apache.poi.ss.usermodel.Sheet;  
  18. import org.apache.poi.ss.usermodel.Workbook;  
  19. import org.apache.poi.ss.util.CellRangeAddress;  
  20. import org.apache.poi.xssf.usermodel.XSSFCell;  
  21. import org.apache.poi.xssf.usermodel.XSSFCellStyle;  
  22. import org.apache.poi.xssf.usermodel.XSSFFont;  
  23. import org.apache.poi.xssf.usermodel.XSSFRow;  
  24. import org.apache.poi.xssf.usermodel.XSSFSheet;  
  25. import org.apache.poi.xssf.usermodel.XSSFWorkbook;  
  26.   
  27. import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;  
  28.   
  29. public class ExcelUtil {  
  30.     private final static String excel2003L = ".xls"// 2003- 版本的excel  
  31.     private final static String excel2007U = ".xlsx"// 2007+ 版本的excel  
  32.   
  33.     /** 
  34.      * Excel导入 
  35.      */  
  36.     public static List<List<Object>> getBankListByExcel(InputStream in, String fileName) throws Exception {  
  37.         List<List<Object>> list = null;  
  38.         // 创建Excel工作薄  
  39.         Workbook work = getWorkbook(in,fileName);  
  40.         if ( null==work) {  
  41.             throw new Exception("创建Excel工作薄为空!");  
  42.         }  
  43.         Sheet sheet = null;  
  44.         Row row = null;  
  45.         Cell cell = null;  
  46.         list = new ArrayList<List<Object>>();  
  47.         // 遍历Excel中所有的sheet  
  48.         for (int i = 0; i < work.getNumberOfSheets(); i++) {  
  49.             sheet = work.getSheetAt(i);  
  50.             if (sheet == null) {  
  51.                 continue;  
  52.             }  
  53.             // 遍历当前sheet中的所有行  
  54.             // 包涵头部,所以要小于等于最后一列数,这里也可以在初始值加上头部行数,以便跳过头部  
  55.             for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) {  
  56.                 // 读取一行  
  57.                 row = sheet.getRow(j);  
  58.                 // 去掉空行和表头  
  59.                 if (row == null || row.getFirstCellNum() == j) {  
  60.                     continue;  
  61.                 }  
  62.                 // 遍历所有的列  
  63.                 List<Object> li = new ArrayList<Object>();  
  64.                 for (int y = 0; y <3; y++) {     //由于个人原因被明确规定了导入数据只有三列,  
  65.                     cell = row.getCell(y);  //且 考虑到导入的excel单元格内可以不写东西得情况  
  66.                     if(cell==null)      //所以直接用 明确的数值来确定遍历的次数  
  67.                     {li.add(null);}     //这里添加了单元格中空白的判断,如果空白默认赋值为null,避免后面mybatis里面出现错误  
  68.                     else  
  69.                     li.add(getCellValue(cell));  
  70.                 }  
  71.                 list.add(li);  
  72.             }  
  73.         }  
  74.         return list;  
  75.     }  
  76.   
  77.     /** 
  78.      * 描述:根据文件后缀,自适应上传文件的版本 
  79.      */  
  80.     public static Workbook getWorkbook(InputStream inStr, String fileName) throws Exception {  
  81.         Workbook wb = null;  
  82.         String fileType = fileName.substring(fileName.lastIndexOf("."));  
  83.         if (excel2003L.equals(fileType)) {  
  84.             wb = new HSSFWorkbook(inStr); // 2003-  
  85.         } else if (excel2007U.equals(fileType)) {  
  86.             wb = new XSSFWorkbook(inStr); // 2007+  
  87.         } else {  
  88.             throw new Exception("解析的文件格式有误!");  
  89.         }  
  90.         return wb;  
  91.     }  
  92.   
  93.     /** 
  94.      * 描述:对表格中数值进行格式化 
  95.      */  
  96.     public static Object getCellValue(Cell cell) {  
  97.         Object value = null;  
  98.         DecimalFormat df = new DecimalFormat("0"); // 格式化字符类型的数字  
  99.         SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd"); // 日期格式化  
  100.         DecimalFormat df2 = new DecimalFormat("0.00"); // 格式化数字  
  101.         switch (cell.getCellType()) {  
  102.         case Cell.CELL_TYPE_STRING:  
  103.             value = cell.getRichStringCellValue().getString();  
  104.             break;  
  105.         case Cell.CELL_TYPE_NUMERIC:  
  106.             if ("General".equals(cell.getCellStyle().getDataFormatString())) {  
  107.                 value = df.format(cell.getNumericCellValue());  
  108.             } else if ("m/d/yy".equals(cell.getCellStyle().getDataFormatString())) {  
  109.                 value = sdf.format(cell.getDateCellValue());  
  110.             } else {  
  111.                 value = df2.format(cell.getNumericCellValue());  
  112.             }  
  113.             break;  
  114.         case Cell.CELL_TYPE_BOOLEAN:  
  115.             value = cell.getBooleanCellValue();  
  116.             break;  
  117.         case Cell.CELL_TYPE_BLANK:  
  118.             value = "";  
  119.             break;  
  120.         default:  
  121.             break;  
  122.         }  
  123.         return value;  
  124.     }  
导出的工具类

ViewExcel.java

[java]  view plain  copy
  1. package cn.gsp.common.utils;  
  2.   
  3. import java.io.OutputStream;  
  4. import java.text.SimpleDateFormat;  
  5. import java.util.Date;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8.   
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11.   
  12. import org.apache.poi.hssf.usermodel.HSSFCell;  
  13. import org.apache.poi.hssf.usermodel.HSSFRow;  
  14. import org.apache.poi.hssf.usermodel.HSSFSheet;  
  15. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  16. import org.springframework.web.servlet.view.document.AbstractExcelView;  
  17.   
  18. public class ViewExcel extends AbstractExcelView {  
  19.   
  20.     private String[] titles;  
  21.   
  22.     // 传入指定的标题头  
  23.     public ViewExcel(String[] titles) {  
  24.         this.titles = titles;  
  25.     }  
  26.   
  27.     @Override  
  28.     protected void buildExcelDocument(Map<String, Object> model, HSSFWorkbook workbook, HttpServletRequest request,  
  29.             HttpServletResponse response) throws Exception {  
  30.         // 获取数据  
  31.         List<Map<String, String>> list = (List<Map<String, String>>) model.get("excelList");  
  32.         // 在workbook添加一个sheet  
  33.         HSSFSheet sheet = workbook.createSheet();  
  34.         sheet.setDefaultColumnWidth(15);  
  35.         HSSFCell cell = null;  
  36.         // 遍历标题  
  37.         for (int i = 0; i < titles.length; i++) {  
  38.             // 获取位置  
  39.             cell = getCell(sheet, 0, i);  
  40.             setText(cell, titles[i]);  
  41.         }  
  42.         // 数据写出  
  43.         for (int i = 0; i < list.size(); i++) {  
  44.             // 获取每一个map  
  45.             Map<String, String> map = list.get(i);  
  46.             // 一个map一行数据  
  47.             HSSFRow row = sheet.createRow(i + 1);  
  48.             for (int j = 0; j < titles.length; j++) {  
  49.                 // 遍历标题,把key与标题匹配  
  50.                 String title = titles[j];  
  51.                 // 判断该内容存在mapzhong  
  52.                 if (map.containsKey(title)) {  
  53.                     row.createCell(j).setCellValue(map.get(title));  
  54.                 }  
  55.             }  
  56.         }  
  57.         // 设置下载时客户端Excel的名称  
  58.         String filename = new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".xls";  
  59.         response.setContentType("application/vnd.ms-excel");  
  60.         response.setHeader("Content-disposition""attachment;filename=" + filename);  
  61.         OutputStream ouputStream = response.getOutputStream();  
  62.         workbook.write(ouputStream);  
  63.         ouputStream.flush();  
  64.         ouputStream.close();  
  65.     }  
  66.   
  67. }  

这里的导入指的是将excel文件上传,导入到数据库中,然后进行相应的规则应用(导入导出只是附带功能,但这里只记录导入导出的部分)

导出指的是将数据从数据库中导出,生成excel文件(目前正在想是否直接导出查询结果会更好?但感觉好麻烦。。。)


导入jsp部分

[java]  view plain  copy
  1. <form method="post" enctype="multipart/form-data"  
  2.                 action="${pageContext.request.contextPath }/seorder/import.action">  
  3.                 <table>  
  4.                     <tr>  
  5.                         <td>上传文件:</td>  
  6.                         <td><input id="upfile" type="file" name="upfile"  
  7.                             class="btn btn-blue"></td>  
  8.                     </tr>  
  9.                     <tr>  
  10.                         <td><input class="btn btn-blue" type="submit" value="提交"  
  11.                             onclick="return checkData()"></td>  
  12.                     </tr>  
  13.                 </table>  
  14.             </form>  

controller部分

[java]  view plain  copy
  1. /** 
  2.      * excel表的导入 
  3.      */  
  4.     @RequestMapping("/import")  
  5.     public String impotr(HttpServletRequest request, Model model) throws Exception {  
  6.   
  7.         // 获取上传的文件  
  8.         MultipartHttpServletRequest multipart = (MultipartHttpServletRequest) request;  
  9.         MultipartFile file = multipart.getFile("upfile");  
  10.         if (file.isEmpty()) {  
  11.             JOptionPane.showMessageDialog(null"上传文件为空!""错误", JOptionPane.ERROR_MESSAGE);  
  12.             return "redirect:/seorder/list.action";  
  13.         } // 对上传文件是否为空做了一个判断,如果excel不存在弹出错误提示框页面重定向,存在导入excel  
  14.   
  15.         InputStream in = file.getInputStream();  
  16.   
  17.         // 数据导入  
  18.         seorderService.importExcelInfo(in, file);  
  19.   
  20.         return "redirect:/seorder/pipei.action";  
  21.     }  
service部分

[java]  view plain  copy
  1. /** 
  2.      * 导入excel 
  3.      */  
  4.     public void importExcelInfo(InputStream in, MultipartFile file) throws Exception {  
  5.         List<List<Object>> listob = ExcelUtil.getBankListByExcel(in, file.getOriginalFilename());  
  6.         List<SeorderK> seorderList = new ArrayList<SeorderK>();  
  7.           
  8.         // 遍历listob数据,把数据放到List中  
  9.         for (int i = 0; i < listob.size(); i++) {  
  10.             List<Object> ob = listob.get(i);  
  11.             SeorderK seorderK = new SeorderK();  
  12.               
  13.             // 通过遍历实现把每一列封装成一个model中,再把所有的model用List集合装载  
  14.   
  15.             seorderK.setFBillNo(String.valueOf(ob.get(0)));  
  16.             seorderK.setFMapNumber(String.valueOf(ob.get(1)));  
  17.             seorderK.setFEntrySelfS0164(String.valueOf(ob.get(2)));  
  18. //          seorderK.setFNumber(String.valueOf(ob.get(3))); 考虑到实际的情况让用户只用导入三个字段中的两个就可以了  
  19. //          seorderK.setFShortNumber(String.valueOf(ob.get(4)));  
  20. //          seorderK.setFName(String.valueOf(ob.get(5)));  
  21.               
  22.             seorderList.add(seorderK);  
  23.               
  24.         }  
  25.         // 批量插入  
  26.         seorderkDao.insertInfoBatch(seorderList);  
  27.     }  

dao部分

[java]  view plain  copy
  1. /** 
  2.      * 导入数据 
  3.      * @param seorderkList 
  4.      */  
  5.     public void insertInfoBatch(List<SeorderK> seorderkList);  

dao的实现类xml

[java]  view plain  copy
  1. <!-- 导入数据 -->  
  2.     <insert id="insertInfoBatch" parameterType="java.util.List">  
  3.         insert into gsp_seorderk_t (FBillNo, FMapNumber,FEntrySelfS0164)  
  4.         values  
  5.             <foreach collection="list" item="item" index="index"  
  6.                 separator="," >  
  7.                 (#{item.FBillNo}, #{item.FMapNumber}, #{item.FEntrySelfS0164})  
  8.             </foreach>  
  9.     </insert>  

导入部分到此为止,接下来是导出的部分

导出jsp部分

[java]  view plain  copy
  1. <form  
  2.                 action="${pageContext.request.contextPath }/seorder/export.action">  
  3.                 <button id="btnExport" type="submit" class="btn btn-blue">导出</button>  
  4.             </form>  

controller部分

[java]  view plain  copy
  1. /** 
  2.      * 导出excel2 
  3.      *  
  4.      * @param map 
  5.      * @return 
  6.      * @throws Exception 
  7.      */  
  8.     @RequestMapping("/export")  
  9.     public ModelAndView export(ModelMap map) throws Exception {  
  10.         List<Map<String, String>> list = seorderService.exportExcelInfo();  
  11.         String[] titles = { "订单编号""客户代码""新编码""GSP长代码""GSP短代码""GSP名称" };  
  12.         ViewExcel excel = new ViewExcel(titles);  
  13.         map.put("excelList", list);  
  14.         return new ModelAndView(excel, map);  
  15.     }  
service部分

[java]  view plain  copy
  1. /** 
  2.      * 导出excel2 
  3.      *  
  4.      * @throws Exception 
  5.      */  
  6.     public List<Map<String, String>> exportExcelInfo() throws Exception {  
  7.         List<SeorderK> list = seorderkDao.pipei(null);  
  8.         List<Map<String, String>> mapList = new ArrayList<Map<String, String>>();  
  9.         for (SeorderK sk : list) {  
  10.             Map<String, String> map = new HashMap<String, String>();  
  11.             map.put("订单编号", sk.getFBillNo());  
  12.             map.put("客户代码", sk.getFMapNumber());  
  13.             map.put("新编码", sk.getFEntrySelfS0164());  
  14.             map.put("GSP长代码", sk.getFNumber());  
  15.             map.put("GSP短代码", sk.getFShortNumber());  
  16.             map.put("GSP名称", sk.getFName());  
  17.             mapList.add(map);  
  18.         }  
  19.         return mapList;  
  20.     }  

dao部分

[java]  view plain  copy
  1. /** 
  2.      * 导出excel 
  3.      * @param seorderkDate 
  4.      * @return 
  5.      */  
  6.     public List<SeorderK> selectApartInfo(String seorderkDate);  
dao对应的实现类xml

依据个人情况来写

相关文章