思路分析

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

点击展开

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. public static void main(String[] args) throws IOException {
  80. GetLatAndLngByBaidu getLatAndLngByBaidu = new GetLatAndLngByBaidu();
  81. Object[] o = getLatAndLngByBaidu.getCoordinate("无锡市新吴区旺庄路156号宝龙城市广场f2");
  82. System.out.println(o[0]);//经度
  83. System.out.println(o[1]);//纬度
  84. }
  85. }

点击展开

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. import java.io.BufferedReader;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.InputStreamReader;
  9. import java.io.PrintWriter;
  10. import java.util.List;
  11.  
  12. import org.springframework.stereotype.Component;
  13.  
  14. import com.cetc.excelToJS.pojo.TargetInformation;
  15. @Component
  16. public class WriteJS {
  17. // 这里是创建的路径
  18. private static String path = "D:/";
  19. private static String filenameTemp;
  20.  
  21. // public static void main(String[] args) throws IOException {
  22. // WriteJS.creatJSFile("你好");
  23. // WriteJS.writeJSFile("你好");
  24. // WriteJS.writeJSFile(" 罗大爷1");
  25. // }
  26. public String doWrite(List<TargetInformation> resultList) {
  27. try {
  28. // 创建一个名为expressData 的js文件
  29. this.creatJSFile("expressData");
  30. // 先开个头
  31. this.writeJSFile("var expPointArr = [");
  32.  
  33. for(int i=0;i<resultList.size()-1;i++) {
  34. TargetInformation targetInformation = resultList.get(i);
  35. // {"lng":118.752696,"lat":32.22832,"name":"盘城揽投部","address":"新华路121号"},
  36. String information = "{\"lng\":"+targetInformation.getLng()
  37. +",\"lat\":"+targetInformation.getLat()
  38. +",\"name\":\""+targetInformation.getName()
  39. +"\",\"address\":\""+targetInformation.getAddress()
  40. +"\"},";
  41. this.writeJSFile(" "+information);
  42. }
  43. // 这里添加最后一条,因为最后一一条后面没逗号
  44. TargetInformation targetInformation_last = resultList.get(resultList.size()-1);
  45. String information_last = "{\"lng\":"+targetInformation_last.getLng()
  46. +",\"lat\":"+targetInformation_last.getLat()
  47. +",\"name\":\""+targetInformation_last.getName()
  48. +"\",\"address\":\""+targetInformation_last.getAddress()
  49. +"\"}";
  50. this.writeJSFile(" "+information_last);
  51. // 这里结束
  52. this.writeJSFile("];");
  53.  
  54. return "success";
  55. }catch (Exception e) {
  56. return "failure";
  57. }
  58. }
  59.  
  60. /**
  61. * 创建文件
  62. *
  63. * @throws IOException
  64. */
  65. public boolean creatJSFile(String name) throws IOException {
  66. boolean flag = false;
  67. filenameTemp = path + name + ".js";
  68. File filename = new File(filenameTemp);
  69. if (!filename.exists()) {
  70. filename.createNewFile();
  71. flag = true;
  72. }
  73. return flag;
  74. }
  75.  
  76. /**
  77. * 写文件
  78. *
  79. * @param newStr
  80. * 新内容
  81. * @throws IOException
  82. */
  83. public boolean writeJSFile(String newStr) throws IOException {
  84. // 先读取原有文件内容,然后进行写入操作
  85. boolean flag = false;
  86. String filein = newStr + "\r\n";
  87. String temp = "";
  88.  
  89. FileInputStream fis = null;
  90. InputStreamReader isr = null;
  91. BufferedReader br = null;
  92.  
  93. FileOutputStream fos = null;
  94. PrintWriter pw = null;
  95. try {
  96. // 文件路径
  97. File file = new File(filenameTemp);
  98. // 将文件读入输入流
  99. fis = new FileInputStream(file);
  100. isr = new InputStreamReader(fis);
  101. br = new BufferedReader(isr);
  102. StringBuffer buf = new StringBuffer();
  103.  
  104. // 保存该文件原有的内容
  105. for (int j = 1; (temp = br.readLine()) != null; j++) {
  106. buf = buf.append(temp);
  107. // System.getProperty("line.separator")
  108. // 行与行之间的分隔符 相当于“\n”
  109. buf = buf.append(System.getProperty("line.separator"));
  110. }
  111. buf.append(filein);
  112.  
  113. fos = new FileOutputStream(file);
  114. pw = new PrintWriter(fos);
  115. pw.write(buf.toString().toCharArray());
  116. pw.flush();
  117. flag = true;
  118. } catch (IOException e1) {
  119. // TODO 自动生成 catch 块
  120. throw e1;
  121. } finally {
  122. if (pw != null) {
  123. pw.close();
  124. }
  125. if (fos != null) {
  126. fos.close();
  127. }
  128. if (br != null) {
  129. br.close();
  130. }
  131. if (isr != null) {
  132. isr.close();
  133. }
  134. if (fis != null) {
  135. fis.close();
  136. }
  137. }
  138. return flag;
  139. }
  140.  
  141. }

点击展开

