Java 使用easypoi模板导出复杂表格

Excel模板语法:

空格分割
三目运算 {{test ? obj:obj2}}
n: 表示 这个cell是数值类型 {{n:}}
le: 代表长度{{le:()}} 在if/else 运用{{le:() > 8 ? obj1 : obj2}}
fd: 格式化时间 {{fd:(obj;yyyy-MM-dd)}}
fn: 格式化数字 {{fn:(obj;###.00)}}
fe: 遍历数据,创建row
!fe: 遍历数据不创建row
$fe: 下移插入,把当前行,下面的行全部下移.size()行,然后插入
#fe: 横向遍历
v_fe: 横向遍历值
!if: 删除当前列 {{!if:(test)}}
单引号表示常量值 '' 比如'1' 那么输出的就是 1
&NULL& 空格
]] 换行符 多行遍历导出
sum: 统计数据

第一部分.模板制作

(原模版)

(制作后的模板)

(导出的excel)

模板制作注意点:

1.上述模板相当于两个表格数据,上表格是循环数据,所以要使用{{}}将整个循环的这条数据数据括起来,{{是其实的第一个数据前使用,}}是结尾数据使用,我的数据是横向循环,所以每行数据最后用]]进行结尾换行.

2.如果循环数据中有固定数据,像上表中的正向有功总-反向有功谷这些,要用两个单引号''引用起来,有的excel可能会前面的单引号写了不显示,我这里就是,这时候就需要前面写两个单引号,如:''有功电量'.

3.模板的合并单元格可能会有bug,某个可能没有进行合并,这时候需要进行手动合并单元格了

Workbook workbook = ExcelExportUtil.exportExcel(params, map);
//参数:第一sheet页,初始行,最终行,初始列,最终列
PoiMergeCellUtil.addMergedRegion(book.getSheetAt(0),5,5,8,24);

4.部署到服务器的问题,

模板放到项目路径在本地可以正常读取运行,但是部署到服务器上读取不到,解决方法如下:

4.1 将路径改为系统路径,把模板放到服务器莫格文件夹下

4.2 将项目打成war包

4.3 使用4.0.0以上版本,从别处评论区看的,

TemplateExportParams params = new TemplateExportParams();
 Workbook workbook = WorkbookFactory.create(getClass().getClassLoader().getResourceAsStream("xlsx/demo.xls"));
params.setTemplateWb(workbook);

第二部分  前后端代码

1.项目环境:

基于SpringBoot和JDK1.8

2.导入依赖

		<!-- EasyPoi依赖 -->
		<dependency>
			<groupId>cn.afterturn</groupId>
			<artifactId>easypoi-base</artifactId>
			<version>4.1.0</version>
		</dependency>

3.后端代码

   /**
     * 导出excel
     */
    @GetMapping("export")
    public void eleCountExport(Long id, HttpServletResponse response) throws IOException {
        TemplateExportParams params = new TemplateExportParams("D:\\java\\电费明细表模板.xlsx");
        //将文件所需的参数传入workbook
        Map<String,Object> map = new HashMap<>();
		
		
		//这里是查询的数据
		
		
        map.put("date", day);
        map.put("list", resultList);
        try {
            // 这里URLEncoder.encode可以防止中文乱码
            Workbook workbook = ExcelExportUtil.exportExcel(params, map);
            String filename = URLEncoder.encode("excel名称", "UTF-8");
            String newSheetName = configEleUser.getName();
            workbook.setSheetName(0, newSheetName);
            String suffix = ".xlsx";
            String contentType = "application/vnd.ms-excel";
            response.setContentType(contentType);
            response.setCharacterEncoding("UTF-8");
            response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + filename + suffix + "; filename=" + filename + suffix);
            OutputStream outStream = response.getOutputStream();
            workbook.write(outStream);
            outStream.flush();
            outStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
}

4.前端调用

<el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport">导出</el-button>

//方法
      handleExport() {
        const queryParams = this.queryParams;
        this.$confirm('是否确认导出所有数据?', "警告", {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning"
        }).then(() => {
          return exportEleCountData(queryParams);
        }).then(response => {
          // 创建一个 URL 以便下载
          const url = window.URL.createObjectURL(new Blob([response.data]));
          const link = document.createElement('a');
          link.href = url;
          link.setAttribute('download', '电费明细单.xlsx');
          document.body.appendChild(link);
          link.click(); // 触发下载
          link.remove(); // 移除链接
        }).catch(() => {});
      },

//js文件
import request from '@/utils/request'
import axios from 'axios'; // 确保引入了 axios

export function exportEleCountData(query) {
  const baseUrl = process.env.VUE_APP_BASE_API
  return axios({
    url: baseUrl + '/es/ele/eleCount/export',
    method: 'get',
    params: query,
    responseType: 'blob',
    headers: { 'Authorization': 'Bearer ' + getToken() }
  });
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值