思路分析
我们想要把excel文件中的内容转为其他形式的文件输出,肯定需要分两步走:
1.把excel文件中的内容读出来;
2.将内容写到新的文件中。
举例
一张excel表中有一个表格:
我们需要将表格中的内容写到JS文件中输出:
文件名为expressData.js
地址的经纬度我们就调用百度接口获得。
新建一个springboot工程
因为使用springboot方便,快捷,所以我们就用springboot来演示,如果还没用过springboot的,并且不知道springboot怎么用的也没关系,你只需要注重代码就行,把这些代码放到以SSM为架构的项目中也是一样的。这里的文件,我们一个一个说。
pom.xml
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0modelVersion> 4 <groupId>com.cetc.excelToJSgroupId> 5 <artifactId>cetc_excelToJSartifactId> 6 <version>0.0.1-SNAPSHOTversion> 7 <packaging>jarpackaging> 8 9 <name>cetc_excelToJSname> 10 <url>http://maven.apache.orgurl> 11 12 13 <parent> 14 <groupId>org.springframework.bootgroupId> 15 <artifactId>spring-boot-starter-parentartifactId> 16 <version>1.5.9.RELEASEversion> 17 parent> 18 19 <properties> 20 <project.build.sourceEncoding>UTF-8project.build.sourceEncoding> 21 <java.version>1.8java.version> 22 properties> 23 24 <dependencies> 25 <dependency> 26 <groupId>org.springframework.bootgroupId> 27 <artifactId>spring-boot-starter-webartifactId> 28 dependency> 29 <dependency> 30 <groupId>org.springframework.bootgroupId> 31 <artifactId>spring-boot-starter-tomcatartifactId> 32 33 dependency> 34 35 <dependency> 36 <groupId>org.springframework.bootgroupId> 37 <artifactId>spring-boot-starter-actuatorartifactId> 38 dependency> 39 <dependency> 40 <groupId>org.springframework.bootgroupId> 41 <artifactId>spring-boot-devtoolsartifactId> 42 <optional>trueoptional> 43 dependency> 44 45 46 <dependency> 47 <groupId>org.apache.poigroupId> 48 <artifactId>poiartifactId> 49 <version>3.16version> 50 dependency> 51 <dependency> 52 <groupId>org.apache.poigroupId> 53 <artifactId>poi-ooxmlartifactId> 54 <version>3.14version> 55 dependency> 56 57 <dependency> 58 <groupId>net.sourceforge.jexcelapigroupId> 59 <artifactId>jxlartifactId> 60 <version>2.6.10version> 61 dependency> 62 63 dependencies> 64 65 66 <build> 67 <plugins> 68 <plugin> 69 <groupId>org.springframework.bootgroupId> 70 <artifactId>spring-boot-maven-pluginartifactId> 71 plugin> 72 plugins> 73 build> 74 75 76 project>
如果你用ssm写的话,在pom.xml文件中添加
1 2 <dependency> 3 <groupId>org.apache.poigroupId> 4 <artifactId>poiartifactId> 5 <version>3.16version> 6 dependency> 7 <dependency> 8 <groupId>org.apache.poigroupId> 9 <artifactId>poi-ooxmlartifactId> 10 <version>3.14version> 11 dependency> 12 13 <dependency> 14 <groupId>net.sourceforge.jexcelapigroupId> 15 <artifactId>jxlartifactId> 16 <version>2.6.10version> 17 dependency>
application.yml
这里我们用不到任何配置,所以这个文件我们就放个空的就行了。
Util包
ReadExcel.java
首先,当然是要读到excel中的内容撒。
1 package com.cetc.excelToJS.util; 2 import java.io.File; 3 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.util.ArrayList; 9 import java.util.List; 10 11 import org.springframework.stereotype.Component; 12 13 import jxl.Sheet; 14 import jxl.Workbook; 15 import jxl.read.biff.BiffException; 16 17 @Component 18 public class ReadExcel { 19 public static void main(String[] args) { 20 ReadExcel obj = new ReadExcel(); 21 File file = new File("D:/1234.xls"); 22 List excelList = obj.readExcel(file); 23 System.out.println("list中的数据打印出来"); 24 for (int i = 0; i < excelList.size(); i++) { 25 List list = (List) excelList.get(i); 26 for (int j = 0; j < list.size(); j++) { 27 System.out.print(list.get(j)); 28 } 29 System.out.println(); 30 } 31 32 } 33 34 public ListgetContent(String path) { 35 ReadExcel obj = new ReadExcel(); 36 File file = new File(path); 37 List
excelList = obj.readExcel(file); 38 return excelList; 39 40 } 41 42 // 去读Excel的方法readExcel,该方法的入口参数为一个File对象 43 public List readExcel(File file) { 44 try { 45 // 创建输入流,读取Excel 46 InputStream is = new FileInputStream(file.getAbsolutePath()); 47 // jxl提供的Workbook类 48 Workbook wb = Workbook.getWorkbook(is); 49 // Excel的页签数量 50 int sheet_size = wb.getNumberOfSheets(); 51 for (int index = 0; index < sheet_size; index++) { 52 List
outerList=new ArrayList
(); 53 // 每个页签创建一个Sheet对象 54 Sheet sheet = wb.getSheet(index); 55 // sheet.getRows()返回该页的总行数 56 for (int i = 0; i < sheet.getRows(); i++) { 57 List innerList=new ArrayList(); 58 // sheet.getColumns()返回该页的总列数 59 for (int j = 0; j < sheet.getColumns(); j++) { 60 String cellinfo = sheet.getCell(j, i).getContents(); 61 if(cellinfo.isEmpty()){ 62 continue; 63 } 64 innerList.add(cellinfo); 65 System.out.print(cellinfo); 66 } 67 outerList.add(i, innerList); 68 System.out.println(); 69 } 70 return outerList; 71 } 72 } catch (FileNotFoundException e) { 73 e.printStackTrace(); 74 } catch (BiffException e) { 75 e.printStackTrace(); 76 } catch (IOException e) { 77 e.printStackTrace(); 78 } 79 return null; 80 } 81 }
两个方法:
1.getContent(String path) 返回类型>
很明显,Controller来调用我,给我一个excel文件的路径,我返回给你文件中的内容,以List的形式。外面这个list是一行一个对象(也就是小list),里面这个list就是一行内容有多个字段,每个字段就是一个对象。
2.readExcel(File file) 返回类型>
这是getContent 方法调用的,返回>给getContent,就是所有事情都替它干了。注释也很清楚,不用多说了。
TargetInformation.java
这是一个实体类,我们读出了excel文件中的内容,根据需求,我们还要根据地址,查出经纬度,对不对。那我们是不是还要给每个小list对象中加两个值,lng和lat。你可以这样干,但是我是喜欢用对象来处理的,可能有点多余,但你可以不这么干。
1 package com.cetc.excelToJS.pojo; 2 3 public class TargetInformation { 4 private String lng; 5 private String lat; 6 private String name; 7 private String address; 8 9 public TargetInformation(String lng,String lat,String name,String address) { 10 this.lng = lng; 11 this.lat = lat; 12 this.name = name; 13 this.address = address; 14 } 15 16 public String getLng() { 17 return lng; 18 } 19 public void setLng(String lng) { 20 this.lng = lng; 21 } 22 public String getLat() { 23 return lat; 24 } 25 public void setLat(String lat) { 26 this.lat = lat; 27 } 28 public String getName() { 29 return name; 30 } 31 public void setName(String name) { 32 this.name = name; 33 } 34 public String getAddress() { 35 return address; 36 } 37 public void setAddress(String address) { 38 this.address = address; 39 } 40 41 42 }
GetLatAndLngByBaidu.java
百度根据地址查询经纬度的方法类,不用说了。有个注意点就是,你传的地址一定要是准确的,存在的。比如:你输入的地址在百度地图上都找不到,或者输入地址点击查询,地图上出来好多个标记,那接口哪知道是哪一个啊?所以,这两种情况是一定会报错的。
1 package com.cetc.excelToJS.util; 2 import java.io.BufferedReader; 3 import java.io.IOException; 4 import java.io.InputStreamReader; 5 import java.io.UnsupportedEncodingException; 6 import java.net.MalformedURLException; 7 import java.net.URL; 8 import java.net.URLConnection; 9 10 import org.springframework.stereotype.Component; 11 12 /** 13 * 获取经纬度 14 * 15 * @author Sunny 16 * 密钥:lAGGc3PbOv0KeGTWcp6xOtDbkt6Kuld5 17 */ 18 @Component 19 public class GetLatAndLngByBaidu { 20 /** 21 * @param addr 22 * 查询的地址 23 * @return 24 * @throws IOException 25 */ 26 public Object[] getCoordinate(String addr) throws IOException { 27 String lng = null;//经度 28 String lat = null;//纬度 29 String address = null; 30 try { 31 address = java.net.URLEncoder.encode(addr, "UTF-8"); 32 }catch (UnsupportedEncodingException e1) { 33 e1.printStackTrace(); 34 } 35 // String key = "f247cdb592eb43ebac6ccd27f796e2d2"; 36 String key = "lAGGc3PbOv0KeGTWcp6xOtDbkt6Kuld5"; 37 String url = String .format("http://api.map.baidu.com/geocoder?address=%s&output=json&key=%s", address, key); 38 URL myURL = null; 39 URLConnection httpsConn = null; 40 try { 41 myURL = new URL(url); 42 } catch (MalformedURLException e) { 43 e.printStackTrace(); 44 } 45 InputStreamReader insr = null; 46 BufferedReader br = null; 47 try { 48 httpsConn = (URLConnection) myURL.openConnection();// 不使用代理 49 if (httpsConn != null) { 50 insr = new InputStreamReader( httpsConn.getInputStream(), "UTF-8"); 51 br = new BufferedReader(insr); 52 String data = null; 53 int count = 1; 54 while((data= br.readLine())!=null){ 55 if(count==5){ 56 lng = (String)data.subSequence(data.indexOf(":")+1, data.indexOf(","));//经度 57 count++; 58 }else if(count==6){ 59 lat = data.substring(data.indexOf(":")+1);//纬度 60 count++; 61 }else{ 62 count++; 63 } 64 } 65 } 66 } catch (IOException e) { 67 e.printStackTrace(); 68 } finally { 69 if(insr!=null){ 70 insr.close(); 71 } 72 if(br!=null){ 73 br.close(); 74 } 75 } 76 return new Object[]{lng,lat}; 77 } 78 79 80 public static void main(String[] args) throws IOException { 81 GetLatAndLngByBaidu getLatAndLngByBaidu = new GetLatAndLngByBaidu(); 82 Object[] o = getLatAndLngByBaidu.getCoordinate("无锡市新吴区旺庄路156号宝龙城市广场f2"); 83 System.out.println(o[0]);//经度 84 System.out.println(o[1]);//纬度 85 } 86 }
TargetContent.java
好了,我们现在地址有了,接口也有了。那就查吧,并且查出来封装成对象,把这些对象放到一个新的list中。以备将来所用!
1 package com.cetc.excelToJS.util; 2 3 import java.io.IOException; 4 import java.util.ArrayList; 5 import java.util.List; 6 7 import javax.annotation.Resource; 8 9 import org.springframework.stereotype.Component; 10 11 import com.cetc.excelToJS.pojo.TargetInformation; 12 13 @Component 14 public class TargetContent { 15 @Resource 16 private GetLatAndLngByBaidu getLatAndLngByBaidu; 17 18 public List getTargerList(ListexcelList) throws IOException { 19 List
resultList= new ArrayList (); 20 for(int i = 1;i ) { 21 List contentList = (List ) excelList.get(i); 22 // -------------------------------------------------------- 23 // --------------这里看一下该条记录的内容先------------------- 24 for(int j=0;j ) { 25 System.out.println(contentList.get(j)); 26 } 27 // -------------------------------------------------------- 28 // 找出该条记录的地址,调用百度接口,获得经纬度 29 Object[] ouject = getLatAndLngByBaidu.getCoordinate(contentList.get(1)); 30 // 将经纬度封装到对象中存入resultList中 31 TargetInformation targetInformation = new TargetInformation(ouject[0].toString(), 32 ouject[1].toString(), 33 contentList.get(0), 34 contentList.get(1)); 35 resultList.add(targetInformation); 36 37 } 38 return resultList; 39 } 40 }
WriteJS.java
获得需要写入的对象集合,那我们就写JS文件呗。
1 package com.cetc.excelToJS.util; 2 3 4 import java.io.BufferedReader; 5 import java.io.File; 6 import java.io.FileInputStream; 7 import java.io.FileOutputStream; 8 import java.io.IOException; 9 import java.io.InputStreamReader; 10 import java.io.PrintWriter; 11 import java.util.List; 12 13 import org.springframework.stereotype.Component; 14 15 import com.cetc.excelToJS.pojo.TargetInformation; 16 @Component 17 public class WriteJS { 18 // 这里是创建的路径 19 private static String path = "D:/"; 20 private static String filenameTemp; 21 22 // public static void main(String[] args) throws IOException { 23 // WriteJS.creatJSFile("你好"); 24 // WriteJS.writeJSFile("你好"); 25 // WriteJS.writeJSFile(" 罗大爷1"); 26 // } 27 public String doWrite(ListresultList) { 28 try { 29 // 创建一个名为expressData 的js文件 30 this.creatJSFile("expressData"); 31 // 先开个头 32 this.writeJSFile("var expPointArr = ["); 33 34 for(int i=0;i ) { 35 TargetInformation targetInformation = resultList.get(i); 36 // {"lng":118.752696,"lat":32.22832,"name":"盘城揽投部","address":"新华路121号"}, 37 String information = "{\"lng\":"+targetInformation.getLng() 38 +",\"lat\":"+targetInformation.getLat() 39 +",\"name\":\""+targetInformation.getName() 40 +"\",\"address\":\""+targetInformation.getAddress() 41 +"\"},"; 42 this.writeJSFile(" "+information); 43 } 44 // 这里添加最后一条,因为最后一一条后面没逗号 45 TargetInformation targetInformation_last = resultList.get(resultList.size()-1); 46 String information_last = "{\"lng\":"+targetInformation_last.getLng() 47 +",\"lat\":"+targetInformation_last.getLat() 48 +",\"name\":\""+targetInformation_last.getName() 49 +"\",\"address\":\""+targetInformation_last.getAddress() 50 +"\"}"; 51 this.writeJSFile(" "+information_last); 52 // 这里结束 53 this.writeJSFile("];"); 54 55 return "success"; 56 }catch (Exception e) { 57 return "failure"; 58 } 59 } 60 61 62 /** 63 * 创建文件 64 * 65 * @throws IOException 66 */ 67 public boolean creatJSFile(String name) throws IOException { 68 boolean flag = false; 69 filenameTemp = path + name + ".js"; 70 File filename = new File(filenameTemp); 71 if (!filename.exists()) { 72 filename.createNewFile(); 73 flag = true; 74 } 75 return flag; 76 } 77 78 79 /** 80 * 写文件 81 * 82 * @param newStr 83 * 新内容 84 * @throws IOException 85 */ 86 public boolean writeJSFile(String newStr) throws IOException { 87 // 先读取原有文件内容,然后进行写入操作 88 boolean flag = false; 89 String filein = newStr + "\r\n"; 90 String temp = ""; 91 92 FileInputStream fis = null; 93 InputStreamReader isr = null; 94 BufferedReader br = null; 95 96 FileOutputStream fos = null; 97 PrintWriter pw = null; 98 try { 99 // 文件路径 100 File file = new File(filenameTemp); 101 // 将文件读入输入流 102 fis = new FileInputStream(file); 103 isr = new InputStreamReader(fis); 104 br = new BufferedReader(isr); 105 StringBuffer buf = new StringBuffer(); 106 107 // 保存该文件原有的内容 108 for (int j = 1; (temp = br.readLine()) != null; j++) { 109 buf = buf.append(temp); 110 // System.getProperty("line.separator") 111 // 行与行之间的分隔符 相当于“\n” 112 buf = buf.append(System.getProperty("line.separator")); 113 } 114 buf.append(filein); 115 116 fos = new FileOutputStream(file); 117 pw = new PrintWriter(fos); 118 pw.write(buf.toString().toCharArray()); 119 pw.flush(); 120 flag = true; 121 } catch (IOException e1) { 122 // TODO 自动生成 catch 块 123 throw e1; 124 } finally { 125 if (pw != null) { 126 pw.close(); 127 } 128 if (fos != null) { 129 fos.close(); 130 } 131 if (br != null) { 132 br.close(); 133 } 134 if (isr != null) { 135 isr.close(); 136 } 137 if (fis != null) { 138 fis.close(); 139 } 140 } 141 return flag; 142 } 143 144 }
代码很好明白。有两个静态属性说一下:
private static String path = "D:/";
private static String filenameTemp;
第一个:path是即将要生成的JS文件要放的位置。你可以改。
第二个:filenameTemp 是JS的文件名,我是让Controller传的。
createExcel.java
这是一个创建excel的工具类,这里可以忽略。有兴趣的下代码去。
IndexController.java
1 package com.cetc.excelToJS.controller; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 import java.util.Map; 7 8 import javax.annotation.Resource; 9 import javax.servlet.http.HttpServletResponse; 10 11 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 12 import org.springframework.web.bind.annotation.GetMapping; 13 import org.springframework.web.bind.annotation.RestController; 14 15 import com.cetc.excelToJS.pojo.TargetInformation; 16 import com.cetc.excelToJS.util.HandleFile; 17 import com.cetc.excelToJS.util.ReadExcel; 18 import com.cetc.excelToJS.util.TargetContent; 19 import com.cetc.excelToJS.util.WriteJS; 20 21 @RestController 22 public class IndexController { 23 24 @Resource 25 private ReadExcel readExcel; 26 @Resource 27 private WriteJS writeJS; 28 @Resource 29 private TargetContent targetContent; 30 31 @GetMapping("/transfor") 32 public String transfor() { 33 try { 34 String path = "D:/expressData.xls"; 35 ListexcelList = readExcel.getContent(path); 36 List
resultList = targetContent.getTargerList(excelList); 37 String message = writeJS.doWrite(resultList); 38 return message; 39 }catch (Exception e) { 40 return "操作失败"; 41 } 42 } 43 44 /** 45 * excel生成下载 46 * @param response 47 * @return 48 * @throws Exception 49 */ 50 @GetMapping(value = "/createExcel") 51 public String createExcel(HttpServletResponse response) throws Exception{ 52 Map excelMap = new HashMap<>(); 53 //1.设置Excel表头 54 List headerList = new ArrayList<>(); 55 headerList.add("name"); 56 headerList.add("address"); 57 excelMap.put("header",headerList); 58 59 //2.是否需要生成序号,序号从1开始(true-生成序号 false-不生成序) 60 boolean isSerial = false; 61 excelMap.put("isSerial",isSerial); 62 63 //3.sheet名 64 String sheetName = "统计表"; 65 excelMap.put("sheetName",sheetName); 66 67 68 //4.需要放入Excel中的数据 69 List list = new ArrayList<>(); 70 list.add("鼓楼投递部"); 71 list.add("江苏省南京市玄武区韩家巷10-2号"); 72 List > data= new ArrayList<>(); 73 data.add(list); 74 75 excelMap.put("data",data); 76 77 //Excel文件内容设置 78 HSSFWorkbook workbook = HandleFile.createExcel(excelMap); 79 80 String fileName = "expressData.xls"; 81 82 //生成excel文件 83 HandleFile.buildExcelFile(fileName, workbook); 84 85 //浏览器下载excel 86 HandleFile.buildExcelDocument(fileName,workbook,response); 87 88 return "down excel"; 89 90 } 91 92 }
这个大家不一定一样,只是作为启动这个excel转JS文件功能的...引擎吧。
只要看这个接口就行:
1 @GetMapping("/transfor") 2 public String transfor() { 3 try { 4 String path = "D:/expressData.xls"; 5 ListexcelList = readExcel.getContent(path); 6 List
resultList = targetContent.getTargerList(excelList); 7 String message = writeJS.doWrite(resultList); 8 return message; 9 }catch (Exception e) { 10 return "操作失败"; 11 } 12 }
它是去读D盘根目录下的expressData.xls文件的。然后生成对象list,然后写JS文件,执行完了你会发现D盘多了一个文件
里面的内容嘛,我就不贴了,在上面。
代码下载地址:https://gitee.com/fengyuduke/my_open_resources/blob/master/cetc_excelToJS.zip
到这里本来想结束,但是这里有个问题,大家注意到没?
我是到固定目录下面去找excel文件的,要是用起来肯定多有不便。更多时候我们都是前端上传文件的,然后后台代码来解析读取我们上传的这个文件。那这个时候怎么做?
我们从上到下来修改:
第一步:修改Controller中的接口方法
1 @RequestMapping(value="transfor") 2 public String transfor(@RequestParam(required = true) MultipartFile file) { 3 try { 4 // String path = "D:/expressData.xls"; 5 ListexcelList = readExcel.getContent(file); 6 List
resultList = targetContent.getTargerList(excelList); 7 String message = writeJS.doWrite(resultList); 8 return message ; 9 }catch (Exception e) { 10 return "操作失败"; 11 } 12 }
我们接收前端传来的文件,然后把文件传给工具类。
第二步:修改ReadExcel.java
1 package com.project.ndmp.excelToJS; 2 import java.io.FileNotFoundException; 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.util.ArrayList; 6 import java.util.List; 7 8 import org.apache.commons.fileupload.disk.DiskFileItem; 9 import org.springframework.stereotype.Component; 10 import org.springframework.web.multipart.MultipartFile; 11 import org.springframework.web.multipart.commons.CommonsMultipartFile; 12 13 import jxl.Sheet; 14 import jxl.Workbook; 15 import jxl.read.biff.BiffException; 16 17 @Component 18 public class ReadExcel { 19 public static void main(String[] args) { 20 // ReadExcel obj = new ReadExcel(); 21 // // 此处为我创建Excel路径:E:/zhanhj/studysrc/jxl下 22 // File file = new File("D:/1234.xls"); 23 // List excelList = obj.readExcel(file); 24 // System.out.println("list中的数据打印出来"); 25 // for (int i = 0; i < excelList.size(); i++) { 26 // List list = (List) excelList.get(i); 27 // for (int j = 0; j < list.size(); j++) { 28 // System.out.print(list.get(j)); 29 // } 30 // System.out.println(); 31 // } 32 33 } 34 35 public ListgetContent(MultipartFile mFile) { 36 ReadExcel obj = new ReadExcel(); 37 // CommonsMultipartFile cFile = (CommonsMultipartFile) mFile; 38 // DiskFileItem fileItem = (DiskFileItem) cFile.getFileItem(); 39 // InputStream inputStream = fileItem.getInputStream(); 40 // File file = new File(path); 41 List
excelList = obj.readExcel(mFile); 42 return excelList; 43 44 } 45 /** 46 * 47 * @param mFile MultipartFile 48 * @return 49 */ 50 public List readExcel(MultipartFile mFile) { 51 try { 52 // ------------------------------------------------------------------- 53 /* 54 * 从springmvc获取到的文件是MultipartFile类型的,有的时候不能直接用从这种类型获取 55 * 到的inputstream操作一些事情,比如从中初始化poi的Workbook,这时候要怎么获取到File 56 * 式的流呢? 57 有一个方法就是把读到的MultipartFile转存到本地,然后再从本地读取这个转存的这个临 58 时文件,从中获取文件流。这么写的话可以达到目的但是听起来就很繁琐对不对。 59 60 下面这三步,就是通过转换的形式将MultipartFile类型的文件放到输入流里面 61 */ 62 CommonsMultipartFile cFile = (CommonsMultipartFile) mFile; 63 DiskFileItem fileItem = (DiskFileItem) cFile.getFileItem(); 64 InputStream is = fileItem.getInputStream(); 65 // -------------------------------------------------------------------- 66 /* 67 * 创建输入流,读取Excel 68 * 下面这一步不用了,这是文件在本地的情况,根据文件的绝对路径来将文件写到输入流中 69 */ 70 // InputStream is = new FileInputStream(file.getAbsolutePath()); 71 // jxl提供的Workbook类 72 Workbook wb = Workbook.getWorkbook(is); 73 // Excel的页签数量 74 int sheet_size = wb.getNumberOfSheets(); 75 for (int index = 0; index < sheet_size; index++) { 76 List
outerList=new ArrayList
(); 77 // 每个页签创建一个Sheet对象 78 Sheet sheet = wb.getSheet(index); 79 // sheet.getRows()返回该页的总行数 80 for (int i = 0; i < sheet.getRows(); i++) { 81 List innerList=new ArrayList(); 82 // sheet.getColumns()返回该页的总列数 83 for (int j = 0; j < sheet.getColumns(); j++) { 84 String cellinfo = sheet.getCell(j, i).getContents(); 85 if(cellinfo.isEmpty()){ 86 continue; 87 } 88 innerList.add(cellinfo); 89 System.out.print(cellinfo); 90 } 91 outerList.add(i, innerList); 92 System.out.println(); 93 } 94 return outerList; 95 } 96 } catch (FileNotFoundException e) { 97 e.printStackTrace(); 98 } catch (BiffException e) { 99 e.printStackTrace(); 100 } catch (IOException e) { 101 e.printStackTrace(); 102 } 103 return null; 104 } 105 }
这里最为关键的就是这三行代码
CommonsMultipartFile cFile = (CommonsMultipartFile) mFile; DiskFileItem fileItem = (DiskFileItem) cFile.getFileItem(); InputStream is = fileItem.getInputStream();
这三行代码解决了怎么将MultipartFile类型的文件放到输入流里。这样我们后面的操作都不用变了。
最后
代码中没说的创建excel文件的接口和工具类也很实用。但是我想大家一般都是把模板放到项目里,然后提供下载地址即可,不一定需要代码创建啦!