jxls是基於POI的Excel模板導出導入框架。通過使用類似於jstl的標簽,有效較少導出Excel的代碼量。
1.pom
<!-- https://mvnrepository.com/artifact/net.sf.jxls/jxls-core --> <dependency> <groupId>net.sf.jxls</groupId> <artifactId>jxls-core</artifactId> <version>1.0.3</version> </dependency>
2.模板樣式
一般數據直接綁定跟 jstl比較像,直接${name}
循環就是 <jx:forEach items="${data}" var="item" varStatus="i" ></jx:forEach>
3.代碼演示
@Test public void method1() throws Exception { // 循環數據 List<Object> list = new ArrayList<>(); for (int i = 0; i < 100; i++) { Map<String,Object> data = new HashMap<>(); data.put("a1", (int)(Math.random()*100) ); data.put("a2", (int)(Math.random()*100) ); data.put("a3", (int)(Math.random()*100) ); data.put("a4", (int)(Math.random()*100) ); data.put("a5", (int)(Math.random()*100) ); list.add(data); } // 表格使用的數據 Map map = new HashMap(); map.put("data",list); map.put("title","java基於模板導出excel表格"); map.put("val","演示合並單元格的數據顯示"); // 獲取模板文件 InputStream is = this.getClass().getClassLoader().getResourceAsStream("x1.xls"); // 實例化 XLSTransformer 對象 XLSTransformer xlsTransformer = new XLSTransformer(); // 獲取 Workbook ,傳入 模板 和 數據 Workbook workbook = xlsTransformer.transformXLS(is,map); // 寫出文件 OutputStream os = new BufferedOutputStream(new FileOutputStream("D://temp.xls")); // 輸出 workbook.write(os); // 關閉和刷新管道,不然可能會出現表格數據不齊,打不開之類的問題 is.close(); os.flush(); os.close(); }
4.導出效果
5.web環境下跑
web環境下跑和上面的代碼基本上一樣,不一樣的就是 OutputStream 的地方換成了 response.getOutputStream()
然后 response 設置一下文件名, response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("報表.xls" ,"UTF-8"));
如果這一步不懂得可以參考我得另一篇文章:https://blog.csdn.net/yali_aini/article/details/81745883
代碼:
import net.sf.jxls.transformer.XLSTransformer; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Controller public class ReportController { @RequestMapping("/report") public void report(HttpServletRequest request , HttpServletResponse response){ try{ // 循環數據 List<Object> list = new ArrayList<>(); for (int i = 0; i < 100; i++) { Map<String,Object> data = new HashMap<>(); data.put("a1", (int)(Math.random()*100) ); data.put("a2", (int)(Math.random()*100) ); data.put("a3", (int)(Math.random()*100) ); data.put("a4", (int)(Math.random()*100) ); data.put("a5", (int)(Math.random()*100) ); list.add(data); } // 表格使用的數據 Map map = new HashMap(); map.put("data",list); map.put("title","java基於模板導出excel表格"); map.put("val","演示合並單元格的數據顯示"); // 獲取模板文件 InputStream is = this.getClass().getClassLoader().getResourceAsStream("x1.xls"); // 實例化 XLSTransformer 對象 XLSTransformer xlsTransformer = new XLSTransformer(); // 獲取 Workbook ,傳入 模板 和 數據 Workbook workbook = xlsTransformer.transformXLS(is,map); // 設置文件名 response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("報表.xls" ,"UTF-8")); // 寫出文件 OutputStream os = new BufferedOutputStream( response.getOutputStream() ); // 輸出 workbook.write(os); // 關閉和刷新管道,不然可能會出現表格數據不齊,打不開之類的問題 is.close(); os.flush(); os.close(); }catch (Exception e){ } } }
訪問 /report/ 連接時就直接下載文件了,打開看和剛才測試跑的是一樣的。
————————————————
版權聲明:本文為CSDN博主「臨窗,聽雨聲」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yali_aini/article/details/85804466