代码很好明白。有两个静态属性说一下:

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. //4.需要放入Excel中的数据
  68. List<String> list = new ArrayList<>();
  69. list.add("鼓楼投递部");
  70. list.add("江苏省南京市玄武区韩家巷10-2号");
  71. List<List<String>> data= new ArrayList<>();
  72. data.add(list);
  73.  
  74. excelMap.put("data",data);
  75.  
  76. //Excel文件内容设置
  77. HSSFWorkbook workbook = HandleFile.createExcel(excelMap);
  78.  
  79. String fileName = "expressData.xls";
  80.  
  81. //生成excel文件
  82. HandleFile.buildExcelFile(fileName, workbook);
  83.  
  84. //浏览器下载excel
  85. HandleFile.buildExcelDocument(fileName,workbook,response);
  86.  
  87. return "down excel";
  88.  
  89. }
  90.  
  91. }

点击展开

这个大家不一定一样,只是作为启动这个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. }

点击展开

这里最为关键的就是这三行代码

  1. CommonsMultipartFile cFile = (CommonsMultipartFile) mFile;
  2. DiskFileItem fileItem = (DiskFileItem) cFile.getFileItem();
  3. InputStream is = fileItem.getInputStream();

这三行代码解决了怎么将MultipartFile类型的文件放到输入流里。这样我们后面的操作都不用变了。


最后

代码中没说的创建excel文件的接口和工具类也很实用。但是我想大家一般都是把模板放到项目里,然后提供下载地址即可,不一定需要代码创建啦!

java代码将excel文件中的内容列表转换成JS文件输出的更多相关文章

  1. java中的文件读取和文件写出:如何从一个文件中获取内容以及如何向一个文件中写入内容

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  2. PHP将多个文件中的内容合并为新的文件

    function test() { $hostdir= iconv("utf-8","gbk","C:\Users\原万里\Desktop\日常笔记& ...

  3. C#读取数据库内容并转换成xml文件

    OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\bi ...

  4. xls/csv文件转换成dbf文件

    转至:https://blog.csdn.net/linhai1028/article/details/80211252 编写的一个小脚本,主要是利用python中的pandas,xlrd,dbfpy ...

  5. Java IO把一个文件中的内容以字符串的形式读出来

    代码记录(备查): /** * 把一个文件中的内容以字符串的形式读出来 * * @author zhipengs * */ public class FileToString { public sta ...

  6. 从Excel文件中读取内容

    从Excel文件中读取内容 global::System.Web.HttpPostedFileBase file = Request.Files["txtFile"]; strin ...

  7. 根据Excel文件中的内容,修改指定文件夹下的文件名称

    问题:根据Excel文件中内容,把文件名称由第2列,改为第1列.比如:把文件“123.jpg”修改为“1.jpg”.

  8. 代码实现:定义一个文件输入流,调用read(byte[] b)方法,将a.txt文件中的内容打印出来(byte数组大小限制为5)

    package com.loaderman.test; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; im ...

  9. 在java中读取文件中的内容

    package shi; import java.io.*; public class wenjianIO { public static void main(String agrs[]){ File ...

随机推荐

  1. 面试题:cook和session

    1.首先,Cookie与Session存在的目的是什么? 答:二者都是为了保持客户端访问用户与后台服务器的交互状态,之所以为了保持这种状态,一是为了方便一些业务的实现,另一方面就是为了简化后台服务端的 ...

  2. ubuntu 设置虚拟机和主机在同一网段

    一.在VMware中将网络连接方式设置为桥接 1.打开VM菜单栏->Settings 2.在弹出的Virtual Machine Setting对话框中点击Network Adapter,在右边 ...

  3. Linux cmus

    一.简介 CMus 是一款类似于MOC, Herrie 或 mp3blaster 的基于终端的音乐播放器,支持 Ogg Vorbis, FLAC, MP3, WAV, Musepack, WavPac ...

  4. HTML中meta标签的作用与使用

    META标签用来描述一个HTML网页文档的属性 META标签可分为两大部分:HTTP-EQUIV和NAME变量. HTTP实例 HTML代码实例中有一项内容是 <meta http-equiv= ...

  5. bootstrap导航菜单

    <!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8&quo ...

  6. 国外物联网平台(4):Ayla Networks

    国外物联网平台(4)——Ayla Networks 马智 定位 Ayla企业软件解决方案为全球部署互联产品提供强大的工具 功能 Ayla的IoT平台包含3个主要组成部分: (1) Ayla嵌入式代理A ...

  7. 【转】Android自定义控件(三)——有弹性的ListView

    原文地址:http://blog.csdn.net/a105865708/article/details/17959459 上一次我们试验了有弹性的ScrollView.详情 这一次,我们来试验有弹性 ...

  8. C# 的 Task、Thread、ThreadPool 之间有什么异同?

    Thread就是Thread,需要自己调度,适合长跑型的操作. ThreadPool是Thread基础上的一个线程池,目的是减少频繁创建线程的开销.线程很贵,要开新的stack,要增加CPU上下文切换 ...

  9. angular 样式属性绑定

    <button (click)="onClick($event)">点我</button> <input type="> <ta ...

  10. C#帮助类:Base64

    public class Base64 { #region Base64加密 ///<summary> ///Base64加密 ///</summary> ///<par ...