Java导出Excel 复杂表头

2023-10-27

文章标题

导出表格

导出表格的方式在我的理解有两种
一种是直接用代码控制表头==== 简单的表头
一种是直接使用模板直接添加数据就可以=== 复杂的表头

依赖
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>3.9</version>
</dependency>

<!--下面是我直接测试表格,因为要在浏览器导出,直接创建Springboot 简单访问-->
 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
package com.example.demo.test;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @program: Ecology1
 * @description: this is a class
 * @author: Mr.zeng
 * @create: 2021-03-12 10:02
 **/

public class TestTemplateExcel {
    /*
     *
     */
    private static final long serialVersionUID = 1L;

    /**
     * 生成excel并下载
     */
    public void exportExcel(HttpServletResponse response, HttpServletRequest request) {
        String userName = request.getParameter("userName");
        File newFile = createNewFile();
        // File newFile = new File("d:/ss.xls");
        // 新文件写入数据,并下载*****************************************************
        InputStream is = null;
        Workbook workbook = null;
        Sheet sheet = null;
        try {
            is = new FileInputStream(newFile);// 将excel文件转为输入流

            workbook=XlsImpUtil.create(is);
//            workbook = new XSSFWorkbook(is);// 创建个workbook,
            // 获取第一个sheet
            sheet = workbook.getSheetAt(0);
        } catch (Exception e1) {
            e1.printStackTrace();
        }

        if (sheet != null) {
            try {
                // 写数据
                FileOutputStream fos = new FileOutputStream(newFile);
                Row row = sheet.getRow(3);
                if (row == null) {
                    row = sheet.createRow(3);
                }
                Cell cell = row.getCell(0);
                if (cell == null) {
                    cell = row.createCell(0);
                }

                // TODO 定义一个list集合假数据
                List<Map<String, Object>> lst = new ArrayList();
                Map<String, Object> map1 = new HashMap<String, Object>();
                // 只能添加11个
                for (int i = 0; i < 11; i++) {
                    map1.put("id" + i, i);
                    lst.add(map1);
                }
                row=sheet.getRow(1);
                String sj="填报日期:2020年03月24日 15:52 星期四";
                cell=row.getCell(0);
                cell.setCellValue(sj);
                for (int m = 0; m < lst.size(); m++) {
                    Map<String, Object> map = lst.get(m);
                    row=sheet.getRow(m+3);
//                    row = sheet.createRow((int) m + 3);
                    for (int i = 0; i < 5; i++) {
                        String value = map.get("id" + m) + "";
                        if (value.equals("null")) {
                            value = "0";
                        }
                        if(row.getRowNum()>= 7 && row.getRowNum()<=12){
                            cell=row.getCell(i+2);
                        }else {
                            cell=row.getCell(i+2);
                        }

                    /*    cell = row.createCell(i);*/
                        cell.setCellValue(value);
                    }

                }
                // 填报人
                row=sheet.getRow(14);
                String tbr="\t\t填报人:"+userName;
                cell=row.getCell(0);
                cell.setCellValue(tbr);

                workbook.write(fos);
                fos.flush();
                fos.close();
                // 下载
                InputStream fis = new BufferedInputStream(new FileInputStream(
                        newFile));
//                    HttpServletResponse response = /*ServletActionContext.getResponse();*/null;
                byte[] buffer = new byte[fis.available()];
                fis.read(buffer);
                fis.close();
                response.reset();
                response.setContentType("text/html;charset=UTF-8");
                OutputStream toClient = new BufferedOutputStream(
                        response.getOutputStream());
                response.setContentType("application/x-msdownload");
                String newName = URLEncoder.encode(
                        "活动报表" + System.currentTimeMillis() + ".xlsx",
                        "UTF-8");
                response.addHeader("Content-Disposition",
                        "attachment;filename=\"" + newName + "\"");
                response.addHeader("Content-Length", "" + newFile.length());
                toClient.write(buffer);
                toClient.flush();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (null != is) {
                        is.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        // 删除创建的新文件
         this.deleteFile(newFile);
    }
    /**
     * 复制文件
     *
     * @param s
     *            源文件
     * @param t
     *            复制到的新文件
     */
    public void fileChannelCopy(File s, File t) {
        try {
            InputStream in = null;
            OutputStream out = null;
            try {
                in = new BufferedInputStream(new FileInputStream(s), 1024);
                out = new BufferedOutputStream(new FileOutputStream(t), 1024);
                byte[] buffer = new byte[1024];
                int len;
                while ((len = in.read(buffer)) != -1) {
                    out.write(buffer, 0, len);
                }
            } finally {
                if (null != in) {
                    in.close();
                }
                if (null != out) {
                    out.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private String getSispPath() {
        String classPaths = "C:\\Users\\zp\\IdeaProjects\\Ecology1\\src\\main\\resources";
//        String classPaths="/usr/weaver/ecology/classbean/com/api/zp";
        String[] aa = classPaths.split("/");
        String sispPath = "";
        for (int i = 1; i < aa.length - 2; i++) {
            sispPath += aa[i] + "/";
        }
        return sispPath;
    }
    /**
     * 读取excel模板,并复制到新文件中供写入和下载
     *
     * @return
     */
    public File createNewFile() {
        // 读取模板,并赋值到新文件************************************************************
       final String name="C:\\Users\\zp\\IdeaProjects\\demo\\活动报表";
//       String name="/usr/weaver/ecology/classbean/com/api/zp/活动报表";
        // 文件模板路径
        String path =  name+".xls";
        File file = new File(path);
        // 保存文件的路径
        String realPath =  "";
        // 新的文件名
        String newFileName = name + System.currentTimeMillis() + ".xls";
        // 判断路径是否存在
        File dir = new File(realPath);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        // 写入到新的excel
        File newFile = new File(newFileName);
        try {
            newFile.createNewFile();
            // 复制模板到新文件
            fileChannelCopy(file, newFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return newFile;
    }
    /**
     * 下载成功后删除
     *
     * @param files
     */
    private void deleteFile(File... files) {
        for (File file : files) {
            if (file.exists()) {
                file.delete();
            }
        }
    }
    }

import com.fasterxml.jackson.databind.exc.InvalidFormatException;
import org.apache.poi.POIXMLDocument;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.IOException;
import java.io.InputStream;
import java.io.PushbackInputStream;

/**
 * @program: Ecology
 * @description: this is a class
 * @author: Mr.zeng
 * @create: 2021-03-12 11:34
 **/

public class XlsImpUtil {
    public static Workbook create(InputStream inp) throws IOException, InvalidFormatException, org.apache.poi.openxml4j.exceptions.InvalidFormatException {
        if (!inp.markSupported()) {
            inp = new PushbackInputStream(inp, 8);
        }
        if (POIFSFileSystem.hasPOIFSHeader(inp)) {
            return new HSSFWorkbook(inp);
        }
        if (POIXMLDocument.hasOOXMLHeader(inp)) {
            return new XSSFWorkbook(OPCPackage.open(inp));
        }
        throw new IllegalArgumentException("你的excel版本目前poi解析不了");
    }
}

我的Controller

import com.example.demo.test.TestTemplateExcel;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @program: Ecology1
 * @description: this is a class
 * @author: Mr.zeng
 * @create: 2021-03-12 10:52
 **/
@Controller
@RequestMapping("/excel")
public class ExcelMainController {

    @RequestMapping("/port")
    public String excelport(HttpServletResponse response, HttpServletRequest request){
         new TestTemplateExcel().exportExcel(response,request);
         return "";
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java导出Excel 复杂表头 的相关文章

  • Java中有没有一种方法可以通过名称实例化一个类?

    我正在寻找问题 从字符串名称实例化一个类 https stackoverflow com questions 9854900 instantiate an class from its string name它描述了如何在有名称的情况下实例
  • Junit:如何测试从属性文件读取属性的方法

    嗨 我有课ReadProperty其中有一个方法ReadPropertyFile返回类型的Myclass从属性文件读取参数值并返回Myclass目的 我需要帮助来测试ReadPropertyFile方法与JUnit 如果可能的话使用模拟文件
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 为什么 Java 8 不允许非公共默认方法?

    让我们举个例子 public interface Testerface default public String example return Hello public class Tester implements Testerface
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • windows/Linux c++ 获取CMD指令执行的返回结果

    无论是在windows还是linux下我们都可以借助popen执行终端指令并获取到返回值 执行cmd指令并返回结果 string getCmdResult const string strCmd char buf 10240 0 FILE
  • # Flutter中文教程2. Flutter基础-项目结构:lib、test、pubspec.yaml等文件

    系列文章目录 Flutter中文教程1 Flutter简介 什么是Flutter 介绍Flutter的概念 优点与作用 环境配置 工具 SDK与插件安装 Flutter中文教程2 Flutter基础 项目结构 lib test pubspe
  • 动态规划算法的优化技巧

    关键词 动态规划 时间复杂度 优化 状态 摘要 动态规划是信息学竞赛中一种常用的程序设计方法 本文着重讨论了运用动态规划思想解题时时间效率的优化 全文分为四个部分 首先讨论了动态规划时间效率优化的可行性和必要性 接着给出了动态规划时间复杂度
  • java中实现域名解析

    import java net public class Kkkk public static void main String args throws Exception InetAddress address InetAddress g
  • 攻防世界-CTF小白-WEB(新手)

    我会一题一题的做 因为也是新手所以我会尽可能的写的清楚明白 后面所需要的工具我会慢慢发出来 也可以私信我 web新手区 1 view source X老师让小宁同学查看一个网页的源代码 但小宁同学发现鼠标右键好像不管用了 这一题够简单的了
  • 分布式锁问题_演示问题

    通过idea创建两个服务 启动Nginx服务 下载Nginx windows服务 官网nginx download 当然我这里提供了 我们打开nginx的conf目录 然后打开配置文件nginx conf进行配置 upstream test
  • 算法环境配置4_实例分割SOLOv2

    文章目录 一 环境配置 前言 0 我的环境 仅供参考 1 创建虚拟环境 2 激活虚拟环境 3 安装cuda torch torchvision toraudio 4 检查是否安装OK 5 安装预建的 Detectron2 仅限 Linux
  • dpvs入门实践1--概念及编译安装

    DPVS是一种基于DPDK的高性能四层负载均衡器 它来源于Linux Virtual Server LVS及其修改后的alibaba LVS 那LVS是什么呢 Linux Virtual Server是构建在实服务器集群上的高度可伸缩和高可
  • WSL删除文件后,Windows未释放空间

    How to Shrink a WSL2 Virtual Disk 进入powershell diskpart select vdisk file F WSL Ubuntu ext4 vhdx compact vdisk
  • js中的定时器、延时器

    一 定时器 创建定时器 window setInterval 方法名 间隔时间 1000 1秒 var timer window setInterval func1 2000 var i 0 function func1 console l
  • C++函数对象

    目录 函数符概念 函数对象 函数对象 函数指针调用演示 匿名函数Lambda 函数包装器 函数符概念 两大类 函数对象 函数指针 四种形式 函数对象 成员函数指针 全局函数指针 Lambda表达式 函数对象 函数对象概念 1 函数对象是一个
  • 中国电子学会2022年09月份青少年软件编程Python等级考试试卷二级真题(含答案)

    2022 09 Python二级真题 分数 100 题数 37 测试时长 60min 一 单选题 共25题 共50分 1 运行以下代码 结果输出的是 C 2分 means Thank You print len means A 8 B 6
  • 最粗暴的方法实现一个栈

    对于栈和队列是一个很简单的知识 用的感觉也不是很多 但是 我们仍然的学习 加油 在实现最简单的栈之前 我们需要简单了解一下栈是什么 栈 stack 又名堆栈 它是一种运算受限的线性表 限定仅在表尾进行插入和删除操作的线性表 这一端被称为栈顶
  • 数据结构图的操作邻接表创建,深度、广度遍历,Dijkstra最短路径算法

    邻接表 深度优先 广度优先搜索方式遍历图 include
  • 数值计算之 插值法(1)多项式插值——拉格朗日插值法

    数值计算之 插值法 1 多项式插值 拉格朗日插值法 前言 什么是插值 多项式插值法 拉格朗日插值法 总结 前言 移动机器人有一个非常重要的任务 轨迹规划 轨迹规划需要满足运动学原理 即在路径规划给出路点后 必须把路点平滑成光滑的轨迹 才能让
  • 对输入图像按比例压缩、居中填充

    摘要 图像在输入神经网络之前 通常需要进行尺寸压缩 如yolov5的输入为640x640 分类网络Resnet 50的输入为224x224 通常地 分类网络直接将输入进行resize处理 而对于目标检测网络 为了防止目标变形 通常采用pad
  • gitlab在merge request 中可能遇到的问题

    1 merge request 中代码冲突 merge的时候 可能存在代码冲突 这时 开发者可从远程仓库master分支重新拉取最新代码进行本地merge 解决冲突后重新提交代码进行review git pull upstream mast
  • sonar 规则总结

    bug类型 1 equals should not be used to test the values of Atomic classes bug 主要 不要使用equals方法对AtomicXXX进行是否相等的判断 Atomic变量永远
  • echarts 省市区联动地图

    地图效果 省地图
  • Java导出Excel 复杂表头

    文章标题 导出表格 依赖 导出表格 导出表格的方式在我的理解有两种 一种是直接用代码控制表头 简单的表头 一种是直接使用模板直接添加数据就可以 复杂的表头 依赖