首先我們創建一個springboot項目, 或者一個web項目.這一步就省略了,,,,,,
maven項目
項目目錄
1 引入依賴
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.11</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.11</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.11</version>
</dependency>
<dependency>
<groupId>net.sf.jxls</groupId>
<artifactId>jxls-core</artifactId>
<version>1.0.6</version>
</dependency>
2 引入插件(爲了防止maven項目打包的時候將xls 等格式文件一併都打了包)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
<nonFilteredFileExtension>xls</nonFilteredFileExtension>
<nonFilteredFileExtension>zip</nonFilteredFileExtension>
<nonFilteredFileExtension>cer</nonFilteredFileExtension>
<nonFilteredFileExtension>pfx</nonFilteredFileExtension>
<nonFilteredFileExtension>py</nonFilteredFileExtension>
<nonFilteredFileExtension>keystore</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
3 寫模版(jxls語法自行百度 點擊這裏提供一個簡單用法參考 )
姓名 | 性別 | 年齡 | 身高 |
<jx:forEach items="${list}" var="user"> | |||
${user.name} | ${user.sex} | ${user.age} | ${user.tall} |
</jx:forEach> |
4 設置簡單的實體類
public class User implements Serializable {
String name;
String age;
String sex;
String tall;
/*getter and setter*/
}
5 controller層代碼
下面給了兩種方式獲取流, 結果都是一樣的.
package com.trade.serviceeureka;
import net.sf.jxls.transformer.XLSTransformer;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.*;
@Controller
@RequestMapping
public class Controller {
@RequestMapping("/getExecl")
public void get(HttpServletRequest request, HttpServletResponse response) throws IOException, InvalidFormatException {
// 文件流
File file = ResourceUtils.getFile("classpath:template/template1.xlsx");
InputStream in = new FileInputStream(file);
//resource 流
// Resource resource = new ClassPathResource("template/template1.xls");
// InputStream in = resource.getInputStream();
Map<String, Object> beanParams = new HashMap<>();
List<User> list = new ArrayList<>();
User u = new User("aa", "1", "男人", "180cm");
User u2 = new User("bb", "2", "女人", "120cm");
User u3 = new User("cc", "3", "人妖", "130cm");
User u4 = new User("dd", "4", "陰陽人", "140cm");
list.add(u);
list.add(u2);
list.add(u3);
list.add(u4);
beanParams.put("list", list);
// 構造標準的poi導出格式
XLSTransformer transformer = new XLSTransformer();
Workbook workbook = transformer.transformXLS(in, beanParams);
// 設置輸出流
ServletOutputStream out = response.getOutputStream();
// 設置導出名稱
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HHmmss");
String exportFileName = "out-" + sdf.format(new Date()) + ".xls";
// 設置導出格式
response.setHeader("Content-Disposition", "attachment;filename=" + exportFileName);
response.setContentType("application/vnd.ms-excel;charset=utf-8");
// 將內容寫入輸出流並把緩存的內容全部發出去
workbook.write(out);
// 關閉流
in.close();
out.flush();
out.close();
}
}
6 運行結果
總結:
Workbook workbook = transformer.transformXLS(in, beanParams); 這個方法非常強大, 不管你是03年版本的excel 還是07年的, 它都能準確的判斷, 不再需要像以前那樣判斷 文件的格式是xls還是xlsx.
看下源碼:
根據 流 判斷 到底創建HSSF 還是 XSSF book的. 一般來說都能正常運行,
最常見的異常就是 下面
Your InpuStream was neither an OLE2 stream, nor an OOXML stream 看下所有步驟有沒有漏掉的.