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