java代码将excel文件中的内容列表转换成JS文件输出

思路分析

我们想要把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.0</modelVersion>
 4   <groupId>com.cetc.excelToJS</groupId>
 5   <artifactId>cetc_excelToJS</artifactId>
 6   <version>0.0.1-SNAPSHOT</version>
 7   <packaging>jar</packaging>
 8   
 9   <name>cetc_excelToJS</name>
10   <url>http://maven.apache.org</url>
11   
12   
13   <parent>
14         <groupId>org.springframework.boot</groupId>
15         <artifactId>spring-boot-starter-parent</artifactId>
16         <version>1.5.9.RELEASE</version>
17     </parent>
18 
19   <properties>
20     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
21     <java.version>1.8</java.version>
22   </properties>
23 
24   <dependencies>
25            <dependency>
26             <groupId>org.springframework.boot</groupId>
27             <artifactId>spring-boot-starter-web</artifactId>
28         </dependency>
29         <dependency>
30             <groupId>org.springframework.boot</groupId>
31             <artifactId>spring-boot-starter-tomcat</artifactId>
32 <!--             <scope>provided</scope> -->
33         </dependency>
34         <!-- 用于监控spring boot 端点 -->
35         <dependency>
36             <groupId>org.springframework.boot</groupId>
37             <artifactId>spring-boot-starter-actuator</artifactId>
38         </dependency>
39         <dependency>
40             <groupId>org.springframework.boot</groupId>
41             <artifactId>spring-boot-devtools</artifactId>
42             <optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
43         </dependency>
44         
45         <!-- 引入poi,解析workbook视图 -->
46        <dependency>
47            <groupId>org.apache.poi</groupId>
48            <artifactId>poi</artifactId>
49            <version>3.16</version>
50        </dependency>
51        <dependency>
52            <groupId>org.apache.poi</groupId>
53            <artifactId>poi-ooxml</artifactId>
54            <version>3.14</version>
55        </dependency>
56        <!-- 处理excel和上面功能是一样的-->
57        <dependency>
58            <groupId>net.sourceforge.jexcelapi</groupId>
59            <artifactId>jxl</artifactId>
60            <version>2.6.10</version>
61        </dependency>
62         
63   </dependencies>
64   
65 <!--   添加spring-boot 的maven插件 -->
66     <build>
67         <plugins>
68             <plugin>
69                 <groupId>org.springframework.boot</groupId>
70                 <artifactId>spring-boot-maven-plugin</artifactId>
71             </plugin>
72         </plugins>
73     </build>
74   
75   
76 </project>

如果你用ssm写的话,在pom.xml文件中添加

 1  <!-- 引入poi,解析workbook视图 -->
 2        <dependency>
 3            <groupId>org.apache.poi</groupId>
 4            <artifactId>poi</artifactId>
 5            <version>3.16</version>
 6        </dependency>
 7        <dependency>
 8            <groupId>org.apache.poi</groupId>
 9            <artifactId>poi-ooxml</artifactId>
10            <version>3.14</version>
11        </dependency>
12        <!-- 处理excel和上面功能是一样的-->
13        <dependency>
14            <groupId>net.sourceforge.jexcelapi</groupId>
15            <artifactId>jxl</artifactId>
16            <version>2.6.10</version>
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 List<List> getContent(String path) {
35        ReadExcel obj = new ReadExcel();
36        File file = new File(path);
37        List<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<List> outerList=new ArrayList<List>();
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)   返回类型<List<List>>

  很明显,Controller来调用我,给我一个excel文件的路径,我返回给你文件中的内容,以List<List>的形式。外面这个list是一行一个对象(也就是小list),里面这个list就是一行内容有多个字段,每个字段就是一个对象。

2.readExcel(File file) 返回类型<List<List>>

  这是getContent 方法调用的,返回<List<List>>给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(List<List> excelList) throws IOException {
19         List<TargetInformation> resultList= new ArrayList<TargetInformation>();
20         for(int i = 1;i<excelList.size();i++) {
21             List<String> contentList = (List<String>) excelList.get(i);
22             // --------------------------------------------------------
23             // --------------这里看一下该条记录的内容先-------------------
24             for(int j=0;j<contentList.size();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(List<TargetInformation> resultList)  {
 28         try {
 29         // 创建一个名为expressData 的js文件
 30         this.creatJSFile("expressData");
 31         // 先开个头
 32         this.writeJSFile("var expPointArr = [");
 33         
 34         for(int i=0;i<resultList.size()-1;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 + "
";  
 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                 // 行与行之间的分隔符 相当于“
”  
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         List<List> excelList = readExcel.getContent(path);
36         List<TargetInformation> 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<String,Object> excelMap = new HashMap<>();
53         //1.设置Excel表头
54         List<String> 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<String> list = new ArrayList<>();
70         list.add("鼓楼投递部");
71         list.add("江苏省南京市玄武区韩家巷10-2号");
72         List<List<String>> 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         List<List> excelList = readExcel.getContent(path);
 6         List<TargetInformation> 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         List<List> excelList = readExcel.getContent(file);
 6         List<TargetInformation> 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 List<List> getContent(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<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<List> outerList=new ArrayList<List>();
 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文件的接口和工具类也很实用。但是我想大家一般都是把模板放到项目里,然后提供下载地址即可,不一定需要代码创建啦!

原文地址:https://www.cnblogs.com/fengyuduke/p/10445907.html