为了账号安全,请及时绑定邮箱和手机立即绑定

使用 POI 下载的文件已损坏,并且不使用弹出窗口存储数据

使用 POI 下载的文件已损坏,并且不使用弹出窗口存储数据

LEATH 2022-03-10 21:39:25
  import java.io.File;    import java.io.FileOutputStream;    import java.io.IOException;    import java.util.Arrays;    import java.util.List;    import javax.servlet.ServletException;    import javax.servlet.http.HttpServlet;    import javax.servlet.http.HttpServletRequest;    import javax.servlet.http.HttpServletResponse;    import org.apache.poi.hssf.usermodel.HSSFWorkbook;    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.XSSFWorkbook;    public class ExcelWriter extends HttpServlet {        private void writeExcel(List<Book> listBook, String excelFilePath)                throws IOException {            Workbook workbook = getWorkbook(excelFilePath);            Sheet sheet = workbook.createSheet();            int rowCount = 0;            for (Book aBook : listBook) {                Row row = sheet.createRow(++rowCount);                writeBook(aBook, row);            }            try (FileOutputStream outputStream = new FileOutputStream(new File(                    excelFilePath))) {                workbook.write(outputStream);            }        }        private void writeBook(Book aBook, Row row) {            Cell cell = row.createCell(1);            cell.setCellValue(aBook.getTitle());            cell = row.createCell(2);            cell.setCellValue(aBook.getAuthor());            cell = row.createCell(3);            cell.setCellValue(aBook.getPrice());        }因此,在 ExcelWriter 文件中,按照指定文件应下载到指定的文件路径。浏览器中会生成一个弹出窗口,但打开的 Excel 文件已损坏,并且未存储硬编码数据。另一方面,数据位于指定位置的 Excel 文件中,不会出现在弹出窗口中,并且 EXCEL 文件处于兼容模式。
查看完整描述

1 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

尝试这个:


public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {


        try {

            ExcelWriter excelWriter = new ExcelWriter();

            List<Book> listBook = excelWriter.getListBook();

            excelWriter.writeExcel(listBook, excelFilePath);

            System.out.println("Excel file written successfully");


            String excelFilePath = "C:\\Users\\A7369241\\Desktop\\Temp.xls";

            response.setContentType("application/octet-stream");

            response.setHeader("Content-Disposition", "attachment;filename=temp.xls");


            OutputStream out = response.getOutputStream();

            try (FileInputStream in = new FileInputStream(file)) {

                byte[] buffer = new byte[4096];

                int length;

                while ((length = in.read(buffer)) > 0) {

                    out.write(buffer, 0, length);

                }

            }

            out.flush();


        } catch (Exception e) {

            System.out.println(e.getMessage());

        }

    }

如果您只想创建 excel,则无需使用响应。并且文件名应该是 xlsx 类型。这就是您收到兼容模式消息的原因。


try {

            String excelFilePath = "C:\\Users\\A7369241\\Desktop\\Temp.xlsx";

            ExcelWriter excelWriter = new ExcelWriter();

            List<Book> listBook = excelWriter.getListBook();

            excelWriter.writeExcel(listBook, excelFilePath);

            System.out.println("Excel file written successfully");

        } catch (Exception e) {

            System.out.println(e.getMessage());

        }

如果您仍然有问题,则意味着您的 servlet 无法正常工作。只需尝试使用 main 方法和 main 方法类型创建类:


String excelFilePath = "D:\\Temp.xls";

Test excelWriter = new Test();

List<Book> listBook = excelWriter.getListBook();

try {

    excelWriter.writeExcel(listBook, excelFilePath);

    System.out.println("Excel file written successfully");

} catch (IOException e) {

    e.printStackTrace();

}


查看完整回答
反对 回复 2022-03-10
  • 1 回答
  • 0 关注
  • 232 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信