`
bosschen
  • 浏览: 197165 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Java 压缩Excel文件生成.zip文件

 
阅读更多

以下第一种方法转自:https://www.iteye.com/blog/zhouhaitao-1864743

 

首先创建文件目录,然后生成Excel文件到创建的目录下,

通过IO流压缩Excel文件成zip文件 到指定目录,最后删除指定目录下所有的Excel文件。

 

具体代码如下:

package pack.java.io.demo;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

/**
 * zip压缩文件实例
 * add by 周海涛
 * @author Administrator
 *
 */
public class ZipDemo {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws WriteException 
	 * @throws RowsExceededException 
	 */
	public static void main(String[] args) throws RowsExceededException, WriteException, IOException {
		String path = "C:/document/excel";
		//创建文件夹;
		createFile(path);
		//创建Excel文件;
		createExcelFile(path);
		//生成.zip文件;
		craeteZipPath(path);
		//删除目录下所有的文件;
		File file = new File(path);
		//删除文件;
		deleteExcelPath(file);
		//重新创建文件;
		file.mkdirs();
	}
	
	/**
	 * 创建文件夹;
	 * @param path
	 * @return
	 */
	public static String createFile(String path){
		File file = new File(path);
		//判断文件是否存在;
		if(!file.exists()){
			//创建文件;
			boolean bol = file.mkdirs();
			if(bol){
				System.out.println(path+" 路径创建成功!");
			}else{
				System.out.println(path+" 路径创建失败!");
			}
		}else{
			System.out.println(path+" 文件已经存在!");
		}
		return path;
	}
	
	/**
	 * 在指定目录下创建Excel文件;
	 * @param path
	 * @throws IOException 
	 * @throws WriteException 
	 * @throws RowsExceededException 
	 */
	public static void createExcelFile(String path) throws IOException, RowsExceededException, WriteException{
		for(int i =0;i<3;i++){
			//创建Excel;
			WritableWorkbook workbook = Workbook.createWorkbook(new File(path+"/" + new SimpleDateFormat("yyyyMMddHHmmsss").format(new Date() )+"_"+(i+1)+".xls"));
			//创建第一个sheet文件;
			WritableSheet sheet = workbook.createSheet("导出Excel文件", 0);
			//设置默认宽度;
			sheet.getSettings().setDefaultColumnWidth(30);
			
			//设置字体;
			WritableFont font1 = new WritableFont(WritableFont.ARIAL,14,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,Colour.RED);

			WritableCellFormat cellFormat1 = new WritableCellFormat(font1);
			//设置背景颜色;
			cellFormat1.setBackground(Colour.BLUE_GREY);
			//设置边框;
			cellFormat1.setBorder(Border.ALL, BorderLineStyle.DASH_DOT);
			//设置自动换行;
			cellFormat1.setWrap(true);
			//设置文字居中对齐方式;
			cellFormat1.setAlignment(Alignment.CENTRE);
			//设置垂直居中;
			cellFormat1.setVerticalAlignment(VerticalAlignment.CENTRE);
			//创建单元格
			Label label1 = new Label(0, 0, "第一行第一个单元格(测试是否自动换行!)",cellFormat1);
			Label label2 = new Label(1, 0, "第一行第二个单元格",cellFormat1);
			Label label3 = new Label(2, 0, "第一行第三个单元格",cellFormat1);
			Label label4 = new Label(3, 0, "第一行第四个单元格",cellFormat1);
			//添加到行中;
			sheet.addCell(label1);
			sheet.addCell(label2);
			sheet.addCell(label3);
			sheet.addCell(label4);
			
			//给第二行设置背景、字体颜色、对齐方式等等;
			WritableFont font2 = new WritableFont(WritableFont.ARIAL,14,WritableFont.NO_BOLD,false,UnderlineStyle.NO_UNDERLINE,Colour.BLUE2);
			WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
			cellFormat2.setAlignment(Alignment.CENTRE);
			cellFormat2.setBackground(Colour.PINK);
			cellFormat2.setBorder(Border.ALL, BorderLineStyle.THIN);
			cellFormat2.setWrap(true);

			//创建单元格;
			Label label11= new Label(0,  1, "第二行第一个单元格(测试是否自动换行!)",cellFormat2);
			Label label22 = new Label(1, 1, "第二行第二个单元格",cellFormat2);
			Label label33 = new Label(2, 1, "第二行第三个单元格",cellFormat2);
			Label label44 = new Label(3, 1, "第二行第四个单元格",cellFormat2);

			sheet.addCell(label11);
			sheet.addCell(label22);
			sheet.addCell(label33);
			sheet.addCell(label44);

			//写入Excel表格中;
			workbook.write();
			//关闭流;
			workbook.close();
		}
	}
	
	/**
	 * 生成.zip文件;
	 * @param path
	 * @throws IOException 
	 */
	public static void craeteZipPath(String path) throws IOException{
		ZipOutputStream zipOutputStream = null;
		File file = new File(path+new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+".zip");
		zipOutputStream = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
		File[] files = new File(path).listFiles();
		FileInputStream fileInputStream = null;
		byte[] buf = new byte[1024];
		int len = 0;
		if(files!=null && files.length > 0){
			for(File excelFile:files){
				String fileName = excelFile.getName();
				fileInputStream = new FileInputStream(excelFile);
				//放入压缩zip包中;
				zipOutputStream.putNextEntry(new ZipEntry(path + "/"+fileName));
				
				//读取文件;
				while((len=fileInputStream.read(buf)) >0){
					zipOutputStream.write(buf, 0, len);
				}
				//关闭;
				zipOutputStream.closeEntry();
				if(fileInputStream != null){
					fileInputStream.close();
				}
			}
		}
		
		if(zipOutputStream !=null){
			zipOutputStream.close();
		}
	}
	
	/**
	 * 删除目录下所有的文件;
	 * @param path
	 */
	public static boolean deleteExcelPath(File file){
		String[] files = null;
		if(file != null){
			files = file.list();
		}
		
		if(file.isDirectory()){
			for(int i =0;i<files.length;i++){
				boolean bol = deleteExcelPath(new File(file,files[i]));
				if(bol){
					System.out.println("删除成功!");
				}else{
					System.out.println("删除失败!");
				}
			}
		}
		return file.delete();
	}
}

 

 

另一种方法:

//测试  http://localhost:8080/admin/test/test/poizip
    @RequestMapping(value = "/poizip")
    public void poizip(HttpServletResponse response) throws IOException {
        //response 输出流
        ServletOutputStream out = response.getOutputStream();
        //压缩输出流
        ZipOutputStream zipOutputStream = new ZipOutputStream(out);
        try {
            for (int i = 0; i < 6; i++) {
                //创建工作簿
                HSSFWorkbook wb = new HSSFWorkbook();
                HSSFSheet sheet = wb.createSheet("sheet" + i);
                HSSFRow row = sheet.createRow(0);
                HSSFCell cell = row.createCell(0);
                cell.setCellValue("内容" + i);
                response.setContentType("application/octet-stream; charset=utf-8");
                response.setHeader("Content-Disposition", "attachment; filename=" + Encodes.urlEncode("测试.zip"));
                //重点开始,创建压缩文件
                ZipEntry z = new ZipEntry(i + ".xls");
                zipOutputStream.putNextEntry(z);
                //写入一个压缩文件
                wb.write(zipOutputStream);
            }
            zipOutputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //注意关闭顺序,否则可能文件错误
            if (zipOutputStream != null) {
                zipOutputStream.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }

 

 

第三种方法:

@ResponseBody
    @RequestMapping(value = "/xxx")
    public BaseResp unDirectExport(Date date, HttpServletResponse response) throws Exception {
        String fileName = xxx;
        ResponseUtil.setMultipartHeader(response, fileName);
        List<T> list = xxxService.query(xx);
      
        //按某个条件分组
        Map<String, List<T>> map = list.stream().collect(Collectors.groupingBy(T::getXXX));
        exportExcel(response, map);
        return BaseResp.succResp();
    }

    private void exportExcel(HttpServletResponse response, Map<String, List<T>> map) throws IOException {
        //Excel sheet 标题
        String[] headers = {""};
        ServletOutputStream outputStream = response.getOutputStream();
        ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);
        try {
            map.forEach((k, v) -> {
                //新建一个Excel 并设置下sheet头
                HSSFWorkbook workbook = createExcelAndSetHeaders(headers, k);
                //向sheet中 继续填充对象的数据
                setSheetCellValue(workbook.getSheet(k), v);
                try {
                    //重点开始,创建压缩文件
                    ZipEntry zipEntry = new ZipEntry(k + ".xls");
                    zipOutputStream.putNextEntry(zipEntry);
                } catch (IOException e) {
                    logger.error("向XXX压缩包中添加Excel失败");
                    throw new Exception("向XXX压缩包中添加Excel失败");
                }
                try {
                    //写入一个压缩文件
                    workbook.write(zipOutputStream);
                } catch (IOException e) {
                    logger.error("向zipOutputStream中写入流数据失败");
                    throw new Exception("向zipOutputStream中写入流数据失败");
                }
            });
            zipOutputStream.flush();
        } catch (Exception e) {
            //重复丢出异常,有点多余,但是为了套上try catch finally 关闭数据流
            logger.error("导XXX失败,原因" + e.getErrorCode());
            throw new Exception("导出XXX结算数据失败,原因:" + e.getErrorCode());
        } finally {
            //关闭数据流,注意关闭的顺序
            zipOutputStream.close();
            outputStream.close();
        }
    }

    private HSSFWorkbook createExcelAndSetHeaders(String[] headers, String sheetName) {
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
        HSSFSheet hssfSheet = hssfWorkbook.createSheet(sheetName);
        HSSFRow row0 = hssfSheet.createRow(0);
        for (int i = 0; i < headers.length; i++) {
            HSSFCell cellHeader = row0.createCell(i);
            cellHeader.setCellValue(headers[i]);
        }
        return hssfWorkbook;
    }

    private void setSheetCellValue(HSSFSheet hssfSheet, List<T> dtos) {
        for (T dto : dtos) {
            //从当前sheet页的最后一行后新增一行,开始填充数据
            HSSFRow row = hssfSheet.createRow(hssfSheet.getLastRowNum() + 1);
            int count = -1;
            row.createCell(++count).setCellValue(dto.getXXX);
            row.createCell(++count).setCellValue(dto.getXXX);
            row.createCell(++count).setCellValue(dto.getXXX);
            row.createCell(++count).setCellValue(dto.getXXX);
            row.createCell(++count).setCellValuedto.getXXX);
        }
    }

 

import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

/**
 * @author zhaojq
 * @email zhaojq@tsintergy.com
 * @date 2019 2019/10/14 17:11
 */
public class ResponseUtil {

    private ResponseUtil() {
    }
    public static void setMultipartHeader(HttpServletResponse response, String fileName)    {
        try {
            response.setCharacterEncoding("utf-8");
            response.setContentType("multipart/form-data");
            response.setHeader("Content-Disposition", "attachment;filename*=UTF-8''" + URLEncoder.encode(fileName, "UTF-8"));
        } catch (UnsupportedEncodingException e) {
            throw new BusinessException("文件名编码异常");
        }
    }
}

 

分享到:
评论

相关推荐

    java中将多个excel打包成zip文件下载.rar

    在上述`createZipFile()`方法中,按照前面所述的步骤生成ZIP文件。 3. **设置HTTP响应头**: `Content-Disposition`头用于设置浏览器如何处理文件,`attachment`表示附件下载,`filename`指定文件名。 4. **返回...

    easyexcel,Java Java Excel中的.zip

    3. 无模板写Excel:EasyExcel支持无模板写Excel,只需提供数据列表,即可生成符合格式的Excel文件。 4. 支持复杂数据结构:除了基础的二维数据外,EasyExcel还支持多层嵌套的数据结构,如Map、List等。 5. 事件...

    NativeExcel2Demo.zip.zip

    标题中的"NativeExcel2Demo.zip.zip"表明这是一个压缩文件,其中包含了一个名为"NativeExcel2Demo.zip"的子压缩包。通常,这种双重压缩可能是为了节省存储空间或提高传输效率。在处理这样的文件时,我们需要先解压...

    excel生成Java源代码.zip

    标题“excel生成Java源代码.zip”表明这是一个包含Java程序的压缩包,这些程序可能用于读取、处理或生成Excel文件。在Java开发中,与Excel交互是一项常见的任务,例如数据分析、报表生成或数据导入导出。这个压缩包...

    java导出30万数据量的excel(采用生成多个excel,最后打包zip)

    6. **HTTP下载优化**: 在服务器端生成ZIP文件后,应考虑HTTP响应头的设置,如设置“Content-Disposition”为“attachment”,提示浏览器以附件形式下载;“Content-Type”设置为“application/zip”,表明文件类型为...

    java 实现Excel压缩成Zip导出.docx

    Java 实现 Excel 压缩成 Zip 导出 Java 是一种广泛使用的编程语言,具有强大的功能和灵活性。在 Web 项目中,经常需要将数据导出为 Excel 文件,以便用户可以轻松地查看和编辑数据。然而,当需要导出多个 Excel ...

    java POI生成word.zip

    在本案例中,"java POI生成word.zip"是一个压缩包,包含使用Java POI库生成Word文档的示例代码。以下是基于这个主题的相关知识点: 1. **Java POI库介绍** - Java POI 是一套API,用于处理Microsoft Office格式的...

    多个excel导出压缩成zip 文件 数据量大导出

    "多个Excel导出压缩成zip文件"的场景通常是为了解决数据量过大导致的文件管理不便、传输效率低以及存储空间占用过多等问题。下面我们将深入探讨这个话题,主要涵盖以下几个方面: 1. **大数据量导出**: - 当数据...

    生成excel并打包成zip文件

    综上所述,"生成excel并打包成zip文件"这个任务涉及到使用Java编程语言,特别是Apache POI库来生成Excel文件,再结合Java标准库的压缩功能将Excel和文本文件打包成ZIP。整个过程涉及到了文件的创建、写入、压缩和...

    java后台批量下载文件并压缩成zip下载的方法

    Java后台批量下载文件并压缩成zip下载的方法 Java后台批量下载文件并压缩成zip下载的方法是指在Java后台中批量下载文件,并将其压缩成zip文件下载到本地桌面。该方法具有重要的参考价值,感兴趣的小伙伴们可以参考...

    jxl方式生成excel表格.zip

    在提供的压缩包文件"jxl方式生成excel表格.zip"中,应该包含了这个示例项目的源代码和相关的jar包。通过分析和运行这些代码,开发者可以更好地理解和学习如何在Java中利用jxl库生成Excel表格。这有助于提高在实际...

    java.Spire.Xls.zip

    标题"java.Spire.Xls.zip"暗示了这是一个包含Java Spire XLS库的压缩文件,通常这样的文件会提供库的jar包,以便于Java开发者在项目中引用。"java.Spire.Xls.jar"是压缩包内的主要文件,它是Java Spire XLS库的可...

    poi多线程大数据导出excel文件.zip

    Apache POI是一个流行的Java库,它允许开发者创建、修改和显示Microsoft Office格式的文件,包括Excel。本项目“poi多线程大数据导出excel文件”提供了一个解决方案,利用多线程来提高Excel的大数据导出效率。 ...

    java将数据导入多个excel并压缩,亲测可用

    综上所述,实现“java将数据导入多个excel并压缩”的功能需要对Java的文件操作、Excel处理、文件压缩以及Web开发有深入的理解。通过Apache POI库处理Excel,结合Java内置的压缩API,我们可以创建一个高效且可扩展的...

    java动态导出excel压缩成zip下载的方法

    压缩excel文件 使用ZipOutputStream可以将excel文件压缩成zip格式。首先,创建一个ZipOutputStream对象,然后将excel文件写入到其中。例如,下面的代码将excel文件压缩成zip格式,并将其下载到客户端。 ```java ...

    excel-tools.zip

    标题“excel-tools.zip”指的是一个包含与Excel工具相关的压缩文件,该文件可能是一个软件库或者一组脚本,目的是在Java环境中模拟和处理Excel函数。这个压缩包的核心功能是通过一个所谓的“表达式引擎”来解析和...

    jxl.zip_excel_jxl_jxl.biff.drawing.dg_jxl.biff.drawingdg

    "jxl.zip"指的是包含JXL库的压缩文件,它是一个Java库,用于处理Excel文件。"jxl.biff.drawing.dg"和"jxl.biff.drawingdg"则涉及到Excel文件内部的结构,BIFF(Binary Interchange File Format)是Excel的二进制文件...

    Excel导出程序集.zip

    "Excel导出程序集.zip"是一个包含用于C#编程语言导出Excel文件所需组件的压缩包。这个压缩包主要包括两个关键文件:NPOI.dll和NPOI.OOXML.dll,它们都是NPOI库的不同组成部分,专门用于与Microsoft Excel文件格式...

    Excel2Flatbuffers.zip

    压缩包子文件“Excel2Flatbuffers-master”很可能是一个GitHub项目的克隆,包含了源代码、示例、文档等资源。用户可以通过克隆或下载这个项目来利用提供的工具进行转换操作。在实际使用中,用户可能需要先将Excel...

    java excel 读取 用 zip 方式。不用第三方包

    /** * 根据 策划的配置表来生成 json * excel 目前使用的版本为2007,其他版本未测试... * 读取文件 一般用于本地文件的生成, * 二进制的方式,一般用于 后台管理界面 的文件上传后的处理。 * @author wgq * */

Global site tag (gtag.js) - Google Analytics