老师,我点击导出后,下载的文件没有后缀名,打开直接损坏了!

老师,我点击导出后,下载的文件没有后缀名,打开直接损坏了!

package com.imooc.servlet;

import com.imooc.entity.Student;
import com.imooc.service.ExcelService;
import org.apache.poi.ss.usermodel.Workbook;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet(name = "ExportExcelServlet", urlPatterns = "/exportExcel")
public class ExportExcelServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ExcelService excelService = new ExcelService();
        List<Student> studentList = excelService.redExcel("c:/upload/Student.xlsx");
        Workbook workbook = excelService.exportExcel(false, studentList);
        response.setHeader("Context-Disposition", "attachment;filename=Students.xlsx");
        ServletOutputStream outputStream = response.getOutputStream();
        workbook.write(outputStream);
        outputStream.flush();
        outputStream.close();
        workbook.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
package com.imooc.service;

import com.imooc.dto.ImportExcelParamDto;
import com.imooc.entity.Student;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class ExcelService {
    /**
     * 读取上传的Excel文件
     *
     * @param dto(上传的参数对象)
     * @return 返回上传文件中的数据对象
     */
    public List<Student> redExcel(ImportExcelParamDto dto) {
        List<Student> impStudentList = new ArrayList<>();
        Workbook workbook = null;
        try {
            //获取上传的Excel文件输入流,并将其传给workbook
            workbook = WorkbookFactory.create(dto.getFile().getInputStream());
            //获得Excel文件的第一个sheet
            Sheet sheet = workbook.getSheetAt(0);
            //获得Sheet下的最后一个有效行
            int rowNum = sheet.getLastRowNum();
            //循环遍历所有有效行数中的单元格,获得单元格中的数据
            for (int i = 1; i <= rowNum; i++) {
                Row row = sheet.getRow(i);
                String name = row.getCell(0).getStringCellValue();
                int age = (int) row.getCell(1).getNumericCellValue();
                Date date = row.getCell(2).getDateCellValue();
                //将获取的数据封装成对象
                Student st = new Student(name, age, date);
                //将封装的对象添加到List中
                impStudentList.add(st);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (workbook != null) {
            try {
                workbook.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return impStudentList;
    }

    /**
     * 读取服务器本地的Excel文件
     *
     * @param FILE_PATH(服务器本地文件路径)
     * @return 读取到的数据对象集合
     */
    public List<Student> redExcel(String FILE_PATH) {
        List<Student> stList = new ArrayList<>();
        Workbook workbook = null;
        try {
            //获取上传的Excel文件输入流,并将其传给workbook
            workbook = WorkbookFactory.create(new File(FILE_PATH));
            //获得Excel文件的第一个sheet
            Sheet sheet = workbook.getSheetAt(0);
            //获得Sheet下的最后一个有效行
            int rowNum = sheet.getLastRowNum();
            //循环遍历所有有效行数中的单元格,获得单元格中的数据
            for (int i = 1; i <= rowNum; i++) {
                Row row = sheet.getRow(i);
                String name = row.getCell(0).getStringCellValue();
                int age = (int) row.getCell(1).getNumericCellValue();
                Date date = row.getCell(2).getDateCellValue();
                //将获取的数据封装成对象
                Student st = new Student(name, age, date);
                //将封装的对象添加到List中
                stList.add(st);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (workbook != null) {
                try {
                    workbook.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return stList;
    }

    /**
     * 将读取到的上传数据写入到服务器本地的Excel
     *
     * @param FILE_PATH      服务器本地Excel路劲
     * @param impStudentList 要写入到Excel中的数据
     */
    public Workbook writeExcel(String FILE_PATH, List<Student> impStudentList) {
        Workbook workbook = null;
        InputStream fileInputStream = null;
        if (impStudentList != null) {
            try {
                fileInputStream = new FileInputStream(new File(FILE_PATH));
                workbook = WorkbookFactory.create(fileInputStream);
                Sheet sheet = workbook.getSheetAt(0);
                int lastRowNum = sheet.getLastRowNum();
                int index = 0;
                for (int i = lastRowNum + 1; i <= lastRowNum + impStudentList.size(); i++) {
                    Row row = sheet.createRow(i);
                    Student st = impStudentList.get(index);
                    row.createCell(0).setCellValue(st.getName());
                    row.createCell(1).setCellValue(st.getAge());
                    row.createCell(2).setCellValue(st.getDate());
                    index++;
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (fileInputStream != null) {
                    try {
                        fileInputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return workbook;
    }

    /**
     * 创建新的Excel提供下载
     * @param excelVersion excel版本
     * @param impStudentList 要写到Excel中的数据
     * @return Workbook对象
     */
    public Workbook exportExcel(boolean excelVersion, List<Student> impStudentList) {
        Workbook workbook = null;
        if (excelVersion) {
            workbook = new XSSFWorkbook();
        } else {
            workbook = new HSSFWorkbook();
        }
        Sheet sheet = workbook.createSheet();
        int lastRowNum = sheet.getLastRowNum();
        int index = 0;
        for (int i = lastRowNum + 1; i <= lastRowNum + impStudentList.size(); i++) {
            Row row = sheet.createRow(i);
            Student st = impStudentList.get(index);
            row.createCell(0).setCellValue(st.getName());
            row.createCell(1).setCellValue(st.getAge());
            row.createCell(2).setCellValue(st.getDate());
            index++;
        }
        return workbook;
    }
}

我的需求是这样的,在页面点击导出Excel的按钮,跳转到导出界面,界面显示的是我服务器本地一个Excel中的数据,然后点击“导出”,后台去服务器本地查找到这个Excel文件然后将他的写入一个Excel文件中(这个新建的Excel不在本地进行保存)然后将这个Excel文件提供用户下载!

问题,我下载出来的文件没有后缀名,而且文件名和我自己定义的也不一样,请老师帮忙看看!

http://img1.sycdn.imooc.com//climg/5cf498ac000173a204560059.jpg

http://img1.sycdn.imooc.com//climg/5cf498d10001cfff04060634.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学这里传的是false

http://img1.sycdn.imooc.com//climg/5cf4cdcb0001064706060119.jpg

创建的是xls的呢

http://img1.sycdn.imooc.com//climg/5cf4cde70001c17d05250136.jpg

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

好帮手慕柯南 2019-06-03 14:40:20

同学你好!同学的单词拼写有误呢,同学将Content-Disposition拼写成了Context-Disposition,改过来就可以了呢

http://img1.sycdn.imooc.com//climg/5cf4c0a000010e5709290083.jpg

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

  • 提问者 China_Wang #1
    修改后下载正常了,可是打开文件的时候显示“Excel无法打开文件“Students.xlsx”,因为文件格式或文件扩展名无效,请确定文件未损坏,并且文件扩展名与文件格式匹配”
    2019-06-03 14:54:08
  • 好帮手慕柯南 回复 提问者 China_Wang #2
    同学生成的是xls文件呢,建议同学把文件的后缀改为xls。祝学习愉快~
    2019-06-03 15:07:31
  • 提问者 China_Wang 回复 好帮手慕柯南 #3
    修改之后好了,但是有点不明白,这是为什么呢?明明07版以上的Excel文件名都是.xlsx,为什么这个地方要这样修改呢?
    2019-06-03 15:33:15
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
从网页搭建入门Java Web2018版
  • 参与学习           人
  • 提交作业       1088    份
  • 解答问题       10205    个

如果你有Java语言基础,又想以后从事Java Web开发,那么本路径是你的不二选择!本路径从网页搭建开始入手,通过大量案例来学习Java Web基础。定能助你完成Java Web小白的蜕变!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师