簡體   English   中英

使用Java從服務器下載時,Excel文件損壞

[英]Excel file get corrupted while downloading from server using java

我已經編寫了用於下載Excel文件的代碼。 從數據庫派生的文件內容。 代碼在本地計算機上運行,​​但是在服務器上部署時。 下載時Excel文件損壞。 我無法在代碼中找到問題。 請幫助我擺脫這個問題。 第一種方法導出excel,第二種方法在excelsheet中編寫內容。 第二種方法被第一種方法調用。

public static void doGetExportException(String sheetId, ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws ServletException, IOException 
{


    HttpServletResponse response = PortalUtil.getHttpServletResponse(resourceResponse);
    try 
    {
        long maxSheetId = Long.parseLong(sheetId);
        System.out.println("maxSheetId="+maxSheetId);
        List<Customer_Exception> lstCustomer_Exceptions =UploadExcelUtil.getCustomerExceptions(maxSheetId);

        XSSFWorkbook outPutSheet= writeExcelsheet(lstCustomer_Exceptions);  

        ByteArrayOutputStream outByteStream = new ByteArrayOutputStream();
        outPutSheet.write(outByteStream);
        byte [] outArray = outByteStream.toByteArray();

        String fileName = "Download_"+new Date(new java.util.Date().getTime())+".xlsx";
        response.setContentType("application/ms-excel; charset=UTF-8"); 
        response.setContentLength(outArray.length);
        response.setHeader("Expires:", "0"); 
        response.addHeader(HttpHeaders.CACHE_CONTROL, "max-age=3600, must-revalidate");
        response.addHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename="+fileName);
        response.addHeader(HttpHeaders.CONTENT_ENCODING, "Binary");
        OutputStream outStream = response.getOutputStream();
        outStream.write(outArray);
        outStream.flush();
        outStream.close();   
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

private static XSSFWorkbook writeExcelsheet(List<Customer_Exception> lstCustomer_Exceptions) {
    XSSFWorkbook workbook = new XSSFWorkbook();
    XSSFSheet sheet = workbook.createSheet("Exceptions");

    CellStyle styleHeader = workbook.createCellStyle();
    XSSFFont fontHeader = workbook.createFont();
    XSSFColor color = new XSSFColor(Color.BLACK);
    fontHeader.setColor(color);
    fontHeader.setBold(true);
    fontHeader.setFontHeight(13);
    styleHeader.setFont(fontHeader);
    sheet.createFreezePane(0, 1);
    CellStyle styleData = workbook.createCellStyle();
    XSSFFont fontData = workbook.createFont();
    fontData.setColor(color);
    fontData.setFontHeight(12);
    styleData.setFont(fontData);

    int rownum = 0;
    XSSFRow rowHeader = sheet.createRow(rownum++);
    List<String> lstCellHeaders =getCellHeaders();
    int cellnum = 0;
    for(String cellHeader:lstCellHeaders){
        XSSFCell cell = rowHeader.createCell(cellnum++);
        cell.setCellStyle(styleHeader);
        cell.setCellValue((String)cellHeader);

    }  



    for (Customer_Exception customer_Exception:lstCustomer_Exceptions) {
        List<String> lstCellValues =getCellValues(customer_Exception);
        XSSFRow rowData = sheet.createRow(rownum++);

        cellnum = 0;
        for(String cellValue:lstCellValues){
            XSSFCell cell = rowData.createCell(cellnum++);
            cell.setCellStyle(styleData);
            cell.setCellValue((String)cellValue);

        }  
    }
    return workbook;
}

對於.xlsx,您應該使用ContentType為:“ application / vnd.openxmlformats-officedocument.spreadsheetml.sheet”。 這為我解決了問題。

甚至我也被這個問題困擾了大約1周。 最后,通過使用以下代碼,我解決了該問題並獲得了excel輸出,而不會損壞它。

我是作為Maven項目來做的。

在pom.xml文件中為Super CSV Core»2.4.0添加以下依賴項

    <!-- https://mvnrepository.com/artifact/net.sf.supercsv/super-csv -->
<dependency>
    <groupId>net.sf.supercsv</groupId>
    <artifactId>super-csv</artifactId>
    <version>2.4.0</version>
</dependency>

現在將以下代碼用於您的控制器類

CSVFileDownloadController.java

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.supercsv.io.CsvBeanWriter;
import org.supercsv.io.ICsvBeanWriter;
import org.supercsv.prefs.CsvPreference;

import com.rapidvalue.master.employee.vo.Book;

@Controller
public class CSVFileDownloadController {
      @RequestMapping(value = "/downloadCSV")
        public void downloadCSV(HttpServletResponse response) throws IOException {

            String csvFileName = "books.csv";

            response.setContentType("text/csv");

            // creates mock data
            String headerKey = "Content-Disposition";
            String headerValue = String.format("attachment; filename=\"%s\"",
                    csvFileName);
            response.setHeader(headerKey, headerValue);

            Book book1 = new Book("Effective Java", "Java Best Practices",
                    "Joshua Bloch", "Addision-Wesley", "0321356683", "05/08/2008",
                    38);

            Book book2 = new Book("Head First Java", "Java for Beginners",
                    "Kathy Sierra & Bert Bates", "O'Reilly Media", "0321356683",
                    "02/09/2005", 30);

            Book book3 = new Book("Thinking in Java", "Java Core In-depth",
                    "Bruce Eckel", "Prentice Hall", "0131872486", "02/26/2006", 45);

            Book book4 = new Book("Java Generics and Collections",
                    "Comprehensive guide to generics and collections",
                    "Naftalin & Philip Wadler", "O'Reilly Media", "0596527756",
                    "10/24/2006", 27);

            List<Book> listBooks = Arrays.asList(book1, book2, book3, book4);

            // uses the Super CSV API to generate CSV data from the model data
            ICsvBeanWriter csvWriter = new CsvBeanWriter(response.getWriter(),
                    CsvPreference.STANDARD_PREFERENCE);

            String[] header = { "Title", "Description", "Author", "Publisher",
                    "isbn", "PublishedDate", "Price" };

            csvWriter.writeHeader(header);

            for (Book aBook : listBooks) {
                csvWriter.write(aBook, header);
            }

            csvWriter.close();
        }
    }

將此用作模型數據類

Book.java

public class Book {
    private String title;
    private String description;
    private String author;
    private String publisher;
    private String isbn;
    private String publishedDate;
    private float price;

    public Book() {
    }

    public Book(String title, String description, String author, String publisher,
            String isbn, String publishedDate, float price) {
        this.title = title;
        this.description = description;
        this.author = author;
        this.publisher = publisher;
        this.isbn = isbn;
        this.publishedDate = publishedDate;
        this.price = price;
    }

    // getters and setters...
}

現在在服務器上運行此代碼。 在瀏覽器中點擊網址。 您的文件將被下載,沒有任何問題。 希望這會有所幫助! :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM