开发者

Springboot使用jxls实现excel模板导出excel方式

开发者 https://www.devze.com 2024-08-16 10:21 出处:网络 作者: 专注写bug
目录依赖引入编写一个导出模板编写工具类编写测试类导出测试使用 jx 表达式填充(2023.08.08)简单报表复杂的单行数据填充总结jxls的正确使用,需要使用到下面的表达式。
目录
  • 依赖引入
  • 编写一个导出模板
  • 编写工具类
  • 编写测试类
  • 导出测试
  • 使用 jx 表达式填充(2023.08.08)
    • 简单报表
    • 复杂的单行数据填充
  • 总结

    jxls的正确使用,需要使用到下面的表达式。

    # 设置 列表数据展示 
    jx:each(items="item.itemsList" var="obj" lastCell="H11" varIndex="ojbIndex")
    jx:if(condition="item.productType.equals('财务报表')&&ojbIndex==0" lastCell="H11" areas=["A11:H11"])
    
    # 设置表title 范围
    jx:area(lastCell=”H12”)

    但本次,并未使用到上面的要求,直接进行指定xls模板数据填充与导出。

    依赖引入

    <!-- excel 填充 -->
    <dependency>
        <groupId>org.jxls</groupId>
        <artifactId>jxls</artifactId>
        <version>2.8.1</version>
    &ljavascriptt;/dependency>
    <dependency>
        <groupId>net.sf.jxls</groupId>
        <artifactId>jxls-core</artifactId>
        <version>1.0.6</version>
    </dependency>
    <dependency>
        <groupId>org.jxls</groupId>
        <artifactId>jxls-poi</artifactId>
        <version>2.8.1</version>
    </dependency>

    编写一个导出模板

    如下所示:

    Springboot使用jxls实现excel模板导出excel方式

    放在springboot项目中的src\main\resources下的templates_report中,命名为test_user2.xls

    Springboot使用jxls实现excel模板导出excel方式

    编写工具类

    import Java.io.ByteArrayOutputStream;
    imporandroidt java.io.InputStream;
    import java.util.Map;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.core.io.Resource;
    import net.sf.jxls.transformer.XLSTransformer;
     
    public class ExcelUtil {
    
    	/**
    	 * 下载excel
    	 *
    	 * @param sourcePath 模板路径
    	 * @param beanParams excel内容
    	 * @return
    	 */
    	public static byte[] downLoadExcel(String sourcePath, Map<String, Object> beanParams) throws Exception {
    		ByteArrayOutputStream os = new ByteArrayOutputStream();
    		//读取模板
    		Resource resource = new ClassPathResource(sourcePath);
    		InputStream is = resourcwww.devze.come.getInputStream();
    
    		XLSTransformer transformer = new XLSTransformer();
    		//向模板中写入内容
    		Workbook workbook = transformer.transformXLS(is, beanParams);
    		//写入成功后转化为输出流
    		workbook.write(os);
    
    		byte[] bytes = os.toByteArray();
    		return bytes;
    	}
    }

    编写测试类

    @GetMapping("/report-xls")
    public void excelReport(HttpServletResponse response) throws Exception {
        Map<String, Object> map = new HashMap();
        List<Map<String, Object>> dataList = Lists.newArrayList();
        for (int i = 0; i < 10; i++) {
            Map<String, Object> params = new HashMap<>();
            params.put("num","1_"+i);
            params.put("name","xj_"+i);
            params.put("age",22);
            params.put("mail","专注写bug测试中文");
            dataList.add(params);
        }
        // ${item.num}
        map.put("item",dataList);
    
        byte[] bytes = ExcelUtil.downLoadExcel("/templates_report/test_user2.xls", map);
    
        String fileName = UUID.randomUUID().toString() + "_001_test.xls";
        generateFile(response, bytes, fileName);
    }

    导出测试

    http://localhost/report/report-xls

    Springboot使用jxls实现excel模板导出excel方式

    使用 jx 表达式填充(2023.08.08)

    就如文章开始的一样,说到了jx的表达式语法,3种样式:

    # 设置 列表数据展示 
    jx:each(items="item.itemsList" var="obj" lastCell="H11" varIndex="ojbIndex")
    jx:if(condition="item.productType.equals('财务报表')&&ojbIndex==0" lastCell="H11" areas=["A11:H11"])
    
    # 设置表title 范围
    jx:area(lastCell=”H12”)

    这里分几种使用情况,做一个大致的说明:

    简单报表

    如下图所示,需要导出一个简单的报表数据信息。何为简单?

    就是普通的表格

    Springboot使用jxls实现excel模板导出excel方式

    注意图中标明的两个方框。其中分别写了如下的批注

    • 表格头部
    	Administrator:
    	jx:area(lastCell=”P2”)

    这里必须设置范围,也就是lastCell。表示:表头最多宽度只到P2

    • 表格内容(列表数据)
    Administrator:
    jx:each(items="dataList" var="item" lastCell="P2")

    这里也有范围,设置的是lastCellP2

    【注意】lastCell 设置的是横向最大www.devze.com延伸到P2。

    列表多条数据,只看第一行即可!

    复杂的单行数据填充

    如下面的excel导出模板。

    Springboot使用jxls实现excel模板导出excel方式

    除了前2行左上部分是集合列表,其他都只需要显示一条对应的数据即可!

    其实并不需要用到列表集合,全部是单条数据。只是需要显示很多行而已。

    像这样的数据,如何实现呢?

    依旧还是使用jx表达式,限制导出文本的范围。

    如下:

    表头部分:

    Administrator:
    jx:area(lastCell=”M20”)  

    这里的范围,其实只需要大于等于需要导出的excel的范围就行。

    如果小了,则只显示部分http://www.devze.com数据。

    数据部分,jx表达式如下所示:

    Administrator:
    jx:each(items="dataList" var="item" lastCell="M20")

    这里的lastCell是写的M20,也就是

    从标注添加处开始算起,直至 M列的第20行,都算一个集合的一列数据!

    也就是从A2~M20这个构成的长方形,包括的范围,都只当做一个集合中的一个对象。

    List<User>中第一个 user 对象

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号