java使用jxls導出Excel


 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


免責聲明!

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



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