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 + "\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         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文件的接口和工具類也很實用。但是我想大家一般都是把模板放到項目里,然后提供下載地址即可,不一定需要代碼創建啦!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM