java程序中 poi导出excel/csv导出excel 超详细代码!!!!_Nepal.的博客-程序员秘密_poi 导出csv

技术标签: excel  java  csv  poi  

在最近接到的需求当中要求把生成列表的数据,导出excel表格,这个问题并不难解决。在这里给大家介绍两种方法:poi和csv

首先介绍poi:
首先先导入依赖:

		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.17</version>
		</dependency>
		
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.17</version>
		</dependency>

想了解poi如何使用,请查看官方文档!

详细代码如下:(支持分sheet操作)
注意我生成的是xls文件格式

在这里我导出的是多sheet表格,可以按照自己的开发需求随意删减。

  String fileName = "文件名" + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
        String url = path + fileName + ".xls";
  
  List<Class> list = null;
  List<Student> studentList = null;
  查询list的方法,根据自己的业务逻辑进行实现。
 			 //数据
            List<String[]> dataset = new ArrayList<String[]>();
  for (int i = 0; i < list.size(); i++) {
    
                String[] arr = new String[4];
                arr[0] = list.get(i).getId() == null ? "" : list.get(i).getId().toString();
                arr[1] = list.get(i).getMonth() == null ? "" : list.get(i).getMonth();
                arr[3] = list.get(i).getType() == null ? "" : list.get(i).getProvisionType();

                dataset.add(arr);
            }
            //数据
            List<String[]> dataset2 = new ArrayList<String[]>();
 for (int i = 0; i < studentList .size(); i++) {
    
                String[] arr2 = new String[2];
                arr2[0] = studentList .get(i).getContractNo() == null ? "" : studentList .get(i).getContractNo();
                arr2[1] = studentList .get(i).getName() == null ? "" : studentList .get(i).getName();

                dataset2.add(arr2);
            }
      //设置表头
            String[] handers1 = {
    "表头1","表头2","表头3","表头4"};
            String[] handers2 = {
    "表头1", "表头2", "表头3"};     
  //对象
            ExcelExp e1 = new ExcelExp("第一个sheet名称", handers1, dataset);
            ExcelExp e2 = new ExcelExp("第二个sheet名称", handers2, dataset2);

            List<ExcelExp> mysheet = new ArrayList<ExcelExp>();
            mysheet.add(e1);
            mysheet.add(e2);
 		ExcelExportUtil.exportManySheetExcel(url, mysheet); //生成sheet 这也是生成excel的方法.
 		super.download(url, response);//导出
   // 删除临时文件
            File file = new File(url);
            BASE64FileUtils.deleteFile(file);
public class ExcelExp{
    
    private String fileName;// sheet的名称
    private String[] handers;// sheet里的标题
    private List<String[]> dataset;// sheet里的数据集

    public ExcelExp(String fileName, String[] handers, List<String[]> dataset) {
    
        this.fileName = fileName;
        this.handers = handers;
        this.dataset = dataset;
    }

    public String getFileName() {
    
        return fileName;
    }

    public void setFileName(String fileName) {
    
        this.fileName = fileName;
    }

    public String[] getHanders() {
    
        return handers;
    }

    public void setHanders(String[] handers) {
    
        this.handers = handers;
    }

    public List<String[]> getDataset() {
    
        return dataset;
    }

    public void setDataset(List<String[]> dataset) {
    
        this.dataset = dataset;
    }
}
public class ExcelExportUtil {
    

 /**
     * @param @param file 导出文件路径
     * @param @param mysheets
     * @return void
     * @throws
     * @Title: exportManySheetExcel
     * @Description: 可生成单个、多个sheet
     */
    public static void exportManySheetExcel(String file, List<ExcelExp> mysheets) {
    

        HSSFWorkbook wb = new HSSFWorkbook();//创建工作薄
        List<ExcelExp> sheets = mysheets;

        //表头样式
        HSSFCellStyle style = wb.createCellStyle();
        //字体样式
        HSSFFont fontStyle = wb.createFont();
        fontStyle.setFontName("微软雅黑");
        fontStyle.setFontHeightInPoints((short) 12);
        style.setFont(fontStyle);

        for (ExcelExp excel : sheets) {
    
            //新建一个sheet
            HSSFSheet sheet = wb.createSheet(excel.getFileName());//获取该sheet名称

            String[] handers = excel.getHanders();//获取sheet的标题名
            HSSFRow rowFirst = sheet.createRow(0);//第一个sheet的第一行为标题
            //写标题
            for (int i = 0; i < handers.length; i++) {
    
                //获取第一行的每个单元格
                HSSFCell cell = rowFirst.createCell(i);
                //往单元格里写数据
                cell.setCellValue(handers[i]);
                cell.setCellStyle(style); //加样式
                sheet.setColumnWidth(i, 4000); //设置每列的列宽
            }

            //写数据集
            List<String[]> dataset = excel.getDataset();
            for (int i = 0; i < dataset.size(); i++) {
    
                String[] data = dataset.get(i);//获取该对象

                //创建数据行
                HSSFRow row = sheet.createRow(i + 1);

                for (int j = 0; j < data.length; j++) {
    
                    //设置对应单元格的值
                    row.createCell(j).setCellValue(data[j]);
                }
            }
        }

        // 写文件
        try {
    

            FileOutputStream out = new FileOutputStream(new File(file));
            out.flush();
            wb.write(out);
            out.close();
        } catch (FileNotFoundException e) {
    
            e.printStackTrace();
        } catch (IOException e) {
    
            e.printStackTrace();
        }
    }

}
public class super {
    
	public boolean download(String path, HttpServletResponse response) throws BizException {
    
		if (null == path) {
    
			log.info("download path is null");
			throw new BizException(BizCode.Commend_40001004);
		}
		File file = new File(path);
		if (!file.exists()) {
    
			throw new BizException(BizCode.Commend_40001004);
		}
		try (OutputStream out = response.getOutputStream(); FileInputStream is = new FileInputStream(file);) {
    
			response.setHeader("Content-Type", "application/force-download");
			response.setHeader("Content-Disposition",
					"attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));

			byte[] buf = new byte[1024];
			int read = 0;
			while ((read = is.read(buf, 0, 1024)) != -1) {
    
				out.write(buf, 0, read);
			}
		} catch (Exception e) {
    
			throw new BizException(BizCode.Commend_40001005);
		}
		return true;
	}
}
public class BASE64FileUtils {
    
		public static void deleteFile(File file) {
    
		if (!file.exists())
			return;
		if (file.isDirectory()) {
    
			File[] listFiles = file.listFiles();
			for (File file2 : listFiles) {
    
				deleteFile(file2);
			}
			file.delete();
		} else {
    
			file.delete();
		}
	}
}

-------------------------------------------------------------------------------------------------------------------------
好了,现在再给大家介绍一下csv文件导出。
还是得先导入依赖:

		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-csv</artifactId>
			<version>1.2</version>
		</dependency>

前面的流程大致相同,在这就不在写一遍了。

List<Student>list=null;

// 文件名
            String filename = "文件名" + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + ".csv";
// CSV文件每一列的名称
            String[] colNames = {
     "表头1","表头2","表头3","表头4" };
             File file=new File(filename);
            CSVFormat csvFormat = CSVFormat.DEFAULT.withHeader(colNames);
            try (OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
                 CSVPrinter csvPrinter = new CSVPrinter(osw, csvFormat);) {
    
                for (Student student:list){
    
                    csvPrinter.printRecord(student.getName(),student.getId());
                }
                csvPrinter.flush();
            }catch(IOException e){
    
              e.printStackTrace();
            }
         CSVUtils.exportCSVFile(response, file);
         file.delete();
public class CSVUtils {
    
