zoukankan      html  css  js  c++  java
  • Java 批量下载excel,并对excel赋值,压缩为zip文件(POI版)

    package com.neusoft.nda.servlet;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.Arrays;
    import java.util.Calendar;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    import java.util.logging.Level;
    import java.util.logging.Logger;

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

    import org.apache.commons.io.FileUtils;
    import org.apache.commons.lang.StringUtils;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFFont;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.CellStyle;
    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.XSSFWorkbook;
    import org.apache.tools.zip.ZipEntry;
    import org.apache.tools.zip.ZipOutputStream;

    import com.neusoft.nda.electronicrecord.service.MediaFileServlet;
    import com.neusoft.nda.objectutils.utils.ObjectUtil;
    import com.neusoft.nda.om.constants.ActionTypeConst;
    import com.neusoft.nda.om.manager.IContainer;
    import com.neusoft.nda.om.manager.IObjectManager;
    import com.neusoft.nda.om.manager.ObjectManagerFactory;
    import com.neusoft.nda.om.manager.dto.OMContextDTO;
    import com.neusoft.nda.persistence.dataoperator.dto.ObjectDTO;
    import com.neusoft.nda.utils.utils.ToolsUtil;

    public class BeiKaoServlet extends HttpServlet{

    /**
    *
    */
    private static final long serialVersionUID = -1166903384923406516L;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {

    downloadMulti(req, resp);

    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    doPost(req, resp);
    }

    private void writeExcel(String finalXlsxPath,String id,String tempPath){

    //注释掉了我的业务逻辑,下面只是对单元格的操作

    //单元格如果没创建,则代码里创建createCell,如果已经创建,代码里改成getCell
    File finalXlsxFile = createNewFile(finalXlsxPath);//复制模板,
    Workbook workBook = null;
    try {
    workBook = getWorkbok(finalXlsxFile);
    } catch (IOException e1) {
    e1.printStackTrace();
    }
    Sheet sheet = workBook.getSheetAt(0);
    workBook.createCellStyle().setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
    workBook.createCellStyle().setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中

    //sheet 第一页
    Row row1= sheet.getRow(2);
    Cell c1=row1.getCell(6);
    c1.setCellValue("");//3行7列 



    //sheet 第2页
    Sheet sheet2 = workBook.getSheetAt(1);
    HSSFFont font1 = (HSSFFont) workBook.createFont();
    font1.setFontName("宋体");
    font1.setFontHeightInPoints((short) 10);//设置字体大小
    HSSFCellStyle cellStyle1 = (HSSFCellStyle) workBook.createCellStyle(); //卷内样式
    cellStyle1.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
    cellStyle1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
    cellStyle1.setFont(font1);//宋体10号
    cellStyle1.setWrapText(true);
    cellStyle1.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
    cellStyle1.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
    cellStyle1.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
    cellStyle1.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框

    //从4行开始
    Row rowsheet4= sheet2.createRow(k+3);
    rowsheet4.setHeight((short) (42*20));//行高

    Cell csheet=rowsheet4.createCell(0);//序号
    csheet.setCellValue("");
    csheet.setCellStyle(cellStyle1);




    //封面  sheet3
    Sheet sheet3 = workBook.getSheetAt(2);

    //样式
    HSSFCellStyle cellStyle=(HSSFCellStyle) workBook.createCellStyle();
    cellStyle.setWrapText(true); //自动换行
    HSSFFont font = (HSSFFont) workBook.createFont();
    font.setFontName("宋体");
    font.setFontHeightInPoints((short) 12);//设置字体大小
    font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示

    cellStyle.setFont(font);
    cellStyle.setIndention((short) 2);//缩进2
    cellStyle.setAlignment(CellStyle.ALIGN_LEFT);//靠左

    Row rowsheet62= sheet3.getRow(5);
    Cell csheet62=rowsheet62.getCell(1);
    csheet62.setCellValue("");//
    csheet62.setCellStyle(cellStyle);//自动换行

    FileOutputStream out = null;

    try {
    out = new FileOutputStream(tempPath + File.separator + oto1.getBean().getString("DH")+".xls");
    } catch (FileNotFoundException e2) {

    e2.printStackTrace();
    }
    try {
    workBook.write(out);
    } catch (IOException e1) {
    e1.printStackTrace();
    }
    try {
    if (out != null) {
    out.flush();
    out.close();
    }
    } catch (IOException e) {
    e.printStackTrace();
    }

    }

    /**
    * 判断excel格式版本
    *
    * @param file
    * @return
    * @throws IOException
    */
    private Workbook getWorkbok(File file) throws IOException {
    Workbook wb = null;
    FileInputStream in = new FileInputStream(file);
    if (file.getName().endsWith(".xls")) { // Excel 2003
    wb = new HSSFWorkbook(in);
    } else if (file.getName().endsWith("xlsx")) { // Excel 2007/2010
    wb = new XSSFWorkbook(in);
    }
    return wb;
    }

    private File createNewFile(String path) {
    // 读取模板,并赋值到新文件************************************************************
    // 文件模板路径
    File file = new File(path);
    if (!file.exists()) {
    System.out.println("原模板文件不存在");
    }
    // 保存文件的路径
    String realPath = file.getParent();
    // 新的文件名
    String newFileName =System.currentTimeMillis()+ ".xls";
    // 判断路径是否存在
    File dir = new File(realPath);
    if (!dir.exists()) {
    dir.mkdirs();
    }
    // 写入到新的excel
    File newFile = new File(realPath, newFileName);
    try {
    newFile.createNewFile();
    // 复制模板到新文件
    FileUtils.copyFile(file, newFile);
    } catch (Exception e) {
    e.printStackTrace();
    }
    return newFile;
    }
    /**
    *
    * <p>下载多个文件</p>
    *
    * @comment [注释说明]
    * @author yu-b, 2013-1-9
    * @since NDAS 2.0
    *
    * @param request
    * @param response
    * @throws IOException
    */

    private void downloadMulti(HttpServletRequest request,
    HttpServletResponse response) throws IOException
    {
    String sourcePath = getServletContext().getRealPath("/WEB-INF/")
    + "/conf/ExcelModel/beikao.xls"; // 读取Excel文档      //用自己本地的路径
    String id = request.getParameter("id");
    String[] idsArr = id.split("_");
    List<String> ids = Arrays.asList(idsArr);
    // 下载文件名
    String downFileName = "download.zip";
    // 生成缓存文件夹名
    String sesstionId = request.getSession().getId();
    String tempPath = ToolsUtil.getRealPath("platform" + File.separator
    + "seasplatform" + File.separator
    + sesstionId + File.separator + Calendar.getInstance().getTimeInMillis());
    File tempFile = new File(tempPath);

    if (!tempFile.exists())
    {
    tempFile.mkdirs();
    }
    OutputStream respOut = response.getOutputStream();

    response.setCharacterEncoding("utf-8");
    response.setHeader("Content-Disposition", "attachment; filename=""
    + new String(downFileName.getBytes(), "ISO-8859-1") + """);// 解决中文乱码问题
    // 设置响应头和下载保存的文件名
    String mimeType = null;
    mimeType = this.getServletContext().getMimeType("zip");
    if (StringUtils.isEmpty(mimeType))
    {
    mimeType = "APPLICATION/OCTET-STREAM";
    }
    response.setContentType(mimeType);

    for(String objectId : ids)
    {

    writeExcel(sourcePath, objectId, tempPath);
    }
    creasteZip(new File(tempPath), respOut);
    try
    {
    deleteFile(new File(tempPath));
    respOut.flush();
    respOut.close();
    }
    catch (IOException ex)
    {
    ex.printStackTrace();
    }
    }


    /**
    * 递归删除文件夹
    *
    * @param file
    * @return void
    */
    private void deleteFile(File file)
    {
    if (file.exists())
    {// 判断文件是否存在
    if (file.isFile())
    {// 判断是否是文件
    file.delete();// 删除文件
    }
    else if (file.isDirectory())
    {// 否则如果它是一个目录
    File[] files = file.listFiles();// 声明目录下所有的文件 files[];
    for (int i = 0; i < files.length; i++)
    {// 遍历目录下所有的文件
    deleteFile(files[i]);// 把每个文件用这个方法进行迭代
    }
    file.delete();// 删除文件夹
    }
    }
    else
    {
    System.out.println("所删除的文件不存在");
    }
    }



    /**
    * 压缩文件或者文件目录到指定的zip或者rar包
    *
    * @param inputFile 参数为文件类型的要压缩的文件或者文件夹
    * @param out 输出流
    * @return void
    */
    private synchronized void creasteZip(File inputFile, OutputStream resOut)
    {
    ZipOutputStream out = null;
    try
    {
    out = new ZipOutputStream(resOut);
    out.setEncoding("gbk");
    zip(inputFile, out, "");
    }
    catch (IOException e)
    {
    }
    finally
    {
    try
    {
    out.close();
    }
    catch (IOException ex)
    {
    Logger.getLogger(MediaFileServlet.class.getName()).log(Level.SEVERE, null, ex);
    }
    }
    }




    /**
    * 压缩文件或者文件目录到指定的zip或者rar包
    *
    * @param inputFile 参数为文件类型的要压缩的文件或者文件夹
    * @param out 输出流
    * @param base 基文件夹
    * @return void
    */
    private synchronized void zip(File inputFile, ZipOutputStream out, String base) throws IOException
    {
    if (inputFile.isDirectory())
    {
    File[] inputFiles = inputFile.listFiles();
    out.putNextEntry(new ZipEntry(base + "/"));
    base = base.length() == 0 ? "" : base + "/";
    for (int i = 0; i < inputFiles.length; i++)
    {
    zip(inputFiles[i], out, base + inputFiles[i].getName());
    }
    }
    else
    {
    if (base.length() > 0)
    {
    out.putNextEntry(new ZipEntry(base));
    }
    else
    {
    out.putNextEntry(new ZipEntry(inputFile.getName()));
    }
    FileInputStream in = new FileInputStream(inputFile);
    try
    {
    int c;
    byte[] by = new byte[1024];
    while ((c = in.read(by)) != -1)
    {
    out.write(by, 0, c);
    }
    }
    catch (IOException e)
    {
    }
    finally
    {
    in.close();
    }
    }
    }

    }

  • 相关阅读:
    使用 Rust 编写更快的 React 组件
    快速入门 postcss 插件:自动转换 px 到 rem
    通过实战理解CPU上下文切换
    “web资源加载优先级”原来能这么精准控制
    使用Brotli提高网站访问速度
    使用 npm shrinkwrap 来管理项目依赖
    如何用“底层逻辑”,看清世界的底牌?
    Node.js 应用全链路追踪技术——全链路信息获取
    解决 Elastic Search 的深分页问题
    Whistle 实现原理 —— 从 0 开始实现一个抓包工具
  • 原文地址:https://www.cnblogs.com/woshuaile/p/9970344.html
Copyright © 2011-2022 走看看