关于实现导出word、excel的一些尝试

本文讲述了在新版本开发中遇到的导出需求,包括js前台导出、java导出csv以及使用poi HSSF后台导出excel。特别讨论了使用POI导出word遇到的问题以及转向freemarker导出word的详细步骤,包括模板制作、格式转换和ftl文件的修改。
摘要由CSDN通过智能技术生成

最近在做新版本的开发,大部分的页面都需要实现导出功能,最开始倒是没觉得有多难,做一个前台导出,对缓存的数据做一个渲染+导出就好了。但是在综合考虑了所有业务之后,单纯的前台导出,貌似并不能解决所有的问题。于是我的系统里面现在一共存在了三种导出方式,一一列举吧。
1.js实现前台导出
这个没什么太多好说的,直接上工具代码,代码简单易懂,就不用讲使用方式了吧。

export function exportExcel(columns, dataList, filename) {
  const resultData = []
  const columnLabels = []
  for (const col of columns) {
    columnLabels.push(col.label)
  }
  resultData.push(columnLabels.join(','))
  for (const data of dataList) {
    const columnValues = []
    for (const col of columns) {
      if (col.render) {
        columnValues.push(col.render(data[col.prop]))
      } else {
        columnValues.push(data[col.prop])
      }
    }
    resultData.push(columnValues.join(','))
  }
  const blob = new Blob(['\ufeff' + resultData.join('\n')], { type: 'text/csv; charset=UTF-8' })
  const a = document.createElement('a')
  a.href = URL.createObjectURL(blob)
  a.setAttribute('download', filename + '.csv')
  a.click()
}

2.java实现导出csv
一般我是推荐使用这种方式进行导出的,只需要构造自己需要的header map和data map的list就可以。header map的键与data map的键一致;header map的值为csv文件中显示的header(就是你想展示什么,值就写什么就对了,可以自己看代码理解);data map的值就是要显示的数据。值得注意的是,如果希望header按照自己需要的顺序导出到文件中,记得将header map声明为LinkedHashMap(有序)。

import org.mmi.tws.common.exception.AdminException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author DiCaprito
 */
@Service
public class ExportService {
    private static final Logger LOGGER = LoggerFactory.getLogger(ExportService.class);

    public void exportExcel(HttpServletResponse response, String fileName, Map<String, String> header, List<Map<String, Object>> dataList) {
        LOGGER.info("[ExportService]#Start to export excel.");
        StringBuilder sb = new StringBuilder();
        List<String> keyList = new ArrayList<>();
        int index = 0;
        //生成头部
        for (Map.Entry<String, String> entry : header.entrySet()) {
            if (index > 0) {
                sb.append(",");
            }
            String key = entry.getKey();
            String value = entry.getValue();
            sb.append(value.replace(',', ','));
            keyList.add(key);
            index++;
        }
        sb.append("\r\n");
        //生成数据
        for (Map<String, Object> map : dataList) {
            index = 0;
            for (String key : keyList) {
                Object value = map.get(key);
                if (index > 0) {
                    sb.append(",");
                }
                if (val
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值