 /**
     * 导出文件
     *
     * @param response
     * @param file
     */
    public static void exportCSVFile(HttpServletResponse response, File file) {
    
        InputStream in = null;
        OutputStream out = null;
        try {
    
            in = new FileInputStream(file);

            int len = 0;
            byte[] buffer = new byte[1024];
            out = response.getOutputStream();
            response.reset();

            // 设置此response为文件下载响应
            response.setContentType("application/csv;charset=UTF-8");
            response.setHeader("Content-Disposition",
                    "attachment; filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
            response.setCharacterEncoding("UTF-8");

            // 先写UTF-8文件标志头
            out.write(new byte[] {
     (byte) 0xEF, (byte) 0xBB, (byte) 0xBF });
            while ((len = in.read(buffer)) > 0) {
    
                out.write(buffer, 0, len);
            }
            out.flush();
        } catch (IOException e) {
    
            throw new RuntimeException(e);
        } finally {
    
            try {
    
                in.close();
                out.close();
            } catch (IOException e) {
    
                throw new RuntimeException(e);
            }
        }
    }
}

如果导出的文件里面存在double类型的值,在导出的时候会存在一个问题,由于数值过大,在导出的时候你的值会变成科学计数法。
具体的解决办法可以查看上一篇博客
double类型字数过长变成科学计数法

编写不易!转载请标明出处。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44210007/article/details/111683550

智能推荐

Java动态处理PDF合同模板并下载_公子_小王的博客-程序员秘密_java pdf动态模板

前期准备步骤:1、准备一份Word版的电子合同模板2、通过wps输出为PDF3、安装Adobe Acrobat DC4、通过Adobe Acrobat DC打开PDF版电子合同并选择“准备表单”5、设置域,这个域就是PDF模板供Java程序动态改值的地方(注意:域命名最好统一风格,字体、字体大小最好也保持统一。另外,多选框在未勾选的情况,通过程序赋值勾选会有问题(不能打勾),这个问题的解决办法是,先在这一步全部默认勾选上,在程序处理PDF时,将不需要打勾的...

寒假打卡总结_世界和平225的博客-程序员秘密

1.这周学习了栈方面的习题,两类不同难度的火车问题,一个模拟,一个由于数据范围,从模拟转化,运用卡特兰数(在任意前缀和中,某一元素的总和大于另一元素的总和)相关知识,说实话,很难,我也没真正掌握,大概可以用组合数表示(我认为是用画图方法解决 合法数据 = 总和 - 非法数据),另外学习了单调栈的基本处理;2.学习了队列方面的问题,其实每道题都很复杂,单独看题都要很长时间,在我看来都涉及转化,并不都是单纯的模拟,蚯蚓那道题通过利用三个队列,并且从题中得出队列单调递减的性质,同时利用一个相对值避免重复计算,

Ubuntu各个版本下载_Dreamhai的博客-程序员秘密

官网下载:https://cn.ubuntu.com/download找不到历史版本,而且下载速度很慢使用网易云镜像下载Ubuntu:添加链接描述

[No000013F]WPF学习之X名称空间详解_weixin_30425949的博客-程序员秘密

X名称空间里面的成员(如X:Name,X:Class)都是写给XAML编译器看的、用来引导XAML代码将XAML代码编译为CLR代码。4.1X名称空间里面到底都有些什么?x名称空间映射的是:http://schemas.microsoft.com/winfx/2006/xaml,望文生义,它包含的类均与解析XAML语言相关,所以亦称之为“XAML名称空间”。与C#语言一样,XAML也有...

JAVA实现下载resources下的文件_ybbgrain的博客-程序员秘密_java下载resource目录下文件

概述JAVA实现resources下的文件,本次实现的是下载一个模板文件。导入的包都是导入,ExcelUtil工具类import com.alibaba.nacos.common.utils.CollectionUtils;import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.Row;..

maven新建工程报错(could not calculate build plan:plugin)(maven received fatal alert: protocol_version)_Gutie_bartholomew的博客-程序员秘密

一、在练习使用maven做一个项目,建好父工程,再建子工程的时候给我报错了,如下图这个时候图标上也是一把叉,工程里应该有的结构文件也没有出来。图中提示内容如下:不能计算计划路径:org\apache\maven\plugins\maven-resources-plugin里的2.7或者它的一个依赖不能处理:不能读取模块描述:org\apache\maven\plugins\ma...

随便推点

javaweb服务器运行打印机制log4j的说明[在终端动态显示文件内容tailf]_城东的博客-程序员秘密

javaweb服务器运行打印机制log4j的说明原来一直使用的是System.out.println函数进行打印,但是上架的时候发现这样不行了,上架后没法看到控制台的输出了,所以这里参考别人的说明不得已引入log4j,本文摘录于:https://www.cnblogs.com/alipayhutu/archive/2012/06/21/2558249.html只是做学习备份之用,绝无抄袭之意,有疑惑请联系本人!引入步骤如下:1.添加库,并且在src目录下添加配置文件:2.配置文件内容如下:###

L19.linux命令每日一练 -- 第三章 文件过滤及内容编辑处理命令 -- tailf和cut命令_Raymond Operations的博客-程序员秘密

​ 【命令星级】 ★★★★★​ 【功能说明】​ tailf命令在工作中的主要使命就是跟踪日志文件,首先将默认输出日志文件的最后10行,然后实时地显示文件的增加内容。​ tailf命令几乎等同于tail -f,与tail -f不同的是,如果文件不增长,那么它不会去访问磁盘文件,也不会更改文件的访问时间。​ 【语法格式】​ 说明:在tailf命令及后面的选项和文件里,每个元素直接都至少要有一个空格。​ 【选项说明】​ 表3-10针对该命令的参数选项进行了说明。​ 表3-10 tailf 命令

三分钟速学linux文件传输命令_初心@[email protected]的博客-程序员秘密

文件传输一、图形界面传输工具简介二、ftp和tftp-上传下载命令三、curl-文件传输工具四、weget-专业下载工具五、fsck-系统文件检查修复环境说明:博客使用的linux版本:CentOS Linux release 7.7.1908 (Core)终端汉化:汉化是为了方便学习,点击这里查看一、图形界面传输工具简介xmanger系列软件的-xftp (不推荐这个 ,C](文件...

java auth fail_java连接zookeeper报 KeeperErrorCode = AuthFailed_黑是真谛的博客-程序员秘密

java连接zookeeper报 KeeperErrorCode = AuthFailed问题出现的环境背景及自己尝试过哪些方法zookeeper已经启动相关代码import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Properties;import kafka.consumer.C...

浅谈jquery之on()绑定事件和off()解除绑定事件_dhptkq9465的博客-程序员秘密

off()函数用于移除元素上绑定的一个或多个事件的事件处理函数。off()函数主要用于解除由on()函数绑定的事件处理函数。该函数属于jQuery对象(实例)。语法jQuery 1.7 新增该函数。其主要有以下两种形式的用法:用法一:jQueryObject.off( [ events [, selector ] [, handler ] ] )用法二:j...

matlab kmo检验,RPCL(Rival Penalized Competitive Learning)在matlab下的实现_weixin_39648824的博客-程序员秘密

RPCL是在线kmeans的改进版,相当于半自动的选取出k个簇心:一开始设定N个簇心,N&gt;k,然后聚类。每次迭代中把第二近的簇心甩开一段距离。所谓在线kmeans是就是,每次仅仅用一个样本来更新簇心位置,而不是用全部数据(“批量”)。代码:% RPCL, rival penalized competitive learning,改进版的Kmeans% 根据http://www.cs.hmc....

推荐文章

热门文章

相关